概述:
一个健壮的web应用程序必须保证用户输入时合法、有效的。除了前段js的验证外,后台也要进行验证。
Struts2的输入验证:
-->基于XWork Validation Framework的声明式验证:在xml中配置
-->编程验证:通过编写代码进行验证输入
Action类:TestValidationAction
public class TestValidationAction extends ActionSupport {
/**
*
*/
private static final long serialVersionUID = 1L;
private int age;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String execute() throws Exception {
System.out.println("age:"+age);
return SUCCESS;
}
}
同TestValidationAction类所在包下的TestValidationAction-validation.xml验证文件
该文件命名规则就是 AcitonName-validation.xml
<!DOCTYPE validators PUBLIC
"-//Apache Struts//XWork Validator 1.0.2//EN"
"http://struts.apache.org/dtds/xwork-validator-1.0.2.dtd">
<validators>
<!-- 基于字段的验证 -->
<field name="age">
<field-validator type="int">
<param name="min">20</param>
<param name="max">50</param>
<message>Age needs to be between ${min}and ${max}</message>
</field-validator>
</field>
</validators>
jsp
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<s:form action="testValidation">
<s:textfield name="age" label="Age"></s:textfield>
<s:submit name="submit"></s:submit>
</s:form>
</body>
</html>
struts.xml
<struts>
<!-- 配置国际化资源文件 -->
<constant name="struts.custom.i18n.resources" value="i18n"></constant>
<package name="default" namespace="/" extends="struts-default">
<action name="testValidation" class="com.hcx.struts2.validation.app.TestValidationAction">
<result>/success.jsp</result>
<result name="input">/validation.jsp</result>
</action>
</package>
</struts>
Struts2的验证器:在xwork包下找到default.xml定义了各种验证器
<validators>
<validator name="required" class="com.opensymphony.xwork2.validator.validators.RequiredFieldValidator"/>
<validator name="requiredstring" class="com.opensymphony.xwork2.validator.validators.RequiredStringValidator"/>
<validator name="int" class="com.opensymphony.xwork2.validator.validators.IntRangeFieldValidator"/>
<validator name="long" class="com.opensymphony.xwork2.validator.validators.LongRangeFieldValidator"/>
<validator name="short" class="com.opensymphony.xwork2.validator.validators.ShortRangeFieldValidator"/>
<validator name="double" class="com.opensymphony.xwork2.validator.validators.DoubleRangeFieldValidator"/>
<validator name="date" class="com.opensymphony.xwork2.validator.validators.DateRangeFieldValidator"/>
<validator name="expression" class="com.opensymphony.xwork2.validator.validators.ExpressionValidator"/>
<validator name="fieldexpression" class="com.opensymphony.xwork2.validator.validators.FieldExpressionValidator"/>
<validator name="email" class="com.opensymphony.xwork2.validator.validators.EmailValidator"/>
<validator name="url" class="com.opensymphony.xwork2.validator.validators.URLValidator"/>
<validator name="visitor" class="com.opensymphony.xwork2.validator.validators.VisitorFieldValidator"/>
<validator name="conversion" class="com.opensymphony.xwork2.validator.validators.ConversionErrorFieldValidator"/>
<validator name="stringlength" class="com.opensymphony.xwork2.validator.validators.StringLengthFieldValidator"/>
<validator name="regex" class="com.opensymphony.xwork2.validator.validators.RegexFieldValidator"/>
<validator name="conditionalvisitor" class="com.opensymphony.xwork2.validator.validators.ConditionalVisitorFieldValidator"/>
</validators>
二、若两个请求进入一个Action,针对不同请求配置不同验证xml文件,取名时按照ActoinName-requestURI-validation.xml形式
对应两个请求的struts.xml
<struts>
<!-- 配置国际化资源文件 -->
<constant name="struts.custom.i18n.resources" value="i18n"></constant>
<package name="default" namespace="/" extends="struts-default">
<action name="testValidation" class="com.hcx.struts2.validation.app.TestValidationAction">
<result>/success.jsp</result>
<result name="input">/validation.jsp</result>
</action>
<action name="testValidation2" class="com.hcx.struts2.validation.app.TestValidationAction">
<result>/success.jsp</result>
<result name="input">/validation2.jsp</result>
</action>
</package>
</struts>
三、原理解析
Struts2默认的拦截器栈中,提供了validation拦截器