Struts2中的Vistor模式
Visitor访问者模式定义
作用于某个对象群中各个对象的操作. 它可以使你在不改变这些对象本身的情况下,定义作用于这些对象的新操作.
对于Struts 2中,Visitor Design Pattern在页面校验中被很多开发者广泛应用。记得以前在Struts 1中,支持在ActionForm的validate方法中手动校验(通过JavaScript),或者通过Commons Validator的扩展来校验(配置文件properties).而Struts 2中支持通过validate方法和XWork校验框架来进行校验。XWork校验框架使用为属性类类型定义的校验和内容校验,来支持chain校验子属性。在这过程中使用到Visitor模式。
在Struts 2中校验分为客户端校验和服务器端校验。在客户端,我们通常通过框架或者一些已经成熟的Javascript脚本做校验。在服务器端,通常校验有三种途径:
1. 在Action中可以重写ActionSupport的Validate方法。
2. 如果在Action中存在多个类似于execute的处理逻辑的话,我们可以重写validateXxx()方法(Xxx为不同的处理逻辑名称,例如有validateRegist()方法,就是处理Regist业务逻辑)
3. 编写对应于Action的validate 的xml文件。这个应该是最为常用的一种解决方案了,但是有一个问题,Action众多,或者在Action中有多个对应一个或多个POJO的处理逻辑,那么这些xml文件就会随着Action文件和处理逻辑的增加而相应的增加,这显然不是个好的现象。 所以如果只是针对POJO来写相应的validate xml文件,无疑会好很多。 这就是Visitor校验器的功用了。
针对第三点,我举一个例子:
<validators><field name="user"><field-validator type="visitor"><param name="context">user</param><param name="appendPrefix">true</param><message>user </message></field-validator></field></validators><validators><field name="firstname"><field-validator type="requiredstring"><message>required first name</message></field-validator></field><field name="lastname"><field-validator type="requiredstring"><message>required last name</message></field-validator></field><field name="age"><field-validator type="required"><message>required age</message></field-validator><field-validator type="int"><param name="min">1</param><param name="max">100</param><message>age should be between ${min} and ${max}</message></field-validator></field></validators>