12.5 加入验证
12.5.1 回顾验证框架
现在可以使用Struts2的验证框架,在真正调用Action的处理方法之前,来验证用户输入的信息是否符合要求。
使用验证框架要考虑四点:
- 在哪儿指定验证信息?最常见的是在Action的同包下建立Action名- validation.xml,但是,现在的UserAction同时负责响应多种请求,所以,要用Action名-别名-validation.xml的方式来指定验证信息。其中的别名就是在struts.xml中注册的<action>元素的name属性。
- 怎么指定验证信息?
l 字段级别:某个字段如果需要验证,而且这个验证不涉及到别的字段的话,就可以使用字段级别验证。
l Action级别:如果某个验证涉及到多个字段,则这个验证可以作为Action级别。
- 如果验证发生错误,跳转到名为input的Result。
- 如何引用验证错误信息?
l 引用字段级别验证可以分为两种情况,如果使用xhtml风格的<s:form/>,验证信息会出现在该字段验证所验证的表单域上方;也可以单独使用<s:fielderror/>标签来引用。
l 引用Action级别验证则必须在页面上使用<s:actionerror/>标签来引用。
有了这么多预备知识,可以分别设计三次表单提交的验证了,验证的要求如下:
l 用户编号,只要添了数字就可以。
l 姓名,必填。
l 性别,由于是下拉框,所以不必验证。
l 年龄,必须是18到50之间。
l 用户编号,不必填,所以不必验证。
l 姓名,不必填。
l 性别,由于是下拉框,所以不必验证。
l 年龄范围,最大范围和最小范围单独不必验证,但是如果同时添了,最小范围必须小于等于最大范围。
12.5.2 为添加用户页面添加验证
根据上一节的叙述,现在来为添加用户的页面添加验证。
首先,添加验证文件,在UserAction同包下,放置UserAction-userAdd-validation.xml:
java代码:
- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE validators PUBLIC
- "-//OpenSymphony Group//XWork Validator 1.0//EN" "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
-
- <validators>
- <field name="user.userId">
- <field-validator type="int">
- <param name="min">1</param>
- <message>请填入用户编号,整数类型</message>
- </field-validator>
- </field>
- <field name="user.name">
- <field-validator type="requiredstring">
- <param name="trim">true</param>
- <message>请输入用户名</message>
- </field-validator>
- </field>
- <field name="user.age">
- <field-validator type="int">
- <param name="min">18</param>
- <param name="max">50</param>
- <message>请输入的用户年龄在${min}到${max}之间</message>
- </field-validator>
- </field>
- </validators>
在上面的验证文件中,有三个字段级别的验证,分别验证了:
- user.userId:必须添入大于1的正整数。
- name:必须填入。
- age:必须是在18和50之间的正整数。
然后,需要为userAdd这个Action,增加名为input的Result,其结果直接返回add.jsp。
java代码:
- <action name="userAdd" class="cn.javass.crud1.action.UserAction" method="add">
- <result name="toList">/jsp/list.jsp</result>
- <result name="input">/jsp/add.jsp</result>
- </action>
最后,应该修改add.jsp来引用验证错误信息。但是,对于添加的验证都是字段级别的验证,所以,在xhtml主题下<s:textfield/>等表单标签会自动在验证不通过的时候把验证错误信息放到表单域的上面。所以,不需要手工修改add.jsp。
好了,所有的修改都做完了,可以开始运行了。在运行之前还要明确一点:验证是发生在类型转换之后的事情,所以如果某个字段的类型转换发生错误的话,虽然验证仍然会发生,但是使用声明字段的默认值进行验证。如果在user.age这个文本框中添了字符串a,那么,在类型转换的时候,a并不能被转换为user.age声明的int属性,因此,类型转换错误,但是,验证还是会发生,只不过使用int的默认值0进行验证。
那么,看一下验证的效果:

图12.7 添加页面验证的效果
在这里,什么都没有输入,直接点击了添加按钮。
12.5.3 为查询用户页面添加验证
查询的时候,只需要验证年龄最大值和年龄最小值同时添的时候,验证是否最小值大于最大值即可。这个验证涉及到了两个字段,所以要使用Action级验证。而且,要比较两个输入值的大小,所以要使用表达式验证,从值栈里取出这两个值来进行验证。
首先,在UserAction的同包下,加入UserAction-userQuery-validation.xml:
java代码:
- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE validators PUBLIC
- "-//OpenSymphony Group//XWork Validator 1.0//EN" "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
-
- <validators>
- <validator type="expression">
- <param name="expression">
- <![CDATA[(uqm.age2>0&&uqm.age<=uqm.age2)||uqm.age2==0]]>
- </param>
- <message>您输入的年龄最小值大于最大值</message>
- </validator>
- </validators>
在这里使用了一个表达式验证,由于表达式里设计大于号、小于号,所以放在<![CDATA[表达式]]>里面,防止大于号、小于号被xml转义。
表达式(uqm.age2>0&&uqm.age<=uqm.age2)||uqm.age2==0指定了:如果uqm.age2的值为0,即用户不填年龄最大范围就不用验证;如果填了(uqm.age2>0),则年龄最小范围一定要小于年龄最大范围,如果用户不填的年龄最小范围的话,以默认值0为准。因此,这句表达式指定了如果用户同时添了年龄最大范围和年龄最小范围,只有年龄最小范围小于等于年龄那个最大范围的时候才能通过验证。
然后,需要为userQuery这个Action,增加名为input的Result,其结果直接返回query.jsp。
java代码:
- <action name="userQuery" class="cn.javass.crud1.action.UserAction" method="query">
- <result name="toList">/jsp/list.jsp</result>
- <result name="input">/jsp/query.jsp</result>
- </action>
最后,要在query.jsp上通过<s:actionerror/>标签来显示这个Action级错误信息。
java代码:
- <%@ page language="java" contentType="text/html; charset=gb2312"
- pageEncoding="gb2312"%>
- <%@taglib prefix="s" uri="/struts-tags" %>
- <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
- <html>
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=gb2312">
- <title><s:text name="query.title"/></title>
- </head>
- <body>
- <s:actionerror/>
- <s:form action="userQuery" method="post">
- <s:textfield name="uqm.userId" key="user.userId" value="0"/>
- <s:textfield name="uqm.name" key="user.name"/>
- <s:select list="sexs" name="uqm.sex" key="user.sex" headerKey="" headerValue="请选择"/>
- <s:textfield name="uqm.age" key="query.age1" value="0"/>
- <s:textfield name="uqm.age2" key="query.age2" value="0"/>
- <s:submit name="" key="query.submit"/>
- </s:form>
- </body>
- </html>
运行测试一下,看看验证的效果:

图12.8 查询页面验证的效果
12.5.4 在验证中引用国际化信息
前面在使用验证框架的时候,出错信息都是直接写在validation文件中的,这些错误信息在真正出错的时候也是要展示给用户看的,所以,既然要做一个国际化的示例,这些错误信息也就应该跟着国际化。
非常简单,只需要为validation文件中的<message>元素设置key属性,同时去掉<message>元素属性中间的文本就可以了。如把UserAction-userQuery-validation.xml改为:
java代码:
- <validators>
- <validator type="expression">
- <param name="expression">
- <![CDATA[(uqm.age2>0&&uqm.age<=uqm.age2)||uqm.age2==0]]>
- </param>
- <message key="query.error"></message>
- </validator>
- </validators>
上面的文件中,除了<message>元素去掉文本并设置key属性之外,完全没有变化。当然,还需要在国际化信息文件中添加上”query.error”这个key和相应的值就可以了。
私塾在线网站原创《研磨struts2》系列
转自请注明出处:【http://sishuok.com/forum/blogPost/list/0/4113.html】
欢迎访问http://sishuok.com获取更多内容