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 ...
随机推荐
- winows 进程通信的实例详解
发送端: 新建一个基本对话框工程,添加6个文本框控件,并且关联控件变量(CString类型): m_strCopyData, m_strFileMap, m_strMem, m_strRegMsg, ...
- 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 ...
- bootstrap02导航菜单
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...
- WCF学习笔记一(概述)
WCF Windows Communication Foundation 分布式通信框架.WCF是对现有分布式通信技术的整合.是各种分布式计算的集大成者.主要整合技术如下图: WCF的服务不能孤立的 ...
- DataGrid列的合并
/// <summary> /// DataGrid列的合并 /// 注意:1.DataGrid在绑定的时候进行分组和排序,才能让相同的行放在一起 /// 2.方法应用的时机,应该在Dat ...
- 设置UILabel可变高度(根据文本内容自动适应高度)
@property(nonatomic)UILabel *showLabel; // 计算文本所占高度,计算出来之后设置label的高度 // 第一个参数:字体大小,字体大小/样式影响计算字体的高 ...
- 利用c语言做简单的迷宫小游戏
#include <stdio.h> #define ROW 6 #define COL 6 // 封装打印地图的函数 void printMap(c ...
- JavaScript中Ajax的get和post请求
AJAX = 异步 JavaScript和XML(Asynchronous JavaScript and XML) 作用:在不重新加载整个网页的情况下,对网页的某部分进行更新. 两种请求方式: 1 ...
- jquery之分页插件smartpaginator
今天推荐一个分页工具条插件:Smart Paginator,这个插件用途还是很广的,而且可定制性相当不错,目前内置三种颜色,有需要的话,可以自己改css定制颜色 1.如何使用Smart Paginat ...
- 虚拟化技术与"云"
虚拟化技术: 如网站在某一时间访问量大,平时访问量少,如果一直保持大量的服务器提供服务,显示效率好低,浪费资源,在 不增减服务器,存储设备,网络等实际物理设备,而是利用软件将这些物理设备虚拟化,在有必 ...