定制自己的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. linux 卡在grub_详解ubuntu双系统启动时卡死解决办法
  2. LVS (一) 原理
  3. 【Linux系统编程】快速查找errno错误码信息
  4. 科学计算:Python VS. MATLAB(3)----线性代数基础
  5. 熟悉使用ssm框架完成项目
  6. java得到文件创建时间linux,linux java获取文件创建时间
  7. gradle插件 java_简单的Gradle Java插件自定义
  8. php抓取动态数据,php+ajax实现无刷新动态加载数据技术
  9. android socket 框架c#,C#与Android Socket通信
  10. Intellij IDEA 安装jnetpcap开发环境与 no jnetpcap in java.library.path 的解决方案
  11. java判断回文用valueof_判断字符串是否是回文
  12. mysql数据库 安装后 闪_MYSQL数据库Mysql数据库安装完成后需要进行的6个后续操作...
  13. Word 标题后自动添加分页符、分节符显示与查看
  14. 部署混合云指南:多云服务商管理的八大要素
  15. 光滑曲线_光滑流形(4)
  16. CREO二维CAD图纸导出1:1比例导出,单位为mm
  17. Python爬虫自学系列(七) -- 项目实战篇(一)
  18. 计算机视觉:基于BOW的图像检索与识别
  19. 观念决定态度,态度决定一切
  20. [附源码]计算机毕业设计springboot疫情物资管理系统

热门文章

  1. CHIP-seq流程学习笔记(3)-比对软件 bowtie2
  2. 2019最新微信公众平台PHP开发搭建与揭秘(附代码)
  3. Ruoyi 图片上传
  4. 零基础入门Jetson Nano——软件篇
  5. 集效率之大成的EfficientNet
  6. 汇编语言(一)-基础知识
  7. 对话 UNIX: 使用 Screen 创建并管理多个 shell
  8. pc端调用电脑摄像头及麦克风完成录像或录音并实现回放和上传服务器
  9. 页面最上方的搜索和logo叫什么_网页顶部导航栏设计总结
  10. Messari 2022年度报告9 - DAO亦有道