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. 项目打包 weblogic部署

    工作流打包:   由于没有集成单点,配置文件要修改 将webnocas.xml内容复制覆盖 web.xml   到这里修改完毕 选择weblogic项目,右键maven install,生成.ear文 ...

  3. 【锋利的jQuery】学习笔记01

    第一章 认识jQuery 一.常见的JS库 Prototype 最早的js库之一.把好用JS方法组合,缺点结构松散. Dojo 离线存储API.生成图标组件.矢量图形库.Comet支持.企业级JS库, ...

  4. 使用html5兼容低版本浏览器

    因为html5 新出的一些语义化的标签,在低版本浏览器下不能识别,举个例子,比如你写了一个 header 标签中,写了一段文本,在低版本浏览器下,肯定是能看到的,但是,那是他是不认识 header标签 ...

  5. css标准导航代码

    <!-- 例子解析: --> --> <!-- list-style-type:none - 移除列表前小标志.一个导航栏并不需要列表标记 --> <!-- 移除浏 ...

  6. Android本地JUnit Text

    Android本地JUnit Text 步骤 创建一个和source文件,里面添加和src目录相同的包. 在AndroidManifest.xml文件manifest根节点添加如下文件 <ins ...

  7. Linux Shell编程学习笔记——目录(附笔记资源下载)

    LinuxShell编程学习笔记目录附笔记资源下载 目录(?)[-] 写在前面 第一部分 Shell基础编程 第二部分 Linux Shell高级编程技巧 资源下载 写在前面 最近花了些时间学习She ...

  8. Android简单例子——IpHone样式AlertDialog

    此例子源于网络,下载下来之后,自己加了写注释,作为总结,发到博客中,谢谢原作者 通过这个例子学到的东西 1.自定义对话框的使用 2.程序中使用颜色如何进行存放,增加复用性 3.加深线性布局.常用控件的 ...

  9. C#后台程序与HTML页面中JS方法互调

    此方法适用于 C#中嵌入WebBrowser(浏览器) 通过浏览器中加载的页面与C#的后台代码进行交互. 一.C#程序 1.在C#窗体中添加WebBrowser(浏览器),将页面的URL添加到浏览器中 ...

  10. 交叉编译tslib1.4

    cross-compiler: arm-linux-gcc V4.2.1 source code: tslib-1.4.tar.gz #tar zxvf tslib-1.4.tar.gz #./aut ...