errors/>这行标签,这样验证不通过就会显示属性文件里对应errors.password的值了。
对于Struts2来说,添加验证比Struts复杂一点,首先需要让Pojo继承Struts2的Action类,这里继承ActionSupport.
然后覆盖父类的validate方法,可以看出这个validate方法比struts的validate方法简单很多,没有返回值,没有参数。
也是验证密码长度,应为不要返回值,所以这里就有了addFieldError方法,作用和ActionErrors一样的,都是保存错误的。
这里Struts2的验证还没写完,还要在struts.xml文件里添加验证错误后的跳转页面。
如图所示,这里的name是input,这是Struts2里默认的错误处理名称。
3.Struts与Struts2的验证框架Validator
对于Struts来说,所有的验证都写在FormBean里的话,不但麻烦,冗余代码也很多,同样的上面Struts2的验证也是,还侵入了Pojo。
所以Struts和Struts2都提供了Validator框架来简化验证。
Struts使用的是Comming-Validator框架,此框架需要两个配置文件,validator-rules.xml和validation.xml,前者的作用是声明需插入到框架中的验证例程。
后者的作用是定义将哪个验证框架例程应用到哪个FormBean上去。
对于validator-rules.xml文件,你一般不需要去动它,因为它被打包到jar文件里了,而且提供的功能基本够用了。
而且如果要改动的话,需要取出此文件,修改完后再打包到jar里面去,很麻烦。
下面对原来的例子添加validator框架支持。
首先,struts默认是不启动validator的,需要再struts-config.xml里面启动这个validator框架,它是以插件的形式提供。
修改如下:
这样就启动了validator框架了。
解释一下参数。
就是插件了,value的值是两个xml的路径,一个是自己创建的validation.xml文件,一个是在jar包里的validator-rules.xml文件。
这两个文件就由pathnames这个属性来指明。
接着修改FormBean,要使Validator起作用,必须使FormBean继承Validator提供的ActionForm,这里继承了ValidatorForm。
另外,ValidatorForm自己实现了validate方法,所以FormBean里的validate方法不再需要了。
这样看起来,这个FormBean比原来简单了不少。
最后在validation.xml文件里面配置一下检验参数。
这里的form标签里的name指定的是在struts-config.xml文件里面配置的form-bean的别名。
接着是要检验的字段,这里检验password,检验的是required和minlength。
下面两个arg指定的是属性文件里的属性值,现看下属性文件的配置。
从这个开始解释,当验证不通过的时候,struts会自动到属性文件里面找对应的错误信息,这里的required队形errors.required,minlength对应errors.minlength。
而这里的arg就是来填写此属性对应的值所对应的变量的,position=”0”就对应{0},而key就会到属性文件里找对应的属性值,填到哪个{0}里面去。
对于第二个arg,它的resource=”false”,所以它不会去查找属性文件,而是把key里的值直接填到{1}里面去。
而这里面又是个表达式,它是指下面变量名为minlength的值,这里是3。
并且这个3也会作为minlength检验的标准。
当不满足required的时候就会显示passwordisrequired,而长度不够的时候就显示passwordmustlonggerthan3。
这样就比原来的硬编码灵活很多吧!
Validator还有很多特性,像可以按Action来验证,而不适按Form来验证,可以扩展,可以验证索引属性,还能跨多个页面验证,除了服务器端的验证,Validator还能进行客户端的js验证。
自己去摸索吧。
Struts2的验证框架就完全不同了。
它有自己的一套验证框架。
而实现起来也比较简单。
对loginAction里的validate可以先注释掉。
然后在LoginAction的同一目录下新建一个LoginAction-validation.xml文件。
这个文件的命名是统一的,类名-validation.xml。
这个就是验证文件了,相当于struts.xml里的validation.xml文件。
配置感觉比validation.xml文件清晰明了。
看下。
对于field标签不难理解吧?
对应的是哪个field,验证什么东西(type),错误提示什么(message),最后一个validator是对逻辑的验证,以表达式的方式来验证,这里是name不能和password相同。
配置完这个文件就ok了,很简单吧。
要看见那些错误信息。
需要修改下jsp页面,改成Struts2标签,如下。
然后运行下看看吧!
这里要说明的是,LoginAction还是要继承ActionSupport的。
因为它要使用addFieldError方法。
当然了,你可以结合validate方法和validator框架来验证。
对Struts来说,需要先调用super.validate(...),而Struts2则不需要。
这里就是实现机制的不同,书上都有说,不想费口舌。
4.与Spring集成
先看Struts2的集成。
Struts2提供了一个与Spring集成的jar包。
struts2-spring-plugin-2.0.11.jar
很明显,要集成Spring就要导入此包。
接着当然是要Spring来管理这个Action了。
Spring将操作类注入到Action中去。
首先建立一个验证接口,来验证用户名和密码,用接口是为了以后扩展的方便,虽然这里只实现了一个类。
接着实现这个接口。
这里当然可以和hibernate,jpa集成了,后话。
接着在LoginAction里面将这个CheckLogin添加进来,如下。
这里只有一个set方法,当然是给Spring注入用的。
那么怎么注入这个类呢。
在注入方面,Spring的applicationContext.xml文件和普通的注入没有一点区别。
注意到这里,scope=”prototype”。
因为Spring默认是singleton的,而Struts则会为每个请求生成一个Action,这里就有了冲突,所以需要将scope设为prototype。
那么问题就是怎么样让这个类的创建交给Spring,而不是Struts2。
需要改动两个地方。
一个是web.xml文件,一个是struts.xml。
Web.xml文件里面添加一个lintener。
而在struts.xml里面,将action的class属性,由类名改成Spring里配置的id名称即可。
这样每次请求过来时,Struts会根据class里的名字向Spring要相应的bean了。
关于Spring里的自动装配,Struts2也有支持的。
找本书看吧。
关于Struts的集成,有几种方式,这里只写一种推荐的方式。
即和上面的方式相同,将CheckLogin注入到Action里面去。
首先看看Spring的配置。
注意到了吧!
这里不是id而是name!
并且这个name要和struts-configure.xml里面的action的path相同,如下
并且这里的type,由原来的类改成了spring里面的类了。
如果你使用的是Spring2.5,那么就要导入spring-webmvc-struts.jar包。
Spring2.5将web给从Springcore里面分离出来了!
jar文件在Spring下的dist/modules里面。
接着在web.xml里面配置一个listener
这里的context-param的作用是指明Spring配置文件的位置。
然后将Action改成如下即可。
相对Struts2来说,Struts的集成还是繁琐一点的。
5.集成AJAX
与AJAX的集成应该没什么区别。
直接把AJAX添加进来就可以了。
我最近学习AKoss,所以就以AK为例集成。
AK主要还是做的界面的。
所以呢,重写jsp页面即可。
(可以在jsp页面里面使用zk标签,zk有一套jsp的标签,参考相关内容。
也可以直接写zul文件,这里直接写zul)
关于AK。
请看官方网站。
www.akoss.org
Zk文件名以zul为后缀,新建一个login.zul的文件。
输入如下代码。
无视错误!
!
!
!
ZK目前就eclipse有个插件,也不完善,纯靠手写。
这里只要name对应,form里面提交的位置对,那就可以了。
修改web.xml文件,添加ZK配置。
这样就可以了。
访问时直接访问login.zul就可以了。
看下结果。
是不是美观了不少!
这样就使用了ZK的组件了,ZK的AJAX特性就能使用了,具体参看ZK吧!