服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > JAVA > 新手入门 > 安装配置 > 查看文档

定制xdoclet标签自动生成框架配置


  xdoclet是一种通过读取java源文件中的特定标签,然后生成指定文件的工具。xdoclet标签本身已经提供了一些常用的标签,例如@ejb,@hibernate,@web等等,但是仍然不能满足我们的需求。
  
  例如我们最新的项目中引用了一个javascript验证框架,通过配置特定的xml配置文件,即可完成客户端表单验证,但是不想开发人员再去学习一套框架,于是想让开发人员在源代码中写@javascript这样的标签,然后生成其配置文件。
  
  javascript客户端验证一直是web开发中一个比较头疼的问题,经常是每一个页面中充斥着许多类似甚至相同的验证代码,如何统一有效的管理这些代码,以及如何做到代码页面的分离一直没有太好的解决方法。
  
  运用这个验证框架那么客户端开发就变成了配置validation-config.xml这个文件如此轻松了,本文并不打算详细讲述如何使用jsvalidation框架,有兴趣的朋友可以去http://www.cosoft.org.cn/projects/jsvalidation jsvalidation的官方网站自己去学习。
  
  虽然运用这框架已经可以很好的完成客户端验证代码的编写,并且提供了dtd文件进行xml文件的,但是手动编写xml文件还是很容易出错,效率比较低,而且新的开发人员还要掌握一个全新的框架,不宜于开发人员入门。
  
  像struts或jsf这样的框架大都需要为表单写一个类似formbean的东西,以jsf为例,假如表单内有一文本框<input type=”text” name=”txtusername” />,那么对应的page类或叫formbean类就应有如下代码:
  private htmlinputtext txtusername = new htmlinputtext();
  /**
  * @return 用户名
  */
  public htmlinputtext gettxtusername ()
  {
    return txtusername;
  }
  /**
   * @param text
   */
  public void settxtteaname(htmlinputtext text)
  {
    txtteaname = text;
  }
  如果可以利用xdoclet,那么,就可以自动生成jsvalidation的配置文件了,而且还利于培训新的开发人员,再加入ant task还可以形成每日构建。想象的代码应该是下面这个样子:
  /**
   * @javascript.field
   * name="frmzbaddglobalpage:txtteaname"
   * display-name="用户名"
   *
   * @javascript.depend
   * name="required"
   *
   * @return用户名
   */
   public htmlinputtext gettxtusername()
   {
     return txtusername;
   }
  通过分析xdoclet自带的一些标签包,发现只需要提供三个文件即可实现自定义xdoclet标签:一个继承于xmlsubtask的类,一个继承于doclettask的类(用于ant),一个xdt的模板语言文件即可。
  
  在xmlsubtask类中,首先,定义模板文件名:
  private static string default_template_file =
      "resources/validation-config.xdt";
  定义dtd文件名:
  private final static string dtd_file_name_20 =
      "resources/validation-config.dtd";
  定义要生成的配置文件名:
  private static string generated_file_name = "validation-config.xml";
  
  然后只需将三个文件组合起来既可,详细代码如下:
  public javascriptsubtask()
    {
      settemplateurl(getclass().getresource(default_template_file));
      setdestinationfile(generated_file_name);
    }
  
    public void execute() throws xdocletexception
    {
      setdtdurl(getclass().getresource(dtd_file_name_20));
      startprocess();
    }
  
    protected void enginestarted() throws xdocletexception
    {
      system.out.println(
        translator.getstring(
          xdocletmessages.class,
          xdocletmessages.generating_something,
          new string[] { getdestinationfile()}));
    }
  要想ant可以使用,只需要以下简单的代码:
  /*
   * 创建日期 2004-4-26
   */
  package paradise.xdoclet.modules.javascript;
  
  import xdoclet.doclettask;
  
  /**
   * @author 清风
   */
  public class javascriptdoclettask extends doclettask
  {
    public javascriptdoclettask()
    {
      addsubtask(new javascriptsubtask());
    }
  }
  在ant中按如下方式定义:
  <target name="javascript" depends="jxdoc_init" description="generate javascript validation-config">
      <javascriptdoclet destdir="${jsp}/javascript">
        <fileset dir="${src}">
          <include name="**/zaibian/*.java"/>
        </fileset>
      </javascriptdoclet>
  </target>
  
  接下来,也是最核心的部分,就是有关xdt模板语言,xdt文件可以说是自定义xdoclet标签的最重要的文件之一,以javascriptxdoclet为例,简单介绍一下xdt模板语言:
  <xdtclass:forallclasses>  遍历所有含有标签的类(在ant中指定)
  <xdtmethod:forallmethods>  遍历当前类的所有方法
  <xdtmethod:ifhasmethodtag tagname="javascript.form">  如果遍历到的方法中含有指定的标签
  <xdtmethod:forallmethodtags tagname="javascript.depend">  遍历当前方法的所有标签
  更多的模板语言,参考xdoclet的.xdt文档,都是很好理解的模板语言。
  
  接下来,开始自定义自己的标签,新建一个xtags.xml文件,加上开头
  <?xml version="1.0" encoding="utf-8"?>
  
  <!doctype xdoclet public "-//xdoclet team//dtd xdoclet tags 1.1//en" "http://xdoclet.sourceforge.net/dtds/xtags_1_1.dtd">
  然后写下所有自定义的标签,例如:
  <xdoclet>
    <namespace>
      <name>javascript</name>
      <tags>
        <tag>
          <level>method</level>
          <name>javascript.form</name>
          <usage-description>form</usage-description>
          <condition type="method"/>
          <parameter type="text">
            <name>id</name>
            <usage-description>form id</usage-description>
            <mandatory>true</mandatory>
          </parameter>
          <parameter type="text">
            <name>show-error</name>
            <usage-description>form error display</usage-description>
            <mandatory>true</mandatory>
          </parameter>
          <parameter type="text">
            <name>onfail</name>
            <usage-description>form error run custom javascript function</usage-description>
            <mandatory>false</mandatory>
          </parameter>
        </tag>
      </tags>
    </namespace>
  </xdoclet>
  注意几个地方:
  “<level> method </level>”代表该标签出现在方法上而不是类之上。例如
  /**
  *@javascript.form
  *name=”test”
  */
  public string getxxx()
  {
  }
  a
  最后就是将这些文件打成jar,其放置目录分别是:
  根目录
  |
  |--meta-inf/xtags.xml
  |
  |--源代码
  |----|
  |----|--resources/*.xdt,*.dtd

扫描关注微信公众号