1. 1:采用手工编写代码实现。
  2. 通过继承ActionSupport类,然后重写vlidate方法,validate方法会校验跟execute同样签名的方法,当某个数据校验失败时,我们应该调用addFieldError()这个方法向系统的FieldError添加信息,如果校验失败了,Struts2会自动转发到名为inputresult这个结果页上面,在input视图上可以通过<s:fielderror /> 这样一个标签来获得失败信息,这样就可以完成一个校验了,具体代码如下
  3. index.jsp:提供用户输入的界面,这个form表单提交方向大家看好了。
  4.  
  5. Java代码 收藏代码
  6. <%@ page language="java" contentType="text/html; charset=UTF-8"
  7. pageEncoding="UTF-8"%>
  8. <%@ taglib uri="/struts-tags" prefix="s" %>
  9. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  10. <html>
  11. <head>
  12. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  13. <title>Insert title here</title>
  14. </head>
  15. <body>
  16. <span style="color: #ff0000;"><s:fielderror /></span>
  17. <span style="color: #000000;"><form </span><span style="color: #ff0000;">action="${pageContext.request.contextPath }/manager_update"</span><span style="color: #000000;"> method="post"> </span>
  18. 用户名:<input type="text" name="username" />不能为空<br />
  19. 手机号:<input type="text" name="mobile" />不能为空,必须符合手机号1,3/5/8,后面9个数字<br />
  20. <input type="submit" value="提交" />
  21. </form>
  22. </body>
  23. </html><br>
  24. message.jsp:用户输入正确的话就来到此页面
  25.  
  26. Java代码 收藏代码
  27. <%@ page language="java" contentType="text/html; charset=UTF-8"
  28. pageEncoding="UTF-8"%>
  29. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  30. <html>
  31. <head>
  32. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  33. <title>Insert title here</title>
  34. </head>
  35. <body>
  36. ${message }<br />
  37. </body>
  38. </html>
  39.  
  40. struts.xml:里面的Action名字采用了一个通配符,为后面讲解校验范围做测试
  41.  
  42. Java代码 收藏代码
  43. <?xml version="1.0" encoding="UTF-8" ?>
  44. <!DOCTYPE struts PUBLIC
  45. "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
  46. "http://struts.apache.org/dtds/struts-2.1.dtd">
  47.  
  48. <struts>
  49. <package name="yuan2" namespace="/" extends="struts-default">
  50. <action name="manager_*" class="com.ambow.Action.PersonAction" method="{1}">
  51. <result name="message">/WEB-INF/page/message.jsp</result>
  52. <result name="input">/index.jsp</result>
  53. </action>
  54. </package>
  55. </struts>
  56. PersonAction
  57.  
  58. Java代码 收藏代码
  59. package com.ambow.Action;
  60.  
  61. import java.util.regex.Pattern;
  62.  
  63. import com.opensymphony.xwork2.ActionContext;
  64. import com.opensymphony.xwork2.ActionSupport;
  65.  
  66. public class PersonAction extends ActionSupport {
  67.  
  68. private String username ;
  69. private String mobile ;
  70. public String getUsername() {
  71. return username;
  72. }
  73. public void setUsername(String username) {
  74. this.username = username;
  75. }
  76. public String getMobile() {
  77. return mobile;
  78. }
  79. public void setMobile(String mobile) {
  80. this.mobile = mobile;
  81. }
  82.  
  83. public String save(){
  84. ActionContext.getContext().put("message", "保存成功!") ;
  85. return "message" ;
  86. }
  87.  
  88. public String update(){
  89. ActionContext.getContext().put("message", "更新成功!") ;
  90. return "message" ;
  91. }
  92. @Override
  93. public String execute() throws Exception {
  94. // TODO Auto-generated method stub
  95. return super.execute();
  96. }
  97. public void validate() {//会对所有的Action起作用
  98. if(username == null || "".equals(this.username.trim())){
  99. this.addFieldError("username", "用户名不能为空") ;
  100. }
  101. if(mobile == null || "".equals(this.mobile.trim())){
  102. this.addFieldError("mobile", "手机号不能为空") ;
  103. }else{
  104. if(!Pattern.compile("^1[3,5,8]\\d{9}$").matcher(this.mobile).matches()){
  105. this.addFieldError("mobile", "手机号格式不正确") ;
  106. }
  107. }
  108. super.validate();
  109. }
  110. /*public void validateUpdate(){
  111. //只对update进行校验validateXxx,方法名第一个必须大写
  112. if(username == null || "".equals(this.username.trim())){
  113. this.addFieldError("username", "用户名不能为空") ;
  114. }
  115. if(mobile == null || "".equals(this.mobile.trim())){
  116. this.addFieldError("mobile", "手机号不能为空") ;
  117. }else{
  118. if(!Pattern.compile("^1[3,5,8]\\d{9}$").matcher(this.mobile).matches()){
  119. this.addFieldError("mobile", "手机号格式不正确") ;
  120. }
  121. }
  122. super.validate() ;
  123. }*/
  124.  
  125. }
  126. 这样一来,我们的一个校验的程序就写好了,通过部署,运行,我们可以发现,这个校验是针对Action类里面所有的方法所执行的,当我们把表单提交的action给换了以后,发现校验都是存在的,即,这个校验是全局校验,怎么只针对Action里面的一个方法进行校验呢?比如我们这个程序里面的update方法?程序只需稍微修改一下,上面代码已经写出来了,我们只需要自己定义个方法,名字为validateXxx()即可了,这个Xxx的第一个必须大写,而且Xxx是这个Action里面的一个方法。代码如下
  127.  
  128. Java代码 收藏代码
  129. package com.ambow.Action;
  130.  
  131. import java.util.regex.Pattern;
  132.  
  133. import com.opensymphony.xwork2.ActionContext;
  134. import com.opensymphony.xwork2.ActionSupport;
  135.  
  136. public class PersonAction extends ActionSupport {
  137.  
  138. private String username ;
  139. private String mobile ;
  140. public String getUsername() {
  141. return username;
  142. }
  143. public void setUsername(String username) {
  144. this.username = username;
  145. }
  146. public String getMobile() {
  147. return mobile;
  148. }
  149. public void setMobile(String mobile) {
  150. this.mobile = mobile;
  151. }
  152.  
  153. public String save(){
  154. ActionContext.getContext().put("message", "保存成功!") ;
  155. return "message" ;
  156. }
  157.  
  158. public String update(){
  159. ActionContext.getContext().put("message", "更新成功!") ;
  160. return "message" ;
  161. }
  162. @Override
  163. public String execute() throws Exception {
  164. // TODO Auto-generated method stub
  165. return super.execute();
  166. }
  167. /*public void validate() {//会对所有的Action起作用
  168. if(username == null || "".equals(this.username.trim())){
  169. this.addFieldError("username", "用户名不能为空") ;
  170. }
  171. if(mobile == null || "".equals(this.mobile.trim())){
  172. this.addFieldError("mobile", "手机号不能为空") ;
  173. }else{
  174. if(!Pattern.compile("^1[3,5,8]\\d{9}$").matcher(this.mobile).matches()){
  175. this.addFieldError("mobile", "手机号格式不正确") ;
  176. }
  177. }
  178. super.validate();
  179. }*/
  180. public void validateUpdate(){
  181. //只对update进行校验validateXxx,方法名第一个必须大写
  182. if(username == null || "".equals(this.username.trim())){
  183. this.addFieldError("username", "用户名不能为空") ;
  184. }
  185. if(mobile == null || "".equals(this.mobile.trim())){
  186. this.addFieldError("mobile", "手机号不能为空") ;
  187. }else{
  188. if(!Pattern.compile("^1[3,5,8]\\d{9}$").matcher(this.mobile).matches()){
  189. this.addFieldError("mobile", "手机号格式不正确") ;
  190. }
  191. }
  192. super.validate() ;
  193. }
  194.  
  195. }
  196. 这么一来,我们在form表单修改提交的方法,就会发现这个save()方法不会做校验了,而update()方法照样校验,说明这个校验只是针对update()方法管用了,这样,我们就通过手工完成了校验。
  197. 2:通过基于XML的配置实现校验
  198. 基于XML方式实现校验时,Action类也需要继承ActionSupport类,并且提供校验文件,校验文件同Action类放在一个包内,文件的取名格式为:ActionClassName-validation.xml,其中ActionClassNameAction类的简单名字,本例子中为PersonAction即可,-validation为固定写法。如果该Action类名字为com.ambow.PersonAction,那么这个配置文件名字就是PersonAction-validation.xml,下面是本例中的校验配置
  199.  
  200. Java代码 收藏代码
  201. <!DOCTYPE validators PUBLIC
  202. "-//OpenSymphony Group//XWork Validator 1.0.3//EN"
  203. "http://www.opensymphony.com/xwork/xwork-validator-1.0.3.dtd">
  204.  
  205. <validators>
  206. <field name="username">
  207. <field-validator type="requiredstring">
  208. <param name="trim">true</param>
  209. <message>用户名不能为空</message>
  210. </field-validator>
  211. </field>
  212. <field name="mobile">
  213. <field-validator type="requiredstring">
  214. <param name="trim">true</param>
  215. <message>手机号不能为空</message>
  216. </field-validator>
  217.  
  218. <field-validator type="regex">
  219. <param name="expression"><![CDATA[^1[358]\d{9}$]]></param>
  220. <message>手机号格式不正确</message>
  221. </field-validator>
  222. </field>
  223. </validators>
  224. 大家如果不知道这个模板怎么来的,可以到Struts2的提供的样板程序查看,里面提供了一个校验的配置。
  225. 这样一来,我们只需要做这么一个配置即可,将PersonAction里面的校验代码全部删掉,再次部署运行,发现同样可以实现校验的功能,同理,我们发现,这个校验也是针对Action里面的所有方法都校验的,那么怎么才能针对Action里面的一个方法进行校验呢?这个其实很简单,我们只需要修改配置文件的名字为:ActionClassName-ActionName-validation.xml即可,这个ActionClassName还是上面的那个PersonAction,但是这个ActionName是访问一个Action方法的路径,本例中,可以是 manager_update或者manager_save,这个主要是看struts.xml配置文件拿到这个ActionName的名字,比如我的配置如下:
  226.  
  227. Java代码 收藏代码
  228. <?xml version="1.0" encoding="UTF-8" ?>
  229. <!DOCTYPE struts PUBLIC
  230. "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
  231. "http://struts.apache.org/dtds/struts-2.1.dtd">
  232.  
  233. <struts>
  234.  
  235. <package name="yuan2" namespace="/" extends="struts-default">
  236. <action <span style="color: #ff0000;"><strong>name="manager_*"</strong></span> class="com.ambow.Action.PersonAction" method="{1}">
  237. <result name="message">
  238. /WEB-INF/page/message.jsp
  239. </result>
  240. <result name="input">
  241. /index.jsp
  242. </result>
  243. </action>
  244. </package>
  245.  
  246. <!-- Add packages here -->
  247.  
  248. </struts>
  249. 通过这里,可以找到我们的ActionName,也就是我的manager_update或者manager_save 这两个ActionName
  250. 我们修改一下,写成PersonAction-manager_save-validation.xml ,然后再次部署运行,修改表单提交的Action方法,我们知道这下只能对save方法凑效了。
    在学习的过程有几点值得注意:

1、action的result必须包含input的返回,最开始我用的是login,结果每次都报错。验证失败后,拦截器默认是向input结果跳转。

2、验证配置xml文件的格式是这样的:xxx-validation.xml  其中"xxx"代表action的类名,这里我的action是:LoginUserAction,

所以验证配置应用文件名是:LoginUserAction-validation.xml

3、文件LoginUserAction-validation.xml中 <field name="user.password">的name属性应与表单中的field的name属性相呼应,表示这个验证提示信息显示的位置。

struts2表单验证的更多相关文章

  1. [JavaWeb基础] 015.Struts2 表单验证框架

    在web开发的过程中,我们经常要用到一些填写表单的操作,我们一般都要在提交表单信息的时候对表单的内容进行验证,struts2给我们提供了简单的实现接口,让我们可以很容易的对表单进行验证.下面讲解下最传 ...

  2. 【转】Struts2 表单验证与验证框架

    版权声明:好笔头不如烂记性 https://blog.csdn.net/zsbgood/article/details/81114038 表单数据验证是很常见的功能,通常前端页面会有一次 js验证,但 ...

  3. struts2表单验证里field-validator type值一共可以取哪些?都什么含义?

    int 整数: double 实数: date 日期: expression 两数的关系比较: email Email地址: url visitor conversion regex 正则表达式验证: ...

  4. struts2 表单验证

    http://www.blogjava.net/javagrass/archive/2011/11/21/364400.html

  5. Struts2之Action三种接收参数形式与简单的表单验证

    有了前几篇的基础,相信大家对于Struts2已经有了一个很不错的认识,本篇我将为大家介绍一些关于Action接收参数的三种形式,以及简单的表单验证实现,下面进入正题,首先我们一起先来了解一下最基本的A ...

  6. struts2官方 中文教程 系列十一:使用XML进行表单验证

    在本教程中,我们将讨论如何使用Struts 2的XML验证方法来验证表单字段中用户的输入.在前面的教程中,我们讨论了在Action类中使用validate方法验证用户的输入.使用单独的XML验证文件让 ...

  7. struts2官方 中文教程 系列六:表单验证

    先贴个本帖的地址,以免被爬:struts2教程 官方系列六:表单验证  即 http://www.cnblogs.com/linghaoxinpian/p/6906720.html 下载本章节代码 介 ...

  8. jQuery学习之:Validation表单验证插件

    http://polaris.blog.51cto.com/1146394/258781/ 最近由于公司决定使用AJAX + Struts2来重构项目,让我仔细研究一下这两个,然后集中给同事讲讲,让每 ...

  9. test_maven_实现表单验证

    这篇文章是我的上一篇文章的续集,如未看过,可看一下,上面的test_maven再继续看这个 这篇文章主要是阐述使用struts实现表单验证的功能. 1.首先了解actionContext:Action ...

随机推荐

  1. winows 进程通信的实例详解

    发送端: 新建一个基本对话框工程,添加6个文本框控件,并且关联控件变量(CString类型):  m_strCopyData, m_strFileMap, m_strMem, m_strRegMsg, ...

  2. Caused by: java.lang.ClassNotFoundException: com/sun/tools/internal/xjc/api/XJC

    Caused by: java.lang.ClassNotFoundException: com/sun/tools/internal/xjc/api/XJC 缺少com/sun/tools/inte ...

  3. bootstrap02导航菜单

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...

  4. WCF学习笔记一(概述)

    WCF  Windows Communication Foundation 分布式通信框架.WCF是对现有分布式通信技术的整合.是各种分布式计算的集大成者.主要整合技术如下图: WCF的服务不能孤立的 ...

  5. DataGrid列的合并

    /// <summary> /// DataGrid列的合并 /// 注意:1.DataGrid在绑定的时候进行分组和排序,才能让相同的行放在一起 /// 2.方法应用的时机,应该在Dat ...

  6. 设置UILabel可变高度(根据文本内容自动适应高度)

    @property(nonatomic)UILabel *showLabel;   // 计算文本所占高度,计算出来之后设置label的高度 // 第一个参数:字体大小,字体大小/样式影响计算字体的高 ...

  7. 利用c语言做简单的迷宫小游戏

                       #include <stdio.h> #define ROW 6 #define COL 6 // 封装打印地图的函数 void printMap(c ...

  8. JavaScript中Ajax的get和post请求

    AJAX = 异步 JavaScript和XML(Asynchronous JavaScript and XML) 作用:在不重新加载整个网页的情况下,对网页的某部分进行更新.   两种请求方式: 1 ...

  9. jquery之分页插件smartpaginator

    今天推荐一个分页工具条插件:Smart Paginator,这个插件用途还是很广的,而且可定制性相当不错,目前内置三种颜色,有需要的话,可以自己改css定制颜色 1.如何使用Smart Paginat ...

  10. 虚拟化技术与"云"

    虚拟化技术: 如网站在某一时间访问量大,平时访问量少,如果一直保持大量的服务器提供服务,显示效率好低,浪费资源,在 不增减服务器,存储设备,网络等实际物理设备,而是利用软件将这些物理设备虚拟化,在有必 ...