分享
 
 
 

开发自己的xDoclet标签

王朝java/jsp·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

xDoclet是一种通过读取JAVA源文件中的特定标签,然后生成指定文件的工具。xDoclet标签本身已经提供了一些常用的标签,例如@ejb,@hibernate,@web等等,但是仍然不能满足我们的需求。

例如我们最新的项目中引用了一个Javascript验证框架,通过配置特定的xml配置文件,即可完成客户端表单验证,但是不想开发人员再去学习一套框架,于是想让开发人员在源代码中写@javascript这样的标签,然后生成其配置文件。

Javascript客户端验证一直是web开发中一个比较头疼的问题,经常是每一个页面中充斥着许多类似甚至相同的验证代码,如何统一有效的管理这些代码,以及如何做到代码页面的分离一直没有太好的解决方法。

最近在网上看到了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" "

' target=_blankhttp://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

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有