资源描述
Struts2温习(8)--表单验证的两种方式
XMLSpringJSP浏览器
1. Struts2中的输入校验
2. 编码方式校验
1) Action一定要继承自ActionSupport
2) 针对某个要进行校验的请求处理方法编写一个 public void validateXxx()方法,在方法内部进行表单数据校验.
3) 也可针对所有的请求处理方法编写public void validate()方法。
4) 在校验方法中,可以通过addFieldError()方法来添加字段校验错误消息。
5) 当校验失败时,Struts框架会自动跳转到name为input的Result页面。在校验失败页面中,可以使用<s:fielderror/>来显示错误消息
6) 简单,灵活。但重用性不高。
3. XML配置方式校验。在编码方式之前被执行。
1) 针对要校验的Action类,在同包下编写一个名为:Action类名-validation.xml校验规则文件。
2) 在校验规则文件中添加校验规则:具体的校验器名,参数可参看Struts2的reference或Struts2的API。
a) Field校验:针对Action类中每个非自定义类型的Field进行校验的规则。
<field name="要校验的Field名">
<field-validator type="校验规则器名" short-circuit="是否要短路径校验(默认是false)">
<param name="校验器要使用的参数名">值</param>
<message>校验失败时的提示消息</message>
</field-validator>
<!-- 还可添加其它的校验规则 -->
</field>
b) 非Field校验:针对Action类的某些Field使用OGNL表达进行组合校验。
<validator type="fieldexpression">
<param name="fieldName">pwd</param>
<param name="fieldName">pwd2</param>
<param name="expression"><![CDATA[pwd==pwd2]]></param><!-- OGNL表达式 -->
<message>确认密码和密码输入不一致</message>
</validator>
c) visitor校验:主要是用来校验Action类中的自定义类型Field。(针对使用模型驱动方式时)
i) 在Action类的的校验规则文件中针对自定义类型Field使用visitor校验规则。
<!-- 针对自定义Field使用visitor校验 -->
<field name="user">
<field-validator type="required" short-circuit="true">
<message>用户的信息必填</message><!-- 消息前缀 -->
</field-validator>
<field-validator type="visitor"><!-- 指定为visitor校验规则 -->
<param name="context">userContext</param><!-- 指定本visitor校验的上下文名 -->
<param name="appendPrefix">true</param><!-- 是否要添加校验失败消息的前缀 -->
<message>用户的</message><!-- 消息前缀 -->
</field-validator>
</field>
ii) 针对visitor的Field编写一个校验规则文件.文件名为: visitor字段类型名[-visitor校验的上下文名]-validation.xml. 例如: 本例中的文件名为User-userContext-validation.xml
注意: 此文件要存放到visitor字段类型所在的包下.
iii) 在visitor的Field校验规则文件中针对要校验的Field添加校验规则.
3) 在校验失败页面(名为input的result页面)中,可以使用<s:fielderror/>来显示错误消息。
4) 默认情况下,XML的校验规则对Action中所有的请求处理方法生效.此时应该只针对每个要校验的请求处理方法指定校验。有两种方式:
i) 只为Action中的指定方法指定校验规则文件,配置文件命名为:Action类型名-别名-validation.xml,
别名是要校验的方法对应的Action标签的name属性值。
如:UserAction在struts2.xml的配置为:
<package name="my" extends="struts-default" namespace="/">
<action name="user_*" class="com.javacrazyer.web.action.UserAction" method="{1}">
<result name="success">/info.jsp</result>
<result name="input">/user_{1}.jsp</result>
</action>
</package>
● UserAction中有registe方法和login方法,要对registe方法进行校验,则它的校验规则文件名为:UserAction-user_registe-validation.xml。
● 如果使用visitor校验器,必需指定visitor校验的上下文名。
ii) 在校验拦截器中指定要验证的方法。不太实用。
<action name="user_*" class="com.javacrazyer.web.action.UserAction" method="{1}">
<result name="success">/info.jsp</result>
<result name="input">/user_{1}.jsp</result>
<interceptor-ref name="defaultStack">
<!-- 给校验拦截器指定不进行校验的方法列表:用逗号隔开 -->
<param name="validation.excludeMethods">*</param>
<!-- 给校验拦截器指定要进行校验的方法列表:用逗号隔开 -->
<param name="validation.includeMethods">regist</param>
</interceptor-ref>
</action>
5) 同时使用客户端校验和服务器端校验
i) 设置<s:form>标签的validate属性:
false:默认值。校验框架只执行服务器端校验。
true:先执行客户端校验,然后再执行服务器端校验。
form标签会根据你在服务器端配置的验证规则生成对应的JavaScript验证代码。
目前支持的内置校验器:required、requiredstring、stringlength、regex validator、email、url、int、double
ii) 不太好用,不建议使用。建议使用jQuery进行页面表单校验。
6) 自定义校验器:
i) 继承自FieldValidatorSupport抽象类。重写validate(Object obj)方法
ii) 注册校验器类. 在应用程序的classpath下新建一校验器注册文件。名为validators.xml,内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC
"-//OpenSymphony Group//XWork Validator Config 1.0//EN"
"
<validators>
<validator name="校验器名" class="校验器类的全限定名"/>
</validators>
4. Annotation方式校验: Struts2提供了注解的方式校验
1) @Validation 指明这个类或者接口将使用基于注解的校验。Struts2.1中已被标识为过时。
2) @Validations() 在同一个方法上要使用多个注解校验时。
3) @SkipValidation 指定某个方法不需要校验。否则所有方法都会使用校验。也可以在检验拦截器中使用validateAnnotatedMethodOnly
4) 13个内置校验器的注解版本:(注:这些注解都只能用在方法级别上) 具体参数参见Struts2的API或Reference。
@RequiredFieldValidator
@RequiredStringValidator
@StringLengthFieldValidator
@IntRangeFieldValidator
@DoubleRangeFieldValidator
@DateRangeFieldValidator
@ExpressionValidator
@FieldExpressionValidator
@RegexFieldValidator
@EmailValidator
@UrlValidator
@VisitorFieldValidator
@ConversionErrorFieldValidator
第一个示例:XML配置式校验器---注册页面
acc_registe.jsp
Html代码
1. <span style="font-size: medium;"><%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
2. <%@ taglib uri="/struts-tags" prefix="s" %>
3. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
4. <html>
5. <head>
6. <title>Struts2中基于XML配置式的校验器使用示例</title>
7. </head>
8. <body>
9. <h3>XML配置式校验器---注册页面</h3><hr/>
10.
11. <div style="color:red"><s:fielderror/></div>
12. <form action="acc_registe.action" method="post">
13. <table>
14. <tr>
15. <td>ID</td>
16. <td><input type="text" name="id" value="${param.id}"/></td>
17. </tr>
18. <tr>
19. <td>登录名</td>
20. <td><input type="text" name="name" value="${param.name}"/></td>
21. </tr>
22. <tr>
23. <td>密码</td>
24. <td><input type="password" name="pwd"/></td>
25. </tr>
26. <tr>
27. <td>重复密码</td>
28. <td><input type="password" name="pwd2"/></td>
29. </tr>
30. <tr>
31. <td>时间</td>
32. <td><input type="text" name="registed_date" value="${param.registed_date}"/></td>
33. </tr>
34. <tr>
35. <td>email</td>
36. <td><input type="text" name="email" value="${param.email}"/></td>
37. </tr>
38. <tr>
39. <td>考试成绩</td>
40. <td><input type="text" name="score" value="${param.score}"/></td>
41. </tr>
42. <tr>
43. <td colspan="2"><input type="submit" value=" 提交 "/></td>
44. </tr>
45. </table>
46. </form>
47. </body>
48. </html></span>
src/struts.xml
Java代码
1. <span style="font-size: medium;"><?xml version="1.0" encoding="UTF-8" ?>
2. <!DOCTYPE struts PUBLIC
3. "-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN"
4. "http://struts.apache.org/dtds/struts-2.1.7.dtd">
5.
6. <struts>
7. <!-- 请求参数的编码方式 -->
8. <constant name="struts.i18n.encoding" value="UTF-8"/>
9. <!-- 指定被struts2处理的请求后缀类型。多个用逗号隔开 -->
10. <constant name="struts.action.extension" value="action,do,go,xkk"/>
11. <!-- 当struts.xml改动后,是否重新加载。默认值为false(生产环境下使用),开发阶段最好打开 -->
12. <constant name="struts.configuration.xml.reload" value="true"/>
13. <!-- 是否使用struts的开发模式。开发模式会有更多的调试信息。默认值为false(生产环境下使用),开发阶段最好打开 -->
14. <constant name="struts.devMode" value="false"/>
15. <!-- 设置浏览器是否缓存静态内容。默认值为true(生产环境下使用),开发阶段最好关闭 -->
16. <constant name="struts.serve.static.browserCache" value="false" />
17. <!-- 是否允许在OGNL表达式中调用静态方法,默认值为false -->
18. <constant name="struts.ognl.allowStaticMethodAccess" value="true"/>
19.
20. <!-- 指定由spring负责action对象的创建
21. <constant name="struts.objectFactory" value="spring" />
22. -->
23. <!-- 是否开启动态方法调用 -->
24. <constant name="struts.enable.DynamicMethodInvocation" value="false"/>
25.
26. <package name="my" extends="struts-default" namespace="/">
27. <action name="acc_*" class="com.javacrazyer.web.action.AccountAction" method="{1}">
28. <result name="success">/info.jsp</result>
29. <result name="input">/acc_{1}.jsp</result>
30. </action>
31.
32. </package>
33.
34. </struts>
35. </span>
AccountAction.java
Java代码
1. <span style="font-size: medium;">package com.javacrazyer.web.action;
2.
3. import java.util.Date;
4.
5. import com.opensymphony.xwork2.ActionSupport;
6.
7.
8. public class AccountAction extends ActionSupport {
9. private static final long serialVersionUID = -1418893621512812472L;
10. private Integer id;
11. private String name;
12. private String pwd;
13. private String pwd2;
14. private Double score;
15. private Date registed_date;
16. private String email;
17.
18. public String registe() throws Exception{
19. System.out.println("registe-------------------");
20. return SUCCESS;
21. }
22.
23. public String login()throws Exception{
24. return SUCCESS;
25. }
26.
27. public Integer getId() {
28. return id;
29. }
30. public void setId(Integer id) {
31. this.id = id;
32. }
33. public String getName() {
34. return name;
35. }
36. public void setName(String name) {
37. this.name = name;
38. }
39. public Double getScore() {
40. return score;
41. }
42. public void setScore(Double score) {
43. this.score = score;
44. }
45. public Date getRegisted_date() {
46. return registed_date;
47. }
48. public void setRegisted_date(Date registedDate) {
49. registed_date = registedDate;
50. }
51. public String getEmail() {
52. return email;
53. }
54. public void setEmail(String email) {
55. this.email = email;
56. }
57.
58. public String getPwd() {
59. return pwd;
60. }
61.
62. public void setPwd(String pwd) {
63. this.pwd = pwd;
64. }
65.
66. public String getPwd2() {
67. return pwd2;
68. }
69.
70. public void setPwd2(String pwd2) {
71. this.pwd2 = pwd2;
72. }
73. }</span>
AccountAction-validation.xml [与AccountAction同目录]
Java代码
1. <span style="font-size: medium;"><?xml version="1.0" encoding="UTF-8"?>
2. <!DOCTYPE validators PUBLIC
3. "-//OpenSymphony Group//XWork Validator 1.0.2//EN"
4. "
5. <validators>
6. <!-- 字段校验 -->
7. <field name="id">
8. <field-validator type="required" short-circuit="true">
9. <message>ID必填的</message>
10. </field-validator>
11. <field-validator type="int">
12. <param name="min">20</param>
13. <param name="max">50</param>
14. <message>ID必须在 ${min} 到 ${max} 之间</message>
15. </field-validator>
16. </field>
17. <field name="name">
18. <field-validator type="requiredstring" short-circuit="true">
19. <message>姓名是必填的</message>
20. </field-validator>
21. <field-validator type="regex">
22. <param name="expression"><![CDATA[(^[a-zA-Z_]\w{3,9}$)]]></param>
23. <message>姓名不合法</message>
24. </field-validator>
25. </field>
26. <field name="pwd">
27. <field-validator type="requiredstring" short-circuit="true">
28. <message>密码是必填的</message>
29. </field-validator>
30. </field>
31.
32. <!-- 非字段校验 -->
33. <validator type="fieldexpression">
34. <param name="fieldName">pwd</param>
35. <param name="fieldName">pwd2</param>
36. <param name="expression"><![CDATA[pwd==pwd2]]></param><!-- OGNL表达式 -->
37. <message>确认密码和密码输入不一致</message>
38. </validator>
39.
40. <field name="score">
41. <field-validator type="double">
42. <param name="minInclusive">0.0</param>
43. <param name="maxInclusive">100.0</param>
44. <message>成绩必须在${minInclusive}和${maxInclusive}之间</message>
45. </field-validator>
46. </field>
47. <field name="email" >
48. <field-validator type="regex">
49. <param name="expression"><![CDATA[(^[_A-Za-z0-9-]+(\.[_A-Za-z0-9-]+)*@([A-Za-z0-9-])+((\.com)|(\.cn)|(\.net)|(\.org)|(\.info)|(\.edu)|(\.mil)|(\.gov)|(\.biz)|(\.ws)|(\.us)|(\.tv)|(\.cc)|(\.aero)|(\.arpa)|(\.coop)|(\.int)|(\.jobs)|(\.museum)|(\.name)|(\.pro)|(\.travel)|(\.nato)|(\..{2,3})|(\..{2,3}\..{2,3}))$)]]></param>
50. <message>邮箱不合法</message>
51. </field-validator>
52. </field>
53.
54. <field name="registed_date">
55. <field-validator type="date">
56. <param name="min">1970-01-01</param>
57. <param name="max">2019-01-01</param>
58. <message>注册日期不合法</message>
59. </field-validator>
60. </field>
61. </validators></span>
第二个示例:XML配置式校验器---登录和注册页面
user_login.jsp
Html代码
1. <span style="font-size: medium;"><%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
2. <%@ taglib uri="/struts-tags" prefix="s" %>
3. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
4. <html>
5. <head>
6. <title>Struts2中基于XML配置式的校验器使用示例</title>
7. </head>
8. <body>
9. <h3>XML配置式校验器---登录页面</h3><hr/>
10. <div style="color:red"><s:fielderror/></div>
11. <form action="user_login.action" method="post">
12. <table>
13. <tr>
14. <td>登录名</td>
15. <td><input type="text" name="user.name" value="${param['user.name']}"/></td>
16. </tr>
17. <tr>
18. <td>密码</td>
19. <td><input type="password" name="user.pwd"/></td>
20. </tr>
21. <tr><td colspan="2"><input type="submit" value=" 提交 "/></td></tr>
22. </table>
23. </form>
24. </body>
25. </html></span>
user_registe.jsp
Html代码
1. <span style="font-size: medium;"><%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
2. <%@ taglib uri="/struts-tags" prefix="s" %>
3. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
4. <html>
5. <head>
6. <title>Struts2中基于XML配置式的校验器使用示例</title>
7. </head>
8. <body>
9. <h3>XML配置式校验器---注册页面</h3><hr/>
10.
11. <div style="color:red"><s:fielderror/></div>
12. <form action="user_registe.action" method="post">
13. <table>
14. <tr>
15. <td>ID</td>
16. <td><input type="text" name="user.id" value="${param['user.id']}"/></td>
17
展开阅读全文