1:采用手工编写代码实现。
通过继承ActionSupport类,然后重写vlidate方法,validate方法会校验跟execute同样签名的方法,当某个数据校验失败时,我们应该调用addFieldError()这个方法向系统的FieldError添加信息,如果校验失败了,Struts2会自动转发到名为input的result这个结果页上面,在input视图上可以通过<s:fielderror /> 这样一个标签来获得失败信息,这样就可以完成一个校验了,具体代码如下
index.jsp:提供用户输入的界面,这个form表单提交方向大家看好了。 Java代码 收藏代码
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<!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>
<span style="color: #ff0000;"><s:fielderror /></span>
<span style="color: #000000;"><form </span><span style="color: #ff0000;">action="${pageContext.request.contextPath }/manager_update"</span><span style="color: #000000;"> method="post"> </span>
用户名:<input type="text" name="username" />不能为空<br />
手机号:<input type="text" name="mobile" />不能为空,必须符合手机号1,3/5/8,后面9个数字<br />
<input type="submit" value="提交" />
</form>
</body>
</html><br>
message.jsp:用户输入正确的话就来到此页面 Java代码 收藏代码
<%@ 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>
${message }<br />
</body>
</html> struts.xml:里面的Action名字采用了一个通配符,为后面讲解校验范围做测试 Java代码 收藏代码
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.1.dtd"> <struts>
<package name="yuan2" namespace="/" extends="struts-default">
<action name="manager_*" class="com.ambow.Action.PersonAction" method="{1}">
<result name="message">/WEB-INF/page/message.jsp</result>
<result name="input">/index.jsp</result>
</action>
</package>
</struts>
PersonAction类 Java代码 收藏代码
package com.ambow.Action; import java.util.regex.Pattern; import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport; public class PersonAction extends ActionSupport { private String username ;
private String mobile ;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getMobile() {
return mobile;
}
public void setMobile(String mobile) {
this.mobile = mobile;
} public String save(){
ActionContext.getContext().put("message", "保存成功!") ;
return "message" ;
} public String update(){
ActionContext.getContext().put("message", "更新成功!") ;
return "message" ;
}
@Override
public String execute() throws Exception {
// TODO Auto-generated method stub
return super.execute();
}
public void validate() {//会对所有的Action起作用
if(username == null || "".equals(this.username.trim())){
this.addFieldError("username", "用户名不能为空") ;
}
if(mobile == null || "".equals(this.mobile.trim())){
this.addFieldError("mobile", "手机号不能为空") ;
}else{
if(!Pattern.compile("^1[3,5,8]\\d{9}$").matcher(this.mobile).matches()){
this.addFieldError("mobile", "手机号格式不正确") ;
}
}
super.validate();
}
/*public void validateUpdate(){
//只对update进行校验validateXxx,方法名第一个必须大写
if(username == null || "".equals(this.username.trim())){
this.addFieldError("username", "用户名不能为空") ;
}
if(mobile == null || "".equals(this.mobile.trim())){
this.addFieldError("mobile", "手机号不能为空") ;
}else{
if(!Pattern.compile("^1[3,5,8]\\d{9}$").matcher(this.mobile).matches()){
this.addFieldError("mobile", "手机号格式不正确") ;
}
}
super.validate() ;
}*/ }
这样一来,我们的一个校验的程序就写好了,通过部署,运行,我们可以发现,这个校验是针对Action类里面所有的方法所执行的,当我们把表单提交的action给换了以后,发现校验都是存在的,即,这个校验是全局校验,怎么只针对Action里面的一个方法进行校验呢?比如我们这个程序里面的update方法?程序只需稍微修改一下,上面代码已经写出来了,我们只需要自己定义个方法,名字为validateXxx()即可了,这个Xxx的第一个必须大写,而且Xxx是这个Action里面的一个方法。代码如下 Java代码 收藏代码
package com.ambow.Action; import java.util.regex.Pattern; import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport; public class PersonAction extends ActionSupport { private String username ;
private String mobile ;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getMobile() {
return mobile;
}
public void setMobile(String mobile) {
this.mobile = mobile;
} public String save(){
ActionContext.getContext().put("message", "保存成功!") ;
return "message" ;
} public String update(){
ActionContext.getContext().put("message", "更新成功!") ;
return "message" ;
}
@Override
public String execute() throws Exception {
// TODO Auto-generated method stub
return super.execute();
}
/*public void validate() {//会对所有的Action起作用
if(username == null || "".equals(this.username.trim())){
this.addFieldError("username", "用户名不能为空") ;
}
if(mobile == null || "".equals(this.mobile.trim())){
this.addFieldError("mobile", "手机号不能为空") ;
}else{
if(!Pattern.compile("^1[3,5,8]\\d{9}$").matcher(this.mobile).matches()){
this.addFieldError("mobile", "手机号格式不正确") ;
}
}
super.validate();
}*/
public void validateUpdate(){
//只对update进行校验validateXxx,方法名第一个必须大写
if(username == null || "".equals(this.username.trim())){
this.addFieldError("username", "用户名不能为空") ;
}
if(mobile == null || "".equals(this.mobile.trim())){
this.addFieldError("mobile", "手机号不能为空") ;
}else{
if(!Pattern.compile("^1[3,5,8]\\d{9}$").matcher(this.mobile).matches()){
this.addFieldError("mobile", "手机号格式不正确") ;
}
}
super.validate() ;
} }
这么一来,我们在form表单修改提交的方法,就会发现这个save()方法不会做校验了,而update()方法照样校验,说明这个校验只是针对update()方法管用了,这样,我们就通过手工完成了校验。
2:通过基于XML的配置实现校验
基于XML方式实现校验时,Action类也需要继承ActionSupport类,并且提供校验文件,校验文件同Action类放在一个包内,文件的取名格式为:ActionClassName-validation.xml,其中ActionClassName为Action类的简单名字,本例子中为PersonAction即可,-validation为固定写法。如果该Action类名字为com.ambow.PersonAction,那么这个配置文件名字就是PersonAction-validation.xml,下面是本例中的校验配置 Java代码 收藏代码
<!DOCTYPE validators PUBLIC
"-//OpenSymphony Group//XWork Validator 1.0.3//EN"
"http://www.opensymphony.com/xwork/xwork-validator-1.0.3.dtd"> <validators>
<field name="username">
<field-validator type="requiredstring">
<param name="trim">true</param>
<message>用户名不能为空</message>
</field-validator>
</field>
<field name="mobile">
<field-validator type="requiredstring">
<param name="trim">true</param>
<message>手机号不能为空</message>
</field-validator> <field-validator type="regex">
<param name="expression"><![CDATA[^1[358]\d{9}$]]></param>
<message>手机号格式不正确</message>
</field-validator>
</field>
</validators>
大家如果不知道这个模板怎么来的,可以到Struts2的提供的样板程序查看,里面提供了一个校验的配置。
这样一来,我们只需要做这么一个配置即可,将PersonAction里面的校验代码全部删掉,再次部署运行,发现同样可以实现校验的功能,同理,我们发现,这个校验也是针对Action里面的所有方法都校验的,那么怎么才能针对Action里面的一个方法进行校验呢?这个其实很简单,我们只需要修改配置文件的名字为:ActionClassName-ActionName-validation.xml即可,这个ActionClassName还是上面的那个PersonAction,但是这个ActionName是访问一个Action方法的路径,本例中,可以是 manager_update或者manager_save,这个主要是看struts.xml配置文件拿到这个ActionName的名字,比如我的配置如下: Java代码 收藏代码
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.1.dtd"> <struts> <package name="yuan2" namespace="/" extends="struts-default">
<action <span style="color: #ff0000;"><strong>name="manager_*"</strong></span> class="com.ambow.Action.PersonAction" method="{1}">
<result name="message">
/WEB-INF/page/message.jsp
</result>
<result name="input">
/index.jsp
</result>
</action>
</package> <!-- Add packages here --> </struts>
通过这里,可以找到我们的ActionName,也就是我的manager_update或者manager_save 这两个ActionName
我们修改一下,写成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. [学习笔记]设计模式之Bridge

    写在前面 为方便读者,本文已添加至索引: 设计模式 学习笔记索引 “魔镜啊魔镜,谁是这个世界上最美丽的人?”月光中,一个低沉的声音回荡在女王的卧室.“是美丽的白雪公主,她正和小霍比特人们幸福快乐地生活 ...

  2. CentOS7安装Puppet+GitLab+Bind

    添加Puppet官方源 rpm -Uvh https://yum.puppetlabs.com/puppetlabs-release-el-7.noarch.rpm 安装Puppet yum -y i ...

  3. word每次打开都要选择文档类型

    每次打开word07 都出现下面一个框框,说要转换文件. 在Word2013文档中,为了能更好地使用“从任意文件还原文本”功能,用户需要启用“打开时确认文件格式转换”功能,以在打开并恢复文件时出现文件 ...

  4. Nico Game Studio 3.地图纹理编辑 物体皮肤编辑

    完成功能: 1.地图纹理编辑功能. 图层编辑,添加/删除纹理,地图编辑.网格绘制.

  5. 概述ASP.NET缓存机制

    PetShop之ASP.NET缓存机制 如果对微型计算机硬件系统有足够的了解,那么我们对于Cache这个名词一定是耳熟能详的.在CPU以及主板的芯片中,都引入了这种名为高速缓冲存储器(Cache)的技 ...

  6. [GDI+] C# ImageClass帮助类教程与源码下载 (转载)

    点击下载 ImageClass.rar 功能如下图片 主要功能有:缩略图片,图片水印,文字水印,调整光暗,反色处理,浮雕处理,拉伸处理,左右翻转,上下翻转,压缩图片,图片灰度化,转换为黑白图片,获取图 ...

  7. 停止Java线程,小心interrupt()方法

    来源:http://blog.csdn.net/wxwzy738/article/details/8516253 程序是很简易的.然而,在编程人员面前,多线程呈现出了一组新的难题,如果没有被恰当的解决 ...

  8. js获取当前url参数

    //抓取url参数 function GetRequest() { var url = location.search; //获取url中"?"符后的字串 var theReque ...

  9. SQL输出矩阵

    数据库环境:SQL SERVER2008R2 需求:用SQL实现如下2个图中的矩阵.            图1和图2都是行列转换的另一个变形,下面直接贴上SQL脚本. 图1的SQL实现 /*利用系统 ...

  10. (九)Struts2 防重复提交

    所有的学习我们必须先搭建好Struts2的环境(1.导入对应的jar包,2.web.xml,3.struts.xml) 第一节:重复提交示例演示 struts.xml <?xml version ...