输入校验是所有Web应用必须处理的问题,因为Web应用的开放性,网络上所有的浏览者都可以自由使用该应用,因此该应用可以通过输入页面收集的数据是非常复杂的,不仅会包含正常用户的误输入,还可以包含恶意用户的恶意输入。一个健壮的应用系统必须将这些非法输入阻止在应用之外,防止这些非法输入进入系统,这样才能保证系统不受影响。
输入校验分为客户端校验和服务器端校验,客户端校验主要是过滤正常用户的误操作,主要通过JavaScript代码来完成;服务器端校验是整个应用阻止非法数据的最后防线,主要通过在应用中编程实现。
输入校验是表现层数据处理的一种,因此应该由MVC框架提供。Struts2框架提供了非常强大的输入校验体系,通过Struts2内建的输入校验器,Struts2应用无须书写任何输入校验代码,即可完成绝大部分输入验证,并可以同时完成客户端校验和服务器端校验。如果应用的输入校验规则特别负责,Struts2也允许通过重写validate方法来完成自定义校验;除此之外,Struts2的开放性允许开发者提供自定义的校验器。
Struts2提供了基于校验框架的输入校验,在这种校验方式下,所有的输入校验只需要编写简单的配置文件,Struts2的校验框架就会负责进行服务器端校验和客户端校验。。
下面举例示范如何利用Struts2的校验框架进行验证
所使用的表单代码如下:
<s:fielderror></s:fielderror>
<form action="regist" method="post">
用户名:<input type="text" name="name"/><br/>
密码:<input type="password" name="password"/><br/>
年龄:<input type="text" name="age"/><br/>
生日:<input type="text" name="birth"/><br/>
<input type="submit" value="注册"/>
</form>
假设表单中的4个请求参数需满足以下规则
1、name和password只能是字母和数字,且长度必须在4到25之间
2、年龄必须是1到150之间的整数
3、生日必须在1900-01-01到2050-02-21之间
使用的Action处理类
package com.test.action;
import java.util.Date;
import com.opensymphony.xwork2.ActionSupport;
public class RegistAction extends ActionSupport{
//该请求包含的4个请求参数
private String name;
private String password;
private int age;
private Date birth;
//此处省略4个属性的set和get方法
...
}
采用Struts2的校验框架时,只需要为该Action指定一个校验文件即可。校验文件是一个XML配置文件,该文件指定了Action的属性必须满足怎样的规则。下面是该应用中Action的校验文件代码。
<!DOCTYPE validators PUBLIC
"-//Apache Struts//XWork Validator 1.0.2//EN"
"http://struts.apache.org/dtds/xwork-validator-1.0.2.dtd">
<!-- 校验文件的根元素 -->
<validators>
<!-- 校验Action的name属性 -->
<field name="name">
<!-- 指定name属性必须满足必填规则 -->
<field-validator type="requiredstring">
<param name="trim">true</param>
<message>必须输入名字</message>
</field-validator>
<!-- 指定name属性必须满足匹配指定的正则表达式 -->
<field-validator type="regex">
<param name="regex"><![CDATA[(\w{4,25})]]></param>
<message>您输入的用户名只能是字母和数字,且长度必须在4到25之间</message>
</field-validator>
</field>
<!-- 校验Action的password属性 -->
<field name="password">
<!-- 指定password属性必须满足必填规则 -->
<field-validator type="requiredstring">
<param name="trim">true</param>
<message>必须输入密码</message>
</field-validator>
<!-- 指定password属性必须满足匹配指定的正则表达式 -->
<field-validator type="regex">
<param name="regex"><![CDATA[(\w{4,25})]]></param>
<message>您输入的密码只能是字母和数字,且长度必须在4到25之间</message>
</field-validator>
</field>
<!-- 指定age属性必须在指定范围内 -->
<field name="age">
<field-validator type="int">
<param name="min">1</param>
<param name="max">150</param>
<message>年龄必须在1到150之间</message>
</field-validator>
</field>
<!-- 指定birth属性必须在指定范围内 -->
<field name="birth">
<field-validator type="date">
<!-- 下面指定日期字符串时,必须使用本Locale的日期格式 -->
<param name="min">1900-01-01</param>
<param name="max">2050-02-21</param>
<message>生日必须在${min}到${max}之间</message>
</field-validator>
</field>
</validators>
Struts2的校验文件规则与Struts1的校验文件设计方式不同,Struts2中的每个Action都有一个校验文件。从这种设计来看,Struts2应用的Action可以非常方便地与校验规则文件同步修改同步升级,非常有利于模块化开发,Struts2的Action与校验规则文件具有如下共性。
1、Action类与校验规则文件保存在同一路径下
2、Action类的类名作为校验规则文件的文件名前缀
Struts2的校验规则文件的文件名应该遵循如下命名规则。
<Action名字>-validation.xml
增加了该校验文件后,系统会自动加载该文件。当用户提交请求时,Struts2的校验框架会根据该文件对用户请求进行校验。
struts.xml添加配置
<action name="regist" class="com.test.action.RegistAction">
<result name="input">regist.jsp</result>
<result>show.jsp</result>
</action>
返回错误信息页面展示