`

XDoclet基本任务手册

阅读更多
任何人都想过自动生成的代码,自己去写个分析器不是件容易的事,而XDoclet给我们机会建立自己的代码生成器。


XDoclet最早用来对付EJB,因为生成EJB的本地和远程接口以及对应的HOME和描述符是一件简单但是枯燥的事,本来我以为,只有JBuilder这样的集成编辑器可以很好的简化工作,后来知道XDoclet也能够完成得不错。



我最早用XDoclet是因为学习hibernate,hibetnate的描述文件并不复杂,关键的部分不多,可是一旦对POJO修改,就必须要劳师动众的找到对应的描述符来修改,增加了一次出错的机会,而使用了XDoclet就可以做到同步的修改。



还有就是struts,首先是配置文件,许多人操作同一个文件会产生冲突,有了XDoclet我们就不怕了,还有validate文件也一样,有了XDoclet就会解决大部分冲突问题。



之所以起这么一个名字,主要因为XDoclet和Ant结合得很紧,尽管实际上做的工作并没有直接的联系,但XDoclet除了Ant接口就只有些Maven接口插件了,所以XDoclet几乎是完全依赖Ant的。










本篇文章的目录结构如下,因为只是为了说明问题,在我的ant的build文件中并没有包括路径名的引用,一切是直接的方式。

├─classes

├─doc

├─gen

├─lib

│commons-collections-2.1.jar

│commons-logging-1.0.3.jar

│commons-validator.jar

│log4j-1.2.8.jar

│servlet.jar

│struts.jar

│xdoclet-1.2.1.jar

│xdoclet-apache-module-1.2.1.jar

│xdoclet-ejb-module-1.2.1.jar

│xdoclet-hibernate-module-1.2.1.jar

│xdoclet-web-module-1.2.1.jar

│xdoclet-xdoclet-module-1.2.1.jar

│xjavadoc-1.0.3.jar

├─merge

├─src

├─todo

└─web



只列出lib中的文件,每一个的作用在后面慢慢描述。



build.xml

开头增加

<path id="xdoclet.classpath">

<fileset dir="lib">

<include name="*.jar"/>

</fileset>

<pathelement location="classes"/>

</path>

**************************************************************************************************



1,最简单的todolist



每一篇讲XDoclet都送这里开始,有很多原因的。XDoclet的灵感来自JavaDoc,JavaDoc把文档写在代码里,缓解了困扰编程领 域多年的文档与程序同步问题。这里有个很有趣的事,就是UNIX业界的人们传递下来这样一个传统,就是代码是最好的文档,保持文档的同步实在是费力不讨好 的事,所以他们提出这样一个好主意,不过JavaDoc更聪明,文档是程序注释的一部分,而且可以提取出来。



来吧,看这个任务。

<target name="todolist" description="todolist">

<taskdef name="documentdoclet" classname="xdoclet.modules.doc.DocumentDocletTask" classpathref="xdoclet.classpath"/>

<documentdoclet destdir="todo" >

<fileset dir="src">

<include name="**/*.java" />

</fileset>

<info header="Todo list" projectname="XDoclet in Action" tag="todo"/>

</documentdoclet>

</target>



然后src写这么一个文件

package xdoclet;



public class TodoListTest {

/**

* @todo 我有许多工作要做,只是测试,忽略吧

*/

public TodoListTest() {

}



/**

* @todo 我还不知道名字,只是测试,忽略吧

*

*/

public String getYourName(){

return null;

}

}



注意要按照javadoc的写法。还要注意ant中的子任务系统,其中info就是我们定义的documentdoclet任务的子任务,我们以后会看到很多类似的情况.

然后运行ant todolist

结果就是一个结构类似javadoc,但是只包括todo标签的html文档,呵呵,可以看看项目里有哪些待办的事。











2,web.xml和taglib

作servlet映射是个讨厌的工作,当你接收别的项目的时候,这个项目的servlet怎么用可能比较麻烦,可能当时web.xml的映射找不到了,这时怎么办呢?



看这个文件

package com.xdocletbook.blog.servlet;



import java.io.IOException;

import javax.servlet.ServletConfig;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import org.apache.log4j.Level;

import org.apache.log4j.Logger;



/**

* @web.servlet

* name="HomePage"

* @web.servlet-init-param

* name="LogLevel"

* value="{LOG_LEVEL}"

* @web.servlet-mapping

* url-pattern="/home"

*

* @web.security-role

*role-name="{OwnerRole}"

* @web.security-role-ref

*role-name="blogowner"

*role-link="{OwnerRole}"

*/





public class HomePageServlet

extends HttpServlet {

private static Logger LOGGER = Logger.getLogger(HomePageServlet.class);

public void init() throws ServletException {

String logLevel = getInitParameter("LogLevel");

if (logLevel != null && logLevel.length() > 0) {

LOGGER.setLevel(Level.toLevel(logLevel));

}

}



public void service(HttpServletRequest request, HttpServletResponse response) throws

ServletException, IOException {

LOGGER.debug("Displaying home page");

request.getRequestDispatcher("jsp/home.jsp").forward(request, response);

}

}

然后配置build.xml增加如下任务



<target name="generate-web">

<taskdef name="webdoclet" classname="xdoclet.modules.web.WebDocletTask" classpathref="xdoclet.classpath"/>

<!-- Generate servlet and JSP Tag "stuff" -->

<webdoclet destdir="gen" mergeDir="merge">

<fileset dir="src">

<include name="**/*.java" />

</fileset>

<deploymentdescriptor destdir="web" distributable="false" />

</webdoclet>

</target>



然后运行ant generate-web



结果就是这样一个web.xml

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">



<web-app >



<!--

To use non XDoclet filters, create a filters.xml file that

contains the additional filters (eg Sitemesh) and place it in your

project's merge dir.Don't include filter-mappings in this file,

include them in a file called filter-mappings.xml and put that in

the same directory.

-->



<!--

To use non XDoclet filter-mappings, create a filter-mappings.xml file that

contains the additional filter-mappings and place it in your

project's merge dir.

-->



<!--

To use non XDoclet listeners, create a listeners.xml file that

contains the additional listeners and place it in your

project's merge dir.

-->



<servlet>

<servlet-name>StrutsActionServlet</servlet-name>

<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>

</servlet>



<servlet>

<servlet-name>HomePage</servlet-name>

<servlet-class>com.xdocletbook.blog.servlet.HomePageServlet</servlet-class>



<init-param>

<param-name>LogLevel</param-name>

<param-value>1</param-value>

</init-param>



<security-role-ref>

<role-name>blogowner</role-name>

<role-link>aOwner</role-link>

</security-role-ref>

</servlet>



<servlet-mapping>

<servlet-name>StrutsActionServlet</servlet-name>

<url-pattern>*.do</url-pattern>

</servlet-mapping>



<servlet-mapping>

<servlet-name>HomePage</servlet-name>

<url-pattern>/home</url-pattern>

</servlet-mapping>



<!--

To specify mime mappings, create a file named mime-mappings.xml, put it in your project's mergedir.

Organize mime-mappings.xml following this DTD slice:



<!ELEMENT mime-mapping (extension, mime-type)>

-->



<!--

To specify error pages, create a file named error-pages.xml, put it in your project's mergedir.

Organize error-pages.xml following this DTD slice:



<!ELEMENT error-page ((error-code | exception-type), location)>

-->



<!--

To add taglibs by xml, create a file called taglibs.xml and place it

in your merge dir.

-->



<!--

To set up security settings for your web app, create a file named web-security.xml, put it in your project's mergedir.

Organize web-security.xml following this DTD slice:



<!ELEMENT security-constraint (display-name?, web-resource-collection+, auth-constraint?, user-data-constraint?)>

<!ELEMENT web-resource-collection (web-resource-name, description?, url-pattern*, http-method*)>

<!ELEMENT web-resource-name (#PCDATA)>

<!ELEMENT url-pattern (#PCDATA)>

<!ELEMENT http-method (#PCDATA)>

<!ELEMENT user-data-constraint (description?, transport-guarantee)>

<!ELEMENT transport-guarantee (#PCDATA)>



<!ELEMENT login-config (auth-method?, realm-name?, form-login-config?)>

<!ELEMENT auth-method (#PCDATA)>

<!ELEMENT realm-name (#PCDATA)>

<!ELEMENT form-login-config (form-login-page, form-error-page)>

<!ELEMENT form-login-page (#PCDATA)>

<!ELEMENT form-error-page (#PCDATA)>

-->



<security-role>

<role-name>aOwner</role-name>

</security-role>



</web-app>





仔细看这个文件,你一定诧异struts的配置信息怎样得来,这是XDoclet的另一种方式,对于第三方的Servlet,我们没有办法再处理原 代码,所以我们有了merge选项,看<webdoclet destdir="gen" mergeDir="merge">这一句就知道了,在merge目录里我们有两个文件:

servlets.xml



<servlet>

<servlet-name>StrutsActionServlet</servlet-name>

<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>

</servlet>

servlet-mappings.xml



<servlet-mapping>

<servlet-name>StrutsActionServlet</servlet-name>

<url-pattern>*.do</url-pattern>

</servlet-mapping>

还要注意的是{LOG_LEVEL},这个是说要引用ant 中的变量,所以我的build.xml前面中增加了这两项

<property name="LOG_LEVEL" value="1"/>

<property name="OwnerRole" value="aOwner"/>



所以,我们就可以动态的改变部署的Log级别

3,struts自动配置



Struts中有两样比较重要的类,Action和Form。

对于Action,我们需要配置Action的映射和Forward属性,对于Form我们也需要注册名字和校验参数,以下就是我们能用XDoclet做到的。

对于Action我们写这样一个Java文件



package com.xdocletbook.blog.servlet;



import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import org.apache.struts.action.Action;

import org.apache.struts.action.ActionForm;

import org.apache.struts.action.ActionForward;

import org.apache.struts.action.ActionMapping;



/**

* Simple class to test Jakarta Struts generation (Jakarta Struts 1.2 beta 2 only).

*

* @struts.action

*path="/struts/foo"

*name="userForm"

*input="jsp/createBlog.jsp"

*

* @struts.action-forward

*name="success"

*path="/struts/getAll.do"

*redirect="false"

*

*

* @struts.action-exception

* type="com.xdocletbook.blog.exception.ApplicationException"

* key="app.exception"

* path="jsp/error.jsp"

*

* @struts.action-form name="blog.Create"

*/

public final class StrutsAction extends Action

{

public ActionForward execute(ActionMapping mapping, ActionForm form,

HttpServletRequest request, HttpServletResponse response)

{

return mapping.findForward("success");

}

}



关键部分就是注释部分。



看我们增加build.xml一个任务,

<target name="generate-web">

<taskdef name="webdoclet" classname="xdoclet.modules.web.WebDocletTask" classpathref="xdoclet.classpath"/>

<!-- Generate servlet and JSP Tag "stuff" -->

<webdoclet destdir="gen" mergeDir="merge">

<fileset dir="src">

<include name="**/*.java" />

</fileset>

<strutsconfigxml version="1.1"/>

</webdoclet>

</target>



运行ant generate-web,我们就在gen得到了struts-config.xml

其中关键内容如下

<action

path="/struts/foo"

type="com.xdocletbook.blog.servlet.StrutsAction"

name="userForm"



scope="request"

input="jsp/createBlog.jsp"

unknown="false"

validate="true"

>

<exception



key="app.exception"

type="com.xdocletbook.blog.exception.ApplicationException"

path="jsp/error.jsp"

/>





<forward

name="success"

path="/struts/getAll.do"

redirect="false"

/>

</action>



如果我们有许多Action,就可以随时生成这样一个文件,不必在意有人改过这个文件。同时你也不必担心不小心忘了改这个文件,因为你改了



Java时,许多默认的属性也跟这改了。

看到这里,许多用过workshop的一定感觉到页面流不就是这样吗?当通过图形界面定义流程时,看看页面流的源码你就会发现,注释中有一些



特殊的标记,这说明workshop的注释有着xdoclet一样的功能,只不过workshop提供了很好的界面,而不需要自己写注释,而且workshop提供了



更好的语法检查,呵呵,只是将许多action写到一起,是有些乱。



Struts的另一个主要的部分就是Form了,虽然我一开始觉得Form有些麻烦,对付动态的Form有些无能为力,但是结合一些相关的插件后,效果确实不错。





这是我们的Form文件,我们还使用ValidatorForm来做自动验证。



package com.xdocletbook.blog.servlet;



import java.io.Serializable;

import org.apache.struts.validator.ValidatorForm;



/**

*

* @struts.form

*name="blog.Create"

*/

public class BlogCreateForm

extends ValidatorForm

implements Serializable {

private String name;

private String owner;

private String email;

public BlogCreateForm() {}



public String getName() {

return this.name;

}

/**

* @struts.validator

* type="required"

*/



public void setName(String name) {

this.name = name;

}





public String getOwner() {

return this.owner;

}

/**

* @struts.validator

* type="required"

*/



public void setOwner(String owner) {

this.owner = owner;

}



public String getEmail() {

return this.email;

}

/**

*@struts.validator

*type="required"

*@struts.validator

*type="email"

*/



public void setEmail(String email) {

this.email = email;

}

}





然后运行ant generate-web



这样struts-config.xml就有了

<form-beans>

<form-bean

name="blog.Create"

type="com.xdocletbook.blog.servlet.BlogCreateForm"

/>



<!



--

If you have non XDoclet forms, define them in a file called struts-forms.xml and

place it in your merge



directory.

-->

</form-beans>



这里有一个陷阱,就是Struts XDoclet处理form-beans时,只处理类型是Form的,对于类型是ValidatorForm的Form如果你不把对应的类文件放



到classpath下,XDoclet就会忽略它,所以struts的包一定要放到类路径下,让XDoclet有机会知道ValidatorForm是Form的子类。



还有每一个setXXX方法,有一些表示限制的注释,这些帮助我们生成了



validation.xml



<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE form-validation PUBLIC "-//Apache Software Foundation//DTD Commons



Validator Rules Configuration 1.0//EN" "http://jakarta.apache.org/commons/dtds/validator_1_0.dtd">



<form-validation>

<!--





Define global validation config in validation-global.xml

-->

<formset>

<form name="blog.Create">

<field property="name" depends="required">

<arg0 key="blog.Create.name"/>

</field>

<field property="owner" depends="required">

<arg0 key="blog.Create.owner"/>

</field>

<field property="email" depends="required,email">

<arg0 key="blog.Create.email"/>

</field>

</form>



</formset>

</form-validation>

相关文档(Relevant Entries)
Eclipse快速上手Hibernate-利用Hbm映射文件开发[转]
从hbm文件生成ddl
Hibernate代码生成工具 设计全攻略
Struts+Hibernate模板开发笔记
Struts+Spring+Hibernate练习(完整)
MyEclipse+struts+Hibernate配置开发
使用MiddleGen 产生hibernate的数据库表映射文件
使用Middlegen简化Hibernate开发

Posted on December 4, 2006 10:01 PM | Permalink | | Comments (0) | | TrackBacks (0)


引用地址(TRACKBACKS)

TrackBack URL for this entry:
http://www.wujianrong.com/mt-tb.cgi/4321
分享到:
评论

相关推荐

    XDOCLET的使用例子

    在XDoclet的使用中,Ant通常被用来运行XDoclet任务。通过在Ant构建文件(build.xml)中配置XDoclet任务,开发者可以指定要处理的源代码目录、生成的目标目录以及需要生成的文件类型。Ant的任务执行机制使得XDoclet的...

    xdoclet-相关配置实例

    在`build.xml`文件中,你需要配置一个`xdoclet-taskdef`任务来引入XDoclet,然后定义一个`xdoclet`任务执行注解处理。 例如,一个简单的Ant配置可能如下: ```xml &lt;taskdef resource="xdoclet.tasks"&gt; ...

    xdoclet-bin-1.2.3

    XDoclet可以通过Ant任务(tasks)集成到Ant构建脚本中,使得在编译Java源代码的同时,可以自动执行文档生成和代码自动生成的任务。 3. **版本1.2.3的重要性** 版本号1.2.3代表了XDoclet的稳定版本,通常意味着该...

    Xdoclet介绍

    然后,可以结合构建工具,如Ant或Maven,来配置和执行Xdoclet的任务。在Ant中,通常会创建一个`build.xml`文件,定义一个目标来运行Xdoclet。这个目标会扫描项目中的Java源代码,查找带有Xdoclet注释的类,并根据...

    xdoclet in action 中文版

    3. **创建自定义XDoclet任务**:除了模板和标签,XDoclet还支持自定义任务,这些任务可以是Ant构建脚本的一部分,用于执行更复杂的代码生成操作。通过创建自定义任务,开发者可以构建出更符合项目需求的代码生成流程...

    Ant集合Xdoclet 实例教程(之整合 Spring)

    4. **配置Xdoclet任务**:在Ant脚本中,创建一个`xdoclet-taskdef`任务来定义Xdoclet任务,并指定生成配置文件的参数,如生成的目录、文件名等。 5. **执行Xdoclet**:在Ant脚本中,添加一个`xdoclet`任务,指定要...

    xdoclet-1.2.3.rar

    使用XDoclet需要注意的是,虽然它能自动化很多任务,但过度依赖注解可能会导致代码可读性下降。因此,在实际开发中,需要权衡自动化带来的便利和代码清晰度之间的平衡。 “xdoclet-1.2.3”这个版本可能包含以下内容...

    xdoclet1 xdoclet1 spring3.0.5、struts1.3、struts2.1、 servlet

    XDoclet可以通过你在java源代码中的一些特殊的注释信息,自动为你生成配置文件、源代码等等,例如web、ejb的部署描述文件、config.xml配置文件、javascript校验等。本资源我在学习xdoclet过程中,总结完成的xoclet...

    xdoclet-plugins-1.0.3

    在Java开发中,XDoclet极大地简化了开发者的任务,通过在源代码中添加特定的注释,可以自动创建和更新配置文件,避免手动编写繁琐的XML配置。 **XDoclet 插件系统** XDoclet的核心在于其插件系统。每个插件负责...

    Xdoclet入门教程

    ### Xdoclet 基本概念 Xdoclet 的核心思想是通过在 Java 类中添加特定的 Javadoc 注释,这些注释包含了元数据信息。Xdoclet 工具会解析这些注释,然后自动生成相应的配置文件。例如,在上述例子中,`@hibernate....

    XDoclet 与Hibernate 映射

    3. `&lt;task&gt;`:实际执行的操作,Ant提供了许多内置任务,如编译(javac)、清理(clean)、拷贝(copy)等,还可以引入第三方任务或自定义任务。 通过Ant,开发者可以实现以下功能: - **编译源代码**:将Java源文件...

    xdoclet-1.2.1.zip

    这里通常会包含用户手册、API文档、教程等,帮助开发者快速掌握xdoclet的使用方法。通过阅读这些文档,开发者可以了解到xdoclet的配置选项、插件系统、模版语言以及如何编写自定义模版,从而更好地利用xdoclet来自动...

    Xdoclet的jar包下载了

    在Ant中,你可以通过编写特定的任务来调用XDoclet,使得在构建过程中自动执行注解解析和配置文件生成。以下是一个简单的Ant任务示例: ```xml &lt;target name="generate-xdoclet"&gt; &lt;taskdef name="xdoclet" ...

    xdoclet-bin-1.2.1.zip和xdoclet-bin-1.2.3.zip

    XDoclet是一款强大的Java开发工具,它主要用于自动生成文档、代码和配置文件。这个工具的主要优点在于它能够根据Java源代码中的注释自动生成各种框架的配置文件,比如EJB、Hibernate、Struts等,极大地提高了开发...

    Ant结合Xdoclet 实例教程(之整合 Hibernate)

    3. **配置Ant**:在build.xml文件中,定义一个Xdoclet任务,指定要处理的源代码目录、生成的目标目录以及所需的Xdoclet插件。例如,可以使用`&lt;xdoclet&gt;`标签来调用Xdoclet任务。 4. **生成映射文件**:运行Ant脚本...

    xdoclet-1.2.6.jar

    - 文档:可能包括用户手册、API参考、示例和常见问题解答,帮助用户更好地理解和使用XDoclet。 - 示例代码:展示如何在项目中集成和使用XDoclet,以及如何编写合适的Javadoc注释。 总的来说,XDoclet是一个革命性的...

    XDoclet2辅助开发hibernate3

    为了解决这个问题,XDoclet应运而生,特别是XDoclet2版本,它是一种自动化工具,能够根据Java源代码自动生成包括Hibernate映射文件在内的多种元数据文件。 XDoclet2是XDoclet的升级版,它基于JavaDoc注解,提供了一...

    xdoclet-1.2.3-sources.jar

    在Ant中,可以通过定义taskdef来引用XDoclet的任务,然后在目标中调用这些任务。在Maven环境中,可以将XDoclet作为插件添加到pom.xml文件中。 6. **优势与局限**:XDoclet的优势在于减少了手动编写XML配置的工作量...

    XDoclet入门教程

    ### XDoclet入门教程 #### 一、XDoclet简介 ...通过上述介绍,读者应该对XDoclet有了基本的认识,并了解了如何使用XDoclet来生成配置文件。在实际开发中,可以根据项目需求灵活地使用XDoclet来提高工作效率。

    XDoclet1.2+XDoclet教程

    "xdoclet中文文档.doc"是中文版的XDoclet使用手册,对于中国开发者来说非常实用;而"XDoclet教程.doc"则是针对初学者的教程,解释了如何使用XDoclet进行代码生成。 学习和掌握XDoclet,不仅可以提升开发效率,还能...

Global site tag (gtag.js) - Google Analytics