1. 手动验证的实现

只需要在继承ActionSupport类的情况下,直接重写validate()方法即可。使用validate()方法可以对用户请求的多个Action方法进行验证,但其验证的逻辑是相同的。如果在一个Action类中编写了多个请求处理方法,而此Action重写了validate()方法,那么,默认情况下,在执行每个请求方法的过程中,都会经过validate()方法的验证处理。

2. 验证文件的命名规则

使用Struts2验证框架,验证文件的名称需要遵循一定的命名规则,其验证文件的名称必须为ActionName-validation.xml或ActionName-AliasName-validation.xml的形式。其中ActionName是Action对象的名称,AliasName为Action配置中的名称,也就是struts.xml配置文件中Action元素对应name属性的名称。

  • 以ActionName-validation.xml方式命名

  在这种命名的方式中,数据的验证会作用于整个Action对象中,并验证Action对象的请求业务处理方法。如果Action对象中只存在单一的处理方法,或在多个请求处理的方法中,验证处理的规则都相同,可以应用此种命名方式。

  • 以ActionName-AliasName-validation.xml方式命名

  与上一种命名方式相比较,以ActionName-AliasName-validation.xml方式命名更加灵活。如果一个Action对象中包含多个请求处理方法,而又没有必要对每一个方法进行验证处理,值需要对Action对象中的特定方法进行处理,就可以使用此种命名方式。

3. 验证文件的编写风格

在Struts2框架中使用数据验证框架,其验证文件的编写有两种风格,也就是两种编写方法,分别为字段验证器编写风格与非字段验证器编写风格,它们各有优点。

4. Struts2高级技术典型应用

4.1 Struts2标签下的用户注册

例4.1 通过Struts2框架提供的表单标签编写用户注册表单,将用户的注册信息输出到JSP页面中。

(1)创建动态的Java Web项目,将Struts2的相关类包添加到项目的classpath,并在web.xml文件中注册Struts2提供的StrutsPrepareAndExecuteFilter过滤器,从而搭建Struts2的开发环境,具体代码如下:

  1. <?xml version="1.0" encoding="GBK"?>
  2. <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  3. <display-name>java_struts2</display-name>
  4. <welcome-file-list>
  5. <welcome-file>index.html</welcome-file>
  6. <welcome-file>index.htm</welcome-file>
  7. <welcome-file>index.jsp</welcome-file>
  8. <welcome-file>default.html</welcome-file>
  9. <welcome-file>default.htm</welcome-file>
  10. <welcome-file>default.jsp</welcome-file>
  11. </welcome-file-list>
  12. <!-- Struts2过滤器 -->
  13. <filter>
  14. <!-- 过滤器名称 -->
  15. <filter-name>struts2</filter-name>
  16. <!-- 过滤器类 -->
  17. <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
  18. </filter>
  19. <!-- Struts2过滤器映射 -->
  20. <filter-mapping>
  21. <!-- 过滤器名称 -->
  22. <filter-name>struts2</filter-name>
  23. <!-- 过滤器映射 -->
  24. <url-pattern>/*</url-pattern>
  25. </filter-mapping>
  26. </web-app>

(2)创建程序中的主页index.jsp,在主页面中通过Struts2框架提供的表单标签编写用户注册的表单。关键代码如下:

  1. <%@ page language="java" contentType="text/html; charset=UTF-8"
  2. pageEncoding="UTF-8"%>
  3. <%@ taglib uri="/struts-tags" prefix="s" %>
  4. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  5. <html>
  6. <head>
  7. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  8. <title>Insert title here</title>
  9. </head>
  10. <body>
  11. <h2>用户注册</h2>
  12. <s:form action="userAction" method="post">
  13. <s:textfield name="name" label="用户名" required="true" requiredposition="left"></s:textfield>
  14. <s:password name="password" label="密码" required="true" requiredposition="left"></s:password>
  15. <s:radio name="sex" list="#{1:'男',0:'女'}" label="性别" required="true" requiredposition="left"></s:radio>
  16. <s:select list="{'请选择省份','吉林','广东','山东','河南'}" name="province" label="省份"></s:select>
  17. <s:checkboxlist list="{'足球','羽毛球','乒乓球','篮球'}" name="hobby" label="爱好"></s:checkboxlist>
  18. <s:textarea name="description" cols="30" rows="5" label="描述"></s:textarea>
  19. <s:submit value="注册"></s:submit>
  20. <s:reset value="重置"></s:reset>
  21. </s:form>
  22. </body>
  23. </html>

在应用表单时,如果使用Struts2标签生成表单元素,可以用标签中的label属性,来定义表单元素前面的标签文字;如果表单中的元素属于一个必填的元素,那么可以使用required属性进行标记,其标记的效果会在元素的边缘显示一个字符“*”,同时这个字符“*”的位置也可以控制,通过requiredposition设置即可。

(3)创建用户注册后的返回页面success.jsp,在该页面中,通过Struts2的数据标签将用户注册信息输出到页面中。关键代码如下:

  1. <%@ page language="java" contentType="text/html; charset=UTF-8"
  2. pageEncoding="UTF-8"%>
  3. <%@ taglib uri="/struts-tags" prefix="s" %>
  4. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  5. <html>
  6. <head>
  7. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  8. <title>Insert title here</title>
  9. </head>
  10. <body>
  11. <div>
  12. <h2>用户注册信息</h2>
  13. <ul>
  14. <li>用户名:<s:property value="name"/></li>
  15. <li>密&nbsp;&nbsp;码:<s:property value="passward"/></li>
  16. <li>性&nbsp;&nbsp;别:<s:if test="sex==0"></s:if><s:else></s:else></li>
  17. <li>省&nbsp;&nbsp;份:<s:property value="province"/></li>
  18. <li>爱&nbsp;&nbsp;好:<s:property value="hobby"/></li>
  19. <li>描&nbsp;&nbsp;述:<s:property value="description"/></li>
  20. </ul>
  21. </div>
  22. </body>
  23. </html>

(4)创建名称为UserAction的类,该类继承于ActionSupport类,是一个Action对象,它的作用是对用户注册请求以及用户信息编辑请求进行处理。关键代码如下:

  1. package com.cn.action;
  2.  
  3. import com.opensymphony.xwork2.ActionSupport;
  4.  
  5. public class UserAction1 extends ActionSupport {
  6. private static final long serialVersionUID = 1L;
  7. private String name; //用户名
  8. private String password; //密码
  9. private String description; //描述
  10. private int sex=1; //性别
  11. private String province; //省份
  12. private String[] hobby; //爱好
  13. public String execute() throws Exception { //用户注册
  14. return SUCCESS;
  15. }
  16. public String getName() {
  17. return name;
  18. }
  19. public void setName(String name) {
  20. this.name = name;
  21. }
  22. public String getPassword() {
  23. return password;
  24. }
  25. public void setPassword(String password) {
  26. this.password = password;
  27. }
  28. public String getDescription() {
  29. return description;
  30. }
  31. public void setDescription(String description) {
  32. this.description = description;
  33. }
  34. public int getSex() {
  35. return sex;
  36. }
  37. public void setSex(int sex) {
  38. this.sex = sex;
  39. }
  40. public String getProvince() {
  41. return province;
  42. }
  43. public void setProvince(String province) {
  44. this.province = province;
  45. }
  46. public String[] getHobby() {
  47. return hobby;
  48. }
  49. public void setHobby(String[] hobby) {
  50. this.hobby = hobby;
  51. }
  52.  
  53. }

(5)创建Struts2框架的配置文件struts.xml,在该文件中配置UserAction对象。关键代码如下:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE struts PUBLIC
  3. "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
  4. "http://struts.apache.org/dtds/struts-2.3.dtd">
  5. <struts>
  6. <!-- 声明常量(开发模式) -->
  7. <constant name="struts.devMode" value="true"></constant>
  8. <!-- 声明常量(在Struts的配置文件修改后,自动加载) -->
  9. <constant name="struts.configuration.xml.reload" value="true"></constant>
  10. <!-- 声明包 -->
  11. <package name="myPackage" extends="struts-default" namespace="/">
  12. <!-- 定义action -->
  13. <action name="userAction" class="com.cn.action.UserAction">
  14. <!-- 注册成功的返回页面 -->
  15. <result>success.jsp</result>
  16. </action>
  17. </package>
  18. </struts>

示例运行后,用户注册界面如下所示:

若注册后的页面出现中文乱码,把所有网页的编码方式设为"UTF-8"即可。

4.2  使用验证框架对数据校验

例4.2 应用Struts2验证框架对用户登录页面进行输入验证。

(1)创建动态的Java Web项目,将Struts2的相关类包添加到项目的classpath,并在web.xml文件中注册Struts2提供的StrutsPrepareAndExecuteFilter过滤器,从而搭建Struts2的开发环境,具体代码如下:

  1. <?xml version="1.0" encoding="GBK"?>
  2. <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  3. <display-name>java_struts2</display-name>
  4. <welcome-file-list>
  5. <welcome-file>index.html</welcome-file>
  6. <welcome-file>index.htm</welcome-file>
  7. <welcome-file>index.jsp</welcome-file>
  8. <welcome-file>default.html</welcome-file>
  9. <welcome-file>default.htm</welcome-file>
  10. <welcome-file>default.jsp</welcome-file>
  11. </welcome-file-list>
  12. <!-- Struts2过滤器 -->
  13. <filter>
  14. <!-- 过滤器名称 -->
  15. <filter-name>struts2</filter-name>
  16. <!-- 过滤器类 -->
  17. <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
  18. </filter>
  19. <!-- Struts2过滤器映射 -->
  20. <filter-mapping>
  21. <!-- 过滤器名称 -->
  22. <filter-name>struts2</filter-name>
  23. <!-- 过滤器映射 -->
  24. <url-pattern>/*</url-pattern>
  25. </filter-mapping>
  26. </web-app>

(2)创建用户登录的Action对象UserAction,并将UserAction配置到struts.xml配置文件中,具体代码如下:

UserAction.java

  1. package com.cn.action;
  2.  
  3. import com.opensymphony.xwork2.ActionSupport;
  4.  
  5. public class UserAction2 extends ActionSupport {
  6. private static final long serialVersionUID = 1L;
  7. private String username; //用户名
  8. private String password; //密码
  9. //用户登录
  10. @Override
  11. public String execute() throws Exception {
  12. return SUCCESS;
  13. }
  14. public String getUsername() {
  15. return username;
  16. }
  17. public void setUsername(String username) {
  18. this.username = username;
  19. }
  20. public String getPassword() {
  21. return password;
  22. }
  23. public void setPassword(String password) {
  24. this.password = password;
  25. }
  26.  
  27. }

在struts.xml中的配置如下:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE struts PUBLIC
  3. "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
  4. "http://struts.apache.org/dtds/struts-2.3.dtd">
  5. <struts>
  6. <!-- 声明常量(开发模式) -->
  7. <constant name="struts.devMode" value="true"></constant>
  8. <!-- 声明常量(在Struts的配置文件修改后,自动加载) -->
  9. <constant name="struts.configuration.xml.reload" value="true"></constant>
  10. <!-- 声明包 -->
  11. <package name="myPackage" extends="struts-default" namespace="/">
  12. <!-- 定义action -->
  13. <action name="userAction" class="com.cn.action.UserAction">
  14. <!-- 用户登录页面 -->
  15. <result name="input">login.jsp</result>
  16. <!-- 登录成功的返回页面 -->
  17. <result>success.jsp</result>
  18. </action>
  19. </package>
  20. </struts>

在struts.xml中配置文件中,请求处理成功的映射结果是success.jsp页面,验证失败返回用户登录页面login.jsp。

注意:默认情况下,Struts2的验证框架验证失败后会返回input对应的页面,所以需要指定input值对应的页面。

(3)创建用户登录页面login.jsp,在该页面中通过Struts2的表单标签创建用户登录表单。关键代码如下:

  1. <%@ page language="java" contentType="text/html; charset=UTF-8"
  2. pageEncoding="UTF-8"%>
  3. <%@ taglib uri="/struts-tags" prefix="s" %>
  4. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  5. <html>
  6. <head>
  7. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  8. <title>Insert title here</title>
  9. </head>
  10. <body>
  11. <s:form action="userAction" method="post">
  12. <s:textfield name="username" label="用户名" required="true"></s:textfield>
  13. <s:password name="password" label="密码" required="true"></s:password>
  14. <s:submit key="submit" value="登录"></s:submit>
  15. </s:form>
  16. </body>
  17. </html>

(4)创建名称为success.jsp的JSP页面,该页面是用户成功登录的返回页面。关键代码如下:

  1. <%@ page language="java" contentType="text/html; charset=UTF-8"
  2. pageEncoding="UTF-8"%>
  3. <%@ taglib uri="/struts-tags" prefix="s" %>
  4. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  5. <html>
  6. <head>
  7. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  8. <title>Insert title here</title>
  9. </head>
  10. <body>
  11. <h2>
  12. <s:property value="username"/>,登录成功!
  13. </h2>
  14. </body>
  15. </html>

(5)编写用户登录的验证文件,该文件的名称为UserAction-validation.xml。关键代码如下:

  1. <?xml version="1.0" encoding="GBK"?>
  2. <!DOCTYPE validators PUBLIC "-//Apache Struts//XWork Validator 1.0.2//EN"
  3. "http://struts.apache.org/dtds/xwork-validator-1.0.2.dtd">
  4.  
  5. <validators>
  6. <field name="username">
  7. <field-validator type="requiredstring">
  8. <message>用户名不能为空</message>
  9. </field-validator>
  10. </field>
  11. <field name="password">
  12. <field-validator type="requiredstring">
  13. <message>密码不能为空</message>
  14. </field-validator>
  15. <field-validator type="stringlength">
  16. <param name="maxLength">10</param>
  17. <param name="minLength">5</param>
  18. <message>密码长度应该在${minLength}--${maxLength}位之间</message>
  19. </field-validator>
  20. </field>
  21. </validators>

注意:验证文件UserAction-validation.xml必须放置在UserAction所在的包中。

运行程序后,进入到用户登录页面login.jsp,如下所示:

如果没有输入用户名、密码的情况下,单击”登录“按钮,页面会停留在login.jsp页面中,如下所示:

如果密码输入的长度不对,页面显示如下内容:

Struts2数据验证机制的更多相关文章

  1. Struts2数据验证与使用Java代码进行数据验证

    Struts2数据验证 使用Java代码进行数据验证 重写ActionSupport的validate()方法 对Action类的中所有请求处理方法都会进行验证! 对Action类的数据属性进行检查, ...

  2. 【ASP.NET基础】客户端、服务器端的数据验证 + CKEditer

    1, 客户端 用Javascript进行验证,直接提示用户输入的数据是否符合规范,是否合法. 这样体验行比较好,客户端立即就可以得到反馈,而且减少了服务器端的数据交互. 这样前端数据验证并不是很安全, ...

  3. ASP.NET MVC- 数据验证机制

    ASP.NET MVC的数据验证机制,比起ASP.NET WEBFORM那种高效很多.下面记录以下两个示例,以便日后方便查阅. 方式一:在Controller里通过AddModelError方法返回错 ...

  4. Silverlight实例教程 - Validation服务器端异步数据验证(转载)

    摘要:本 篇实例,我们仍旧使用SilverlightValidationDemo项目,为了不和过去的验证方法冲突,这里我们创建一个新的数据成员类 Staff,该类实现INotifyDataErrorI ...

  5. Silverlight实例教程 - Validation客户端同步数据验证(转载)

    摘要:在Silverlight 4中,Silverlight Validation有相对的改进,本篇将介绍Silverlight 4中新加入的验证机制功能,IDataErrorInfo客户端同步验证机 ...

  6. struts2 的验证框架validation如何返回json数据 以方便ajax交互

    struts2 的验证框架validation简单,好用,但是input只能输出到jsp页面通过struts2的标签<s:fielderror  />才能取出,(EL应该也可以). 如果使 ...

  7. 定制Asp.NET 5 MVC内建身份验证机制 - 基于自建SQL Server用户/角色数据表的表单身份验证

    背景 在需要进行表单认证的Asp.NET 5 MVC项目被创建后,往往需要根据项目的实际需求做一系列的工作对MVC 5内建的身份验证机制(Asp.NET Identity)进行扩展和定制: Asp.N ...

  8. Struts2(二)之封装请求正文、数据类型转换、数据验证

    一.封装请求正文到对象中(重点) 1.1.静态参数封装 在struts.xml文件中,给动作类注入值,使用的是setter方法 1.2.动态参数封装 通过用户表单封装请求正文参数 1.2.1.动作类作 ...

  9. struts2(三)---struts2中的服务端数据验证框架validate

    struts2为我们提供了一个很好的数据验证框架–validate,该框架可以很方便的实现服务端的数据验证. ActionSupport类提供了一个validate()方法,当我们需要在某一个acti ...

随机推荐

  1. 久邦数码(3G门户)面试

    久邦数码(3G门户)面试 1.数组和链表的区别(为什么数组带有索引) 2.数据库(手写选出一个公司年龄最大的100个员工) 3.一百个数查找一个数 利用二分查找一个数在最差的情况下至少比较多少次 4. ...

  2. Socket编程(一):建立与客户端的连接并接受数据

    我们这里利用Socket在模拟一个客户端与服务器通信,其实客户端与服务端通信就像人与人打电话一样,想要给一个人打电话,我们首先必须要有手机,必须知道对方的手机号码,这里Socket就好比一部手机,而短 ...

  3. 七牛刷新接口PHP实现

    <?php require_once '../autoload.php'; use Qiniu\Auth; use Qiniu\Http\Client; $accessKey = 'access ...

  4. Sublime Text的使用技巧

    来到腾讯之后,基本上整个团队都在使用Sublime Text这款编辑神器.虽说自己以前在写python的时候略有接触过,但只是把它当做简单的文本编辑器.来到这边后,才逐渐的体会到这款神作的牛逼之处. ...

  5. 我的OI生涯 第五章

    我的OI生涯 第五章 千古诗才,蓬莱文章建安骨 一身傲骨,青莲居士谪仙人 李白追月逆江河 包黑斩龙顺民心 豪气压群雄,能使力士脱靴,贵妃捧砚; 仙才媲众美,不让参军俊逸,开府清新 我辈此中惟饮酒 先生 ...

  6. [BZOJ2281][SDOI2011]黑白棋(K-Nim博弈)

    2281: [Sdoi2011]黑白棋 Time Limit: 3 Sec  Memory Limit: 512 MBSubmit: 626  Solved: 390[Submit][Status][ ...

  7. poj 1485 dp

    转自:http://www.cnblogs.com/kuangbin/archive/2011/11/12/2246407.html [题目大意] 一条公路上有n个旅馆,选出其中k个设置仓库,一个仓库 ...

  8. 【8.20校内测试】【DP】【二分+贪心】

    一开始想的贪心,可是发现贪心的问题太多了啊!只能保证当前最优,全局完全无法考虑. 所以正解是dp.预处理出前缀和,枚举每个区间,在每个点记录$now[i]$表示以$i$这个塔结尾的塔组目前的高度.$d ...

  9. bzoj 3784

    第三道点分治. 首先找到黄学长的题解,他叫我参考XXX的题解,但已经没有了,然后找到另一个博客的简略题解,没看懂,最后看了一个晚上黄学长代码,写出来然后,写暴力都拍了小数据,但居然超时,....然后改 ...

  10. yaf学习

    <?php 安装 phpize ./configure --with-php-config=/usr/local/php/bin/php-config 路由类 final Yaf_Router ...