定制自己的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为例,假如表单内有一文本框,那么对应的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()
{

}

最后就是将这些文件打成jar,其放置目录分别是:

根目录

|

|--META-INF/xtags.xml

||--源代码

|----|

|----|--resources/*.xdt,*.dtd

定制自己的xDoclet标签相关推荐

  1. 定制xdoclet 标签

    定制自己的xDoclet标签 xDoclet是一种通过读取JAVA源文件中的特定标签,然后生成指定文件的工具.xDoclet标签本身已经提供了一些常用的标签,例如@ejb,@hibernate,@we ...

  2. dedecms模板定制之如何自定义标签

    自定义标签在dedecms定制中非常重要,很多时候都用得到,比如栏目导航特效.调用特殊的信息.使用复杂的查询等,今天讲下如何自定义标签. 1,首先在include文件夹下找到extend.func.p ...

  3. EasyGBS定制项目添加“设备标签”模块的代码实现分享

    随着现在新内核的EasyGBS.EasyNVR以及EasyCVR的使用场景越来越广泛,这些平台也被运用在大小不同的很多实际项目中.在功能上,基本都能满足大部分用户的需求,也有少部分项目需要进行功能的定 ...

  4. BodyContent揭秘及定制复杂的JSP标签

    jsp中的定制标签功能可以帮助我们来更好地实现presentation layer.我在学习的时候,感觉最困难的就是BodyContent这个类,Sun在API和specification中对Body ...

  5. vant改定制颜色 修改tab标签和滚动条颜色

    https://blog.csdn.net/HYeeee/article/details/82747874 vant的tab修改标签和滚动条颜色(新手坑) 参考 https://blog.csdn.n ...

  6. 案例分享:Qt政务标签设计器,标签排版软件定制与打印

    若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/119730466 长期持续带来更多项目与技术分享,咨询请 ...

  7. Office Tab免费版:标签化浏览和编辑Office文档

    Office Tab是一个为Microsoft Office添加多标签化功能的插件,即文档级别的标签管理,这样在一个Office窗口中,就能打开.管理多个文档,极大方便操作,提高工作效率,实在是一个超 ...

  8. 彻底搞定用Xdoclet生成Hibernate所有配置文件

    背景:     本人在用Xdoclet生成hibernate的配置文件.实体映射文件和sql脚本的时候,每次总要出点问题,今日问题再现,我在网上泡了一个多小时,没有一篇很完整,很成功的例子.一怒之下, ...

  9. 【转】SharePoint 2010 用户自定义编辑Meta标签的OOB方法

    今天遇到一个小问题,客户想要动态定制页面的<Head>标签里Meta, 而且需要使用OOB. 考虑了一下,Meta 标签肯定是用来让Server Crawl的, 那JS的方法首先排除,那就 ...

最新文章

  1. excel单元格斜线_Excel技巧 | 如何绘制斜线表头
  2. python学习笔记7--面向对象进阶,异常处理,socket编程初识
  3. (68)FPGA面试题-使用不同的代码实现2:1 MUX ?使用assign语句
  4. Scala 安装(win)
  5. Android——继续深造——从安装Android Studio 2.0开始(详)
  6. N8变砖后的强刷方法
  7. python声音报警_python:基于tkinter打造的股票实时监控声音报警器! 自动监控,声音警报...
  8. css中鼠标悬停背景色从左到右
  9. a标签下载静态文件 失败-未发现文件
  10. 【Azure Data Platform】ETL工具(22)——Azure Databricks与ADF整合
  11. 花式登录正方教务系统
  12. 【STM32F429开发板用户手册】第42章 STM32F429的LTDC应用之点阵字体和字符编码(重要)
  13. sakai 源码安装注意事项
  14. 详解变分自编码器——VAE
  15. 【TVOS】TVOS与android的关系
  16. Cpython环境配置
  17. 30分钟搭一个wordpress网站
  18. 【多媒体开发】Android视频全屏录制遇到的一些问题
  19. 记录奥运男子马拉松赛
  20. 实用插件(三)通讯录插件

热门文章

  1. 《人力资源视角下的企业数字化转型》高峰圆桌论坛圆满闭幕
  2. 【修真院小课堂】JWT简单介绍
  3. 会变色的背景透明NSButton
  4. 基于vue的分享插件
  5. Lucas 与 ExLucas
  6. 分布式电商项目十四:Vue前端框架简介及使用
  7. ChatGPT突遭大面积封号!网友应急出解封教程
  8. 如何将EXCEL数据表里面的数据逆时针旋转90度
  9. 给猜字游戏增加难度设置
  10. 【Android】时钟动态图标的定制化