struts2表单验证
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表单验证的更多相关文章
- [JavaWeb基础] 015.Struts2 表单验证框架
在web开发的过程中,我们经常要用到一些填写表单的操作,我们一般都要在提交表单信息的时候对表单的内容进行验证,struts2给我们提供了简单的实现接口,让我们可以很容易的对表单进行验证.下面讲解下最传 ...
- 【转】Struts2 表单验证与验证框架
版权声明:好笔头不如烂记性 https://blog.csdn.net/zsbgood/article/details/81114038 表单数据验证是很常见的功能,通常前端页面会有一次 js验证,但 ...
- struts2表单验证里field-validator type值一共可以取哪些?都什么含义?
int 整数: double 实数: date 日期: expression 两数的关系比较: email Email地址: url visitor conversion regex 正则表达式验证: ...
- struts2 表单验证
http://www.blogjava.net/javagrass/archive/2011/11/21/364400.html
- Struts2之Action三种接收参数形式与简单的表单验证
有了前几篇的基础,相信大家对于Struts2已经有了一个很不错的认识,本篇我将为大家介绍一些关于Action接收参数的三种形式,以及简单的表单验证实现,下面进入正题,首先我们一起先来了解一下最基本的A ...
- struts2官方 中文教程 系列十一:使用XML进行表单验证
在本教程中,我们将讨论如何使用Struts 2的XML验证方法来验证表单字段中用户的输入.在前面的教程中,我们讨论了在Action类中使用validate方法验证用户的输入.使用单独的XML验证文件让 ...
- struts2官方 中文教程 系列六:表单验证
先贴个本帖的地址,以免被爬:struts2教程 官方系列六:表单验证 即 http://www.cnblogs.com/linghaoxinpian/p/6906720.html 下载本章节代码 介 ...
- jQuery学习之:Validation表单验证插件
http://polaris.blog.51cto.com/1146394/258781/ 最近由于公司决定使用AJAX + Struts2来重构项目,让我仔细研究一下这两个,然后集中给同事讲讲,让每 ...
- test_maven_实现表单验证
这篇文章是我的上一篇文章的续集,如未看过,可看一下,上面的test_maven再继续看这个 这篇文章主要是阐述使用struts实现表单验证的功能. 1.首先了解actionContext:Action ...
随机推荐
- SOAP消息分析
根据WebService学习笔记系列(二)中的介绍,使用tcpmon可以捕获到我们发出或者接收到的xml内容,接天我们就对这些xml内容做一个简单的分析.还记得在WebService学习笔记系列(四) ...
- Java基础知识强化之集合框架笔记48:产生10个1~20之间的随机数(要求:随机数不能重复) 简洁版
1. 编写一个程序,获取10个1至20的随机数,要求随机数不能重复. 分析: A: 创建随机数对象 B: 创建一个HashSet集合 C: 判断集合的长度是不是小于10 是:就创建一个随机 ...
- Mysql解压版的安装
Mysql解压版的安装 ——@梁WP 1.解压mysql到合适的地方 2.右击计算机-属性-高级系统设置-高级-环境变量,弹出“环境变量”对话框,修改下面的系统变量 3.新建MYSQL_HOME变量, ...
- springmvc使用@ResponseBody返回json乱码解决方法
1.springmvc 3.2以上的版本解决乱码的方法: 第一步:在配置中加入: <mvc:annotation-driven> <mvc:message-converters re ...
- Java 之文件IO编程 之读取
package com.sun; /* * 这里是对文件IO流读取的操作 * 2014-08-10 */ import java.io.*; public class File_test { publ ...
- BufferedWriter和BufferedReader使用方法
/** * 上传文件 * @param file * @param path * @param fileName * @throws IOException */ public void ...
- A题笔记(7)
No. 1468 已知三角形的三条边求面积:海伦公式 S=√[p(p-a)(p-b)(p-c)] p=(a+b+c)/2 #include <cmath> cmath 是 c++ 语言 ...
- iOS---There was an internal API error 错误
There was an internal API error. 错误原因:把Product Name作为程序名称,程序名称错乱 解决方法:检查Product Name, 不要包含中文以及特殊字符.在 ...
- php验证码封装
/** * 生成验证码 * @param int $type 1: 纯数字,2:纯字母,3:数字与字母混合 * @param int $length * @return string */funct ...
- js Dom树结构分析
对Dom数结构的理解,对用js操作html元素有很大的意义 先来看一下下面这段html代码:(这里就以分析body中的元素来解释,因为我们基本所有的操作基本都围绕body标签来做的) <!DOC ...