一、数据验证

1.1、为什么要进行数据验证

对数据的合法性进行检查,只允许合法的数据进入应用程序

1.2、在哪里实现数据验证

客户端验证:

数据提交前在客户端验证

可使用JavaScript或者JQuery实现

特点:减少客户等待时间,减小服务器压力

服务器端验证:

在数据提交后服务器端验证

特点:防止“绕过”客户端验证提交非法数据

   可以在服务器端处理数据前确保数据的合法性

1.3、Struts2有两种方式实现服务器端数据验证

  • 使用ActionSupport编码实现验证
  • 使用验证框架实现验证

二、使用ActionSupport实现验证

  • 在Action类的业务方法中直接验证
  • 重写Validate()方法
  • 使用validateXxx()方法

2.1、添加错误信息

addFieldError(String fieldName,String errorMessage),添加字段的错误信息

addActionError(String anErrorMessage),添加与Action所处理业务相关的错误信息

2.2、在页面输出验证结果

  • <s:fielderror/>输出一个或者所胡字段的错误信息
  • <s:actionerror/>输出所有Action的错误信息

2.3、action的配置

<result name="input">xxx.jsp</result>

三、ActionSupport验证简单实现

3.1、业务方法中较验

实体类

package com.pb.entity;
/*
* 用户类
*/
public class User {
private String username; //用户名
private String password; //密码
private Integer age; //年龄
private String email; //邮箱 public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
} }

register.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib prefix="s" uri="/struts-tags"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme() + "://"
+ request.getServerName() + ":" + request.getServerPort()
+ path + "/";
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<base href="<%=basePath%>">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>注册页面</title>
</head>
<body> <!-- 判断字段是否有错误信息-->
<s:if test="hasFieldErrors()">
<h1 align="center">输出错误字段信息</h1>
<div align="center" style="color:blue;">
使用s:fielderror输出一个指定的错误信息
<s:fielderror name="user.username" />
使用s:fielderror输出全部的错误信息
<s:fielderror />
</div>
</s:if>
<!-- 判断action是否有错误 -->
<s:if test="hasActionErrors()">
<h1 align="center">输出错误Action信息</h1>
<div align="center" style="color:gray;">
使用s:actionerror输出action相关的错误信息
<s:actionerror/>
</div>
</s:if>
<h1>使用execute业务方法直接较验</h1>
<s:form action="register.action" method="post" >
<s:textfield label="用户名" name="user.username"/>
<s:password label="密码" name="user.password"/>
<s:textfield label="年龄" name="user.age" />
<s:textfield label="邮箱" name="user.email"/>
<s:submit value="提交" /><s:reset value="重置" /><br/>
</s:form>
<s:debug/>
</body>
</html>

UserAction

package com.pb.web.action;

import java.util.regex.Matcher;
import java.util.regex.Pattern; import com.opensymphony.xwork2.ActionSupport;
import com.pb.entity.User; public class UserAction extends ActionSupport {
private User user; @Override
public String execute() throws Exception {
if(null==user.getUsername() || "".equals(user.getUsername())){
this.addFieldError("user.username", "用户名不能为空!");
}
if(null==user.getPassword() || "".equals(user.getPassword())){
this.addFieldError("user.password", "密码不能为空!");
}
String ageStr="^\\d{1,3}$";
Pattern ageReg=Pattern.compile(ageStr);
Matcher ageMatcher=ageReg.matcher(user.getAge()+"");
if(!ageMatcher.matches()){
this.addFieldError("user.age", "年龄只能是数字,并只能为1-200之间!");
}
if(null==user.getAge()){
this.addFieldError("user.age", "年龄不能为空!");
} String emaString="^\\w+@\\w+(.\\w{2,3}){1,2}$";
Pattern emailReg=Pattern.compile(emaString);
Matcher emailMatcher=emailReg.matcher(user.getEmail());
if(!emailMatcher.matches()){
this.addFieldError("user.email", "邮箱格式不正确");
}
if(this.hasErrors()){
this.addActionError("输入的注册信息有误");
return INPUT;
}
return SUCCESS;
} public User getUser() {
return user;
} public void setUser(User user) {
this.user = user;
} }

struts.xml

<struts>
<constant name="struts.enable.DynamicMethodInvocation" value="false" />
<constant name="struts.devMode" value="true" />
<package name="default" namespace="/" extends="struts-default">
<action name="register" class="com.pb.web.action.UserAction">
<result name="input">/register.jsp</result>
<result name="success">/registerSuccess.jsp</result>
</action>
</package>
</struts>

四、在Validate()方法中实现验证

  • 重写ActionSupport类的validate()方法
  •  在validate()方法中实现验证
  • 将数据验证和业务处理分离
  • 添加与显示错误信息的方式不变

接收参数时,数据转换失败也会调用validate()方法

validate()方法验证不通过不会执行业务方法

4.1、更改之前实现validate()验证

package com.pb.web.action;

import java.util.regex.Matcher;
import java.util.regex.Pattern; import com.opensymphony.xwork2.ActionSupport;
import com.pb.entity.User; public class UserAction1 extends ActionSupport {
private User user; @Override
public String execute() throws Exception {
System.out.println("=========完成注册信息======");
if(this.hasErrors()){
this.addActionError("输入的注册信息有误");
return INPUT;
}
return SUCCESS;
} @Override
public void validate() {
if(null==user.getUsername() || "".equals(user.getUsername())){
this.addFieldError("user.username", "用户名不能为空!");
}
if(null==user.getPassword() || "".equals(user.getPassword())){
this.addFieldError("user.password", "密码不能为空!");
}
String ageStr="^\\d{1,3}$";
Pattern ageReg=Pattern.compile(ageStr);
Matcher ageMatcher=ageReg.matcher(user.getAge()+"");
if(!ageMatcher.matches()){
this.addFieldError("user.age", "年龄只能是数字,并只能为1-200之间!");
}
if(null==user.getAge() || "".equals(user.getAge())){
this.addFieldError("user.age", "年龄不能为空!");
}else{
if(0>user.getAge() || 200<user.getAge()){
this.addFieldError("user.age", "年龄1-200之间!!");
}
} String emaString="^\\w+@\\w+(.\\w{2,3}){1,2}$";
Pattern emailReg=Pattern.compile(emaString);
Matcher emailMatcher=emailReg.matcher(user.getEmail());
if(!emailMatcher.matches()){
this.addFieldError("user.email", "邮箱格式不正确");
}
super.validate(); } public User getUser() {
return user;
} public void setUser(User user) {
this.user = user;
} }

如果Action中有validate()方法,会先执行验证,验证后才执行业务方法,不通过不执行业务方法

五、针对一个业务方法进行数据验证

使用validateXxx()方法

  • Struts2支持validateXxx()方法针对xxx()方法进行数据验证
  • 使用validateRegister()方法实现针对register()方法的数据验证
  • 注册时通过validateRegister()方法验证年龄和邮箱等其它字段
  • 注册和登录时在validate()方法中验证用户名和密码非空等其它验证

validate()方法和validateXxx()方法同时存在时都会起作用

ValidateXxx()方法的调用要先于validate()方法

5.1、使用针对注册的验证方法

package com.pb.web.action;

import java.util.regex.Matcher;
import java.util.regex.Pattern; import com.opensymphony.xwork2.ActionSupport;
import com.pb.entity.User; public class UserAction2 extends ActionSupport {
private User user; public String register() throws Exception {
System.out.println("=========完成注册信息======");
if(this.hasErrors()){
return INPUT;
}
return SUCCESS;
} @Override
public void validate() {
System.out.println("====执行validate方法验证====");
if(null==user.getUsername() || "".equals(user.getUsername())){
this.addFieldError("user.username", "用户名不能为空!");
}
if(null==user.getPassword() || "".equals(user.getPassword())){
this.addFieldError("user.password", "密码不能为空!");
} } public void validateRegister(){
System.out.println("====执行validateRegister方法验证====");
String ageStr="^\\d{1,3}$";
Pattern ageReg=Pattern.compile(ageStr);
Matcher ageMatcher=ageReg.matcher(user.getAge()+"");
if(!ageMatcher.matches()){
this.addFieldError("user.age", "年龄只能是数字,并只能为1-200之间!");
}
if(null==user.getAge() || "".equals(user.getAge())){
this.addFieldError("user.age", "年龄不能为空!");
}else{
if(0>user.getAge() || 200<user.getAge()){
this.addFieldError("user.age", "年龄1-200之间!!");
}
} String emaString="^\\w+@\\w+(.\\w{2,3}){1,2}$";
Pattern emailReg=Pattern.compile(emaString);
Matcher emailMatcher=emailReg.matcher(user.getEmail());
if(!emailMatcher.matches()){
this.addFieldError("user.email", "邮箱格式不正确");
}
} public User getUser() {
return user;
} public void setUser(User user) {
this.user = user;
} }

struts.xml

<action name="register2" class="com.pb.web.action.UserAction2" method="register">
<result name="input">/register2.jsp</result>
<result name="success">/registerSuccess.jsp</result>
</action>

5.2、三种方法

六、验证框架

6.1、实现

package com.pb.web.action;

import java.util.regex.Matcher;
import java.util.regex.Pattern; import com.opensymphony.xwork2.ActionSupport;
import com.pb.entity.User; public class UserAction3 extends ActionSupport {
private User user; public String register() throws Exception {
System.out.println("=========完成注册信息======");
return SUCCESS;
} public User getUser() {
return user;
} public void setUser(User user) {
this.user = user;
} }

UserAction3-validation.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC "-//Apache Struts//XWork Validator 1.0.3//EN"
"http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd">
<validators>
<!-- 用户名验证-->
<field name="user.username">
<field-validator type="requiredstring">
<param name="trim">true</param>
<message>用户名不能为空!</message>
</field-validator>
<field-validator type="stringlength">
<param name="minLength">4</param>
<param name="maxLength">16</param>
<param name="trim">true</param>
<message>用户名必须为${minLength}至${maxLength}个字符!,当前为${user.username}</message>
</field-validator>
</field>
<!--密码 -->
<field name="user.password">
<field-validator type="requiredstring">
<param name="trim">true</param>
<message>密码不能为空!</message>
</field-validator>
<field-validator type="stringlength">
<!--去掉前后的空格 -->
<param name="trim">true</param>
<param name="minLength">6</param>
<param name="maxLength">20</param>
<message>密码必须为${minLength}至${maxLength}个字符,当前为${user.password}</message>
</field-validator>
</field>
<!--年龄 -->
<field name="user.age">
<field-validator type="required">
<param name="trim">true</param>
<message>年龄不能为空</message>
</field-validator>
<field-validator type="int">
<param name="trim">true</param>
<param name="min">1</param>
<param name="max">200</param>
<message>年龄为${min}---${max}岁之间</message>
</field-validator>
</field>
<field name="user.email">
<field-validator type="requiredstring">
<param name="trim">true</param>
<message>邮箱不能为空</message>
</field-validator>
<field-validator type="email">
<param name="trim">true</param>
<message>邮箱格式不正确!</message>
</field-validator>
</field>
</validators>

jsp页面

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib prefix="s" uri="/struts-tags"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme() + "://"
+ request.getServerName() + ":" + request.getServerPort()
+ path + "/";
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<base href="<%=basePath%>">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>注册页面</title>
</head>
<body> <!-- 判断字段是否有错误信息-->
<s:if test="hasFieldErrors()">
<h1 align="center">输出错误字段信息</h1>
<div align="center" style="color:blue;">
使用s:fielderror输出全部的错误信息
<s:fielderror />
</div>
</s:if>
<h1>ActionName-validation.xml较验</h1>
<!-- 必须加上namespace不然不起作用-->
<s:form action="register3.action" method="post" namespace="/" >
<s:textfield label="用户名" name="user.username"/>
<s:password label="密码" name="user.password"/>
<s:textfield label="年龄" name="user.age" />
<s:textfield label="邮箱" name="user.email"/>
<s:submit value="提交" /><s:reset value="重置" /><br/>
</s:form>
<s:debug/>
</body>
</html>

struts.xml

<action name="register3" class="com.pb.web.action.UserAction3" method="register">
<result name="input">/register3.jsp</result>
<result name="success">/registerSuccess.jsp</result>
</action>

七、针对一个业务编写配置文件

7.1、更改实现

将上面的年龄验证和邮箱验证独立出来

struts.xml

<action name="register3" class="com.pb.web.action.UserAction3" method="register">
<result name="input">/register3.jsp</result>
<result name="success">/registerSuccess.jsp</result>
</action>

UserAction3-validation.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC "-//Apache Struts//XWork Validator 1.0.3//EN"
"http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd">
<validators>
<!-- 用户名验证-->
<field name="user.username">
<field-validator type="requiredstring">
<param name="trim">true</param>
<message>用户名不能为空!</message>
</field-validator>
<field-validator type="stringlength">
<param name="minLength">4</param>
<param name="maxLength">16</param>
<param name="trim">true</param>
<message>用户名必须为${minLength}至${maxLength}个字符!,当前为${user.username}</message>
</field-validator>
</field>
<!--密码 -->
<field name="user.password">
<field-validator type="requiredstring">
<param name="trim">true</param>
<message>密码不能为空!</message>
</field-validator>
<field-validator type="stringlength">
<!--去掉前后的空格 -->
<param name="trim">true</param>
<param name="minLength">6</param>
<param name="maxLength">20</param>
<message>密码必须为${minLength}至${maxLength}个字符,当前为${user.password}</message>
</field-validator>
</field>
</validators>

UserAction3-register3-validation.xml   中间的名称要与action名字相同

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC "-//Apache Struts//XWork Validator 1.0.3//EN"
"http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd">
<validators>
<!-- 用户名验证-->
<field name="user.username">
<field-validator type="requiredstring">
<param name="trim">true</param>
<message>用户名不能为空!</message>
</field-validator>
<field-validator type="stringlength">
<param name="minLength">4</param>
<param name="maxLength">16</param>
<param name="trim">true</param>
<message>用户名必须为${minLength}至${maxLength}个字符!,当前为${user.username}</message>
</field-validator>
</field>
<!--密码 -->
<field name="user.password">
<field-validator type="requiredstring">
<param name="trim">true</param>
<message>密码不能为空!</message>
</field-validator>
<field-validator type="stringlength">
<!--去掉前后的空格 -->
<param name="trim">true</param>
<param name="minLength">6</param>
<param name="maxLength">20</param>
<message>密码必须为${minLength}至${maxLength}个字符,当前为${user.password}</message>
</field-validator>
</field>
</validators>

7.2、验证顺序

八、以上

Struts2(十二)使用验证框架验证数据较验的更多相关文章

  1. 第二天(1)声明式验证之使用验证框架验证域模型和ModelDriven验证

    有一类特殊的属性,即这个属性的类型是另外一个JavaBean,如有一个User类,代码如下: package data; public class User { private String name ...

  2. MVC系列学习(十二)-服务端的验证

    在前一讲,提到过,客户端的东西永远可以造假,所以我们还要在服务端进行验证 注意:先加载表单,后添加js文件,才能有效:而先加载js,后添加表单,是没有效果的 1.视图与Model中的代码如下 2.一张 ...

  3. 十二、EnterpriseFrameWork框架核心类库之与EntLib结合

    从本章开始对框架的讲叙开始进入核心类库的讲解,前面都是对框架外在功能讲解,让人有个整体的概念,知道包含哪些功能与对系统开发有什么帮助.以后多章都是讲解核心类库的,讲解的方式基本按照代码的目录结构,这样 ...

  4. 服务器端验证--验证框架验证required.

    struts2表单验证里field-validator type值一共可以取哪些?都什么含义? int 整数:double 实数:date 日期:expression 两数的关系比较: email E ...

  5. 循序渐进Python3(十二) --2--  web框架之django简单实现oracle数据库操作

    在 Django 中构建 Oracle 数据库支持的 Web 应用程序 了解如何配置 Django 以便与 Oracle 数据库交互,并使用 ORM 进行数据库连接.             产能在软 ...

  6. Spring(十二)之JDBC框架

    JDBC 框架概述 在使用普通的 JDBC 数据库时,就会很麻烦的写不必要的代码来处理异常,打开和关闭数据库连接等.但 Spring JDBC 框架负责所有的低层细节,从开始打开连接,准备和执行 SQ ...

  7. Android学习笔记(十二)——使用意图传递数据的几种方式

    使用意图传递数据的几种方式 点此获取完整代码 我们除了要从活动返回数据,也经常要传递数据给活动.对此我们能够使用Intent对象将这些数据传递给目标活动. 1.创建一个名为PassingData的项目 ...

  8. 三十二、CI框架之配置域名和设置默认登陆网站

    一.打开routes.php文件,将$route['default_controller'] = 'login'; 修改成我们需要的内容. 二.修改config.php中的base_url数据 三.L ...

  9. 循序渐进Python3(十二) --1--  web框架之django

    Python的WEB框架有Django.Tornado.Flask 等多种,Django相较与其他WEB框架其优势为: 大而全,框架本身集成了ORM.模型绑定.模板引擎.缓存.Session等诸多功能 ...

随机推荐

  1. ruby类名之间<,<=方法

    有时候看源码的时候看到类名之间存在<.<=操作,顿时一头雾水,类名之间也可以比较吗?查了下api,豁然开朗 Class的父类是Module,Module.methods.grep(/< ...

  2. C#中处理耗时任务的几种方式

    0.准备 首先,我们先创建几个耗时任务: public class TestTasks { //无参.无返回值任务 public void Task1() { Console.WriteLine(&q ...

  3. [转载]SharePoint 2013搜索爬外网配置

    本文介绍SharePoint 2013 设置外网(Internet)爬网源: 下面是步聚: 1. 新建外部爬网源 a. 打开 “SharePoint 2013 Central Administrati ...

  4. [转载]在线文档预览方案-Office Web Apps

    最近在做项目时,要在手机端实现在线文档预览的功能.于是百度了一下实现方案,大致是将文档转换成pdf,然后在通过插件实现预览.这些方案没有具体实现代码,也没有在线预览的地址,再加上项目时间紧迫.只能考虑 ...

  5. .NET通用开发框架

    在开源中国社区,简单整理了下比较好的.NET通用开发框架.一个好的通用框架大概包括:开源.扩展性好.灵活性好.复用性好.维护性好.易测试.易发布.易部署.快速业务搭建(或业务集成).通用性强.参考资料 ...

  6. JavaScript 正则表达式提取感兴趣的字符串

    var tdid="gov_sslim"; var reg=/(\w+)lim/; var name=tdid.match(reg); console.log(name[1]); ...

  7. QCustomplot使用分享(六) 坐标轴和网格线

    一.概述 前边已经写了5篇对QCustomPlot的讲解,看过上述的几篇文章后,基本就能做一些简单的使用了,但是如果想要做到高度的控制图表,那么坐标轴将是很重要的一部分,因为坐标轴就是图表的一个参考系 ...

  8. QCustomplot使用分享(五) 布局

    一.历史对比 关于QCPLayoutElement这个元素的讲解之前,我想先对1.3.2release版本和2.0.0beta版本的该元素做以简单的对比介绍,首先,1.3.2release版本时,鼠标 ...

  9. Logger.getLogger和LogFactory.getLog的区别

    Logger来自log4j自己的包.如果用Logger.getLogger,需要一个log4j的jar包,用此方式你只能依靠log4j: LogFactory来自common-logging包.如果用 ...

  10. 2015 Multi-University Training Contest 1 - 1002 Assignment

    Assignment Problem's Link: http://acm.hdu.edu.cn/showproblem.php?pid=5289 Mean: 给你一个数列和一个k,求连续区间的极值之 ...