一、数据验证

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. Visual Studio .NET项目转换器(ProjectConverter)修改

    Visual Studio .NET 项目转换器非常类似于ASP.NET版本转换器,区别在于它用于转换 Visual Studio 项目文件的版本.尽管在 .NET 框架的 1.0 版和 1.1 版之 ...

  2. com.sun.org.apache.xerces.internal.impl.io.MalformedByteSequenceException: Invalid byte 2 of 2-byte

    com.sun.org.apache.xerces.internal.impl.io.MalformedByteSequenceException: Invalid byte 2 of 2-byte ...

  3. C#将Json字符串反序列化成List对象类集合

    摘自:http://blog.csdn.net/cdefg198/article/details/7520398 using System.IO; using System.Web.Script.Se ...

  4. 20款优秀的国外 Mobile App 界面设计案例

    在下面给大家分享的移动应用程序界面设计作品中,你可以看到不同创意类型的视觉效果.如果你想获得灵感,那很有必要看看下面20个优秀用户体验的移动应用 UI 设计.想要获取更多的灵感,可以访问移动开发分类, ...

  5. UWP开发入门(十六)——常见的内存泄漏的原因

    本篇借鉴了同事翔哥的劳动成果,在巨人的肩膀上把稿子又念了一遍. 内存泄漏的概念我这里就不说了,之前<UWP开发入门(十三)——用Diagnostic Tool检查内存泄漏>中提到过,即使有 ...

  6. 华为手机Edittext光标(cursor)颜色修改

    华为手机的emui系统经常让人发出“可以可以,这很华为”的感叹 这两天在edittext部分也发生了这样的事情 正常edittext光标的颜色和宽度都说可以修改的,只需要通过xml中的 textCur ...

  7. 关于WIndows内核自映射方案的通俗解释

    在一次操作系统课程上听老师说了这么一个有意思的东西,windows的自映射方案居然达到了把4K的页目录的线性地址“藏”在4M页表里的效果,感觉甚是奇特,于是乎就想着说怎么去算.光会算之后仍旧不满足,我 ...

  8. 比较body.onload(function())、$(document).ready(function())与$(windows).load(function)

    原理对比: body.onload(function())是优先将document的DOM渲染,即将页面所有的元素(包括html标签以及所引用到的图片,flash媒体等媒体文件)加载完成,然后再执行页 ...

  9. Unity3D读取模型文件自动生成AnimatorController简单实例

    前几天接到一个任务,做一个导入.控制模型动画的工具类,没有太具体的要求,于是就自行思考实际需求,最终根据宣雨松老师的一篇博客,自己规范了一下写了一个工具类.相关工具代码及测试用例已上传至Github. ...

  10. 才知道百度也提供了智能DNS服务 - 加速乐

    http://jiasule.baidu.com/ 智能DNS 依托百度多年积累的高精度DNS识别库,平均只需5秒全球DNS服务器全部生效,百度蜘蛛1秒生效.抗攻击.无限解析记录,免费支持电信.联通. ...