问题:如果一个Action类需要应对多个action请求,且每个action 请求的验证规则有不一样,该如何处理?
> 为每一个不同的 action 请求定义其对应的验证文件: ActionClassName_AliasName_validation.xml
> 不带别名的配置文件: ActionClassName-validation.xml 中的验证规则依然会发生作用. 可以把每个 action 公共的验证规则配置在其中. 但需要注意的是, 只适用于某一个 action 的请求的验证规则就不要这里再配置了.
示例如下
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 我是分割线~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
项目结构
类
person 类 和Action 类详见:如何进行声明式验证之字段验证? 中的 person 类 和Action
验证器:
爸爸:公用验证器 TestAgeValidation-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">1</param>
<param name="max">130</param>
<message key="error.int"></message>
</field-validator>
</field>
<!--
像非空验证,就可以写在公共验证器中
<field name="age">
<field-validator type="required">
<message>age must not be null</message>
</field-validator>
</field>
-->
</validators>
<!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">10</param>
<param name="max">50</param>
<message key="error.int"></message>
</field-validator>
</field>
</validators>
儿子2:TestAgeValidation-testAge2-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">51</param>
<param name="max">90</param>
<message key="error.int"></message>
</field-validator>
</field>
</validators>
国际化资源文件
基类: nihao.properties
username=UserName
password=Password
submit=Submit
time=Time:{0}
error.int=Age needs to be between ${min} and ${max}
age=Age
中文 :nihao_zh_CN.properties
username=\u7528\u6237\u540D
password=\u5BC6\u7801
submit=\u63D0\u4EA4
time=\u65F6\u95F4:{0}
time2=\u65F6\u95F4:${birth}
error.int=\u5E74\u9F84\u9700\u8981\u5728 ${min} \u548C ${max}\u4E4B\u95F4
age=\u5E74\u9F84
英文:nihao_en_US.properties
username=UserName
password=Password
submit=Submit
time=Time:{0}
time2=Time:${birth}
error.int=Age needs to be between ${min} and ${max}
age=Age
配置 : struts.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<!-- 配置全局的国际化资源文件 -->
<constant name="struts.custom.i18n.resources" value="nihao"></constant>
<package name="default" namespace="/" extends="struts-default">
<!-- 这个就是起烂笔头的作用 -->
<interceptors>
<interceptor-stack name="baiduStack">
<interceptor-ref name="paramsPrepareParamsStack">
<param name="prepare.alwaysInvokePrepare">false</param>
</interceptor-ref>
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="baiduStack"/>
<action name="testAge1" class="com.baidu.ActionValidation.TestAgeValidation">
<result>/validation.jsp</result>
<result name="input">/validation.jsp</result>
</action>
<action name="testAge2" class="com.baidu.ActionValidation.TestAgeValidation">
<result>/validation.jsp</result>
<result name="input">/validation2.jsp</result>
</action>
<!-- 中英文切换 是要使i18n 拦截器工作,因此是要使用一个action请求去调动其工作 -->
<!-- index.jsp 通过action 转到 validation.jsp -->
<action name="testVali" >
<result>/validation.jsp</result>
</action>
<action name="testAge3" >
<result>/validation.jsp</result>
</action>
</package>
</struts>
页面 JSP
index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!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=UTF-8">
<title>Insert title here</title>
</head>
<body>
<br><br>
<!-- 实验中英文切换 -->
<a href="testVali.action"> To validation </a>
<br><br>
<a href="validation2.jsp"> To validation2 </a>
</body>
</html>
validation.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ 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=UTF-8">
<title>Insert title here</title>
</head>
<body>
<br><br>
<a href="testAge1.action?request_locale=zh_CN">中文</a>
<a href="testAge1.action?request_locale=en_US">English</a>
<br><br>
<a href="index.jsp">主页</a>
<center>
<s:fielderror fieldName="age"></s:fielderror>
<br><br>
<s:form action="testAge1" theme="simple" >
<s:text name="age"></s:text> <s:textfield name="age" label="Age"></s:textfield>
<s:submit></s:submit>
</s:form>
</center>
</body>
</html>
validation2.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ 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=UTF-8">
<title>Insert title here</title>
</head>
<body>
<s:debug></s:debug>
<center>
fieldErrors.age[0]: ${fieldErrors.age[0] }
<br><br>
fieldErrors.age[1]: ${fieldErrors.age[1] }
<br><br>
<br><br>
s:fielderror: <s:fielderror fieldName="age"></s:fielderror>
<br><br>
<s:form action="testAge2" theme="simple" >
<s:text name="age"></s:text> <s:textfield name="age" label="Age"></s:textfield>
<s:submit></s:submit>
</s:form>
</center>
</body>
</html>
success.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ 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=UTF-8">
<title>Insert title here</title>
</head>
<body>
Age:<s:property value="age" />
<h3>恭喜你有为青年!</h3>
</body>
</html>
效果:
通过实验 我们知道了 爸爸验证器 TestAgeValidation-validation.xml 和 儿子验证器 TestAgeValidation-testAge1-validation.xml
与 TestAgeValidation-testAge2-validation.xml ,分别有什么作用,及名命名规则:
爸爸的命名规则:ActionClassName_validation.xml
儿子的命名规则:ActionClassName_AliasName_validation.xml
现在孩子都是宝贝蛋 ,因此要放在父母中间,这样安全!