struts2 提供了服务器端和客户端输入验证
1. 通过重写validate()方法:
当验证不通过时 Action返回名为input的逻辑视图,并可通过<s:fielderror /> 在该视图中输出错误 信息,注意action应该继承ActionSupport。通过ActionSupport中的addFieldError("字段名","错误信息")将错误信息添加到相应字段,如果有struts的表单标签,则相应的字段处会提示错误信息,validate会对action中的所有方法进行数据验证。
index.jsp
<body>
<s:fielderror></s:fielderror>
<!-- 显示出错信息 -->
<s:fielderror fieldName="name" theme="simple" />
<!-- 带样式-->
<br />
<s:property value="errors.name[0]" />
<!-- 不带样式-->
<s:debug></s:debug>
<!-- 值栈- ->
<form action="${pageContext.request.contextPath}/person/manage_save" method="post">
姓名:<input name="username" type="text"/><br>
手机:<input name="mobile" type="text"/><br>
<input type="submit" value="提交"/>
</form>
</body>
效果图:
![](http://hi.csdn.net/attachment/201203/19/0_1332158670zbE9.gif)
struts.xml:
<action name="manage_*" class="cn.ljf.PersonAction" method="{1}">
<result name="message">/message.jsp</result>
<result name="input">/index.jsp</result> <!--name名 必须是input -->
</action>
action:
public class PersonAction extends ActionSupport{
@Override
public void validate() {
if(this.username==null||"".equals(username.trim()))
this.addFieldError("username", "用户名不能为空!");
if(this.mobile==null||"".equals(mobile.trim()))
this.addFieldError("mobile", "手机号不能为空!");
else
{
if(!Pattern.compile("^1[358]\\d{9}$").matcher(this.mobile).matches())
this.addFieldError("mobile", "手机号格式不正确!");
}
}
private String username;
private String mobile;
//getter setter
}
若要对指定的方法验证则需写一个方法validateXxx方法,其中xxx为要执行的方法名.
如validateUpdate()
如果中间数据转换失败(不论是基础类型,还是自定义类型)的话,也会往fielderror添加信息,同时若有struts2的表单的话,表单的相应字段也会出现提示信息。我们也可以更改默认的类型转换的信息。例如对int数据输入字母
第二种:通过xml配置
<!DOCTYPE validators PUBLIC
"-//Apache Struts//XWork Validator 1.0.3//EN"
"http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd">
<validators>
<field name="username">
<field-validator type="requiredstring">
<param name="trim">true</param>
<message>用户名不能为空!</message><!-- 出错信息 -->
</field-validator>
</field>
<field name="mobile">
<field-validator type="requiredstring">
<message>手机号不能为空</message>
</field-validator>
<field-validator type="regex">
<param name="expression"><![CDATA[^1[358]\d{9}$]]></param>
<message>手机格式不正确</message>
</field-validator>
</field>
</validators>
增加客户端校验非常简单,将输入页面的表单元素改为使用struts2标签来生成表单,并且为该表单增加validate="true"属性即可
<head>
<s:head/>
<title>title</title>
</head>
<body>
<s:form action="reg" validate="true">
<s:textfield label="用户名" name="name"/>
</s:form>
</body>
以下为一个配置实例|(注意其中的短路校验short-circuit设置)
<!-- 校验文件的根元素 -->
<validators>
<!-- 校验Action的name属性 -->
<field name="name">
<!-- 指定name属性必须满足必填规则 -->
<field-validator type="requiredstring" short-circuit="true">
<param name="trim">true</param>
<!-- 如果校验失败,输出name.requried对应的国际化信息 -->
<message>${getText("name.requried")}</message>
</field-validator>
<!-- 指定name属性必须匹配正则表达式 -->
<field-validator type="regex">
<param name="expression"><![CDATA[(\w{4,25})]]></param>
<!-- 如果校验失败,输出name.regex对应的国际化信息 -->
<message>${getText("name.regex")}</message>
</field-validator>
</field>
<!-- 校验Action的pass属性 -->
<field name="pass">
<!-- 指定pass属性必须满足必填规则 -->
<field-validator type="requiredstring" short-circuit="true">
<param name="trim">true</param>
<!-- 如果校验失败,输出pass.requried对应的国际化信息 -->
<message>${getText("pass.requried")}</message>
</field-validator>
<!-- 指定pass属性必须满足匹配指定的正则表达式 -->
<field-validator type="regex">
<param name="expression"><![CDATA[(\w{4,25})]]></param>
<!-- 如果校验失败,输出pass.regex对应的国际化信息 -->
<message>${getText("pass.regex")}</message>
</field-validator>
</field>
<!-- 指定age属性必须在指定范围内-->
<field name="age">
<field-validator type="int">
<param name="min">1</param>
<param name="max">150</param>
<!-- 如果校验失败,输出age.range对应的国际化信息 -->
<message>${getText("age.range")}</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>
<!-- 如果校验失败,输出birth.range对应的国际化信息 -->
<message>${getText("birth.range")}</message>
</field-validator>
</field>
</validators>
内建校验器:
基于Annotation 也可以校验