作者:Flyingis
今天要回顾的是Validator、Tiles以及简单的Plugin实现,刚刚登录blogjava就发现Mustang已经发了两篇好文《在Struts中使用Validator实现可配置的信息校验(一) (二)》,本文则从实现流程来总结Validator的使用方法,并针对Validator、Tiles等Struts PlugIn插件略谈一些个人心得。
Validator
在使用ActionForm时,将数据的验证工作放在validator()方法中虽说是一个可行的方法,但在ActionForm中编写特定的验证逻辑会降低ActionForm的重用性,并给系统的维护带来麻烦。Validator框架可以将验证逻辑移至ActionForm之外,实现Javascript客户端验证或服务器段验证。具体实现Validator验证步骤如下:
1. Validator是以plugin的方式来扩充ActionServlet功能的,需要在Struts-config.xml中声明这个plugin。
2. 导入Validator中的资源信息,用来向用户提示验证中出现的异常消息。Validator可以支持国际化信息,为每一个国际化信息提供对应的资源信息。
3. 利用validaton.xml文件来定义用户需要验证的每一个JSP表单中的每一个字段的验证规则,其中可以利用validator-rules.xml中已经设计好了的验证器,也可以自定义验证方式。
4. 客户端验证需要validator-rules.xml中已提供的验证规则,或是自定义规则,然后在jsp页面中声明<html:form action=“/action.do” onsubmit=“return validateActionForm(this);”>,加上可以生成实现验证的Javascript代码<html:javascript formName=“ActionForm” staticJavascript=“true”/>。服务器端验证同样需要validator-rules.xml中已提供的验证规则,或是自定义规则,另外,实现验证的ActionForm需要是DynaActionForm的子类,和客户端验证不同的是,在捕获服务器端错误消息时,jsp页面中需要嵌入代码
<html:messages id=“error”>
<bean:write name=“error”/>
</html:messages>
在配置和设计Web系统验证功能的时候,需要注意的是要理解在validaton.xml中定义验证规则的时候每个参数的具体功能,我最初使用Validator的时候就因为参数混淆而验证失败,费了一点时间。还有就是自定义验证规则时,需要注意每个参数的具体含义,例如在某种情况下,validaton.xml里<var-name>myproperty</var-name>中自定义的属性myproperty需要和自己编写的验证器类中的代码一致等等。
Tiles
Tiles是一个模板机制,它可以让网页的配置框架和内容分离,提供一个版面管理机制。通常有两种方式管理Tiles配置资源,一种使用XML,另一种使用JSP页面直接管理。
使用XML配置的Tiles可以支持国际化,例如可以另存为tiles-defs.xml并命名为tiles-defs_zh.xml,将encoding改为GB2312,这样可以在配置中使用中文。使用XML配置文件可以方便的实现版面配置和内容的分离,并且能扩充某个定义,达到重新定义其中所管理页面资源的目的。使用JSP页面直接定义管理版面的配置资源更为简单和灵活,同样可以和xml一样重新定义网页的地址。不使用JSP框架页面而是直接在JSP页面中使用配置页面,可以不用额外去定义管理文件,但缺点是无法重用这个页面定义的内容。
将Tiles和CSS结合起来,基本上能满足一般页面控制的需要。
PlugIn插件
通过继承ActionSerlvet,重写它的init()方法,修改或增减它的初始化资源来达到改变ActionServlet功能的方法,这从软件架构角度上来讲并不是一个好方法。Struts1.1之后,可以通过PlugIn接口来实现动态增减ActionServlet功能的目的。ActionServlet加载后,会执行实现PlugIn接口的类的init()方法,在ActionServlet终止前,执行实现PlugIn接口的类的destroy()方法。Validator和Tiles就是利用这种方式来扩充Struts功能的。
写到这里,感觉使用好Validator和Tiles等PlugIn插件最重要的就是对配置元素的理解,和程序调用流程的掌握,了解到Struts的插件机制是如何运转的,以此来扩充Web应用程序的功能,提供更好的用户体验。