Struts2入门(四)——数据输入验证
一、前言
1.1、什么是输入验证?为什么需要输入验证?
在上一篇文章中,我们学习了数据类型转换,我们提到了表示层数据处理的两个方法,也提到了用户输入数据需要进行类型转换才能得到我们想要的数据,那么,我们怎么确定类型转换后的数据,是我们想要的数据呢?这里有点绕。你可以这样想:一个成年男子年龄是18岁,你现在想要得到18这个数据,但是,用户输入32,经过类型转换也是对的,但是数据不是你想要的。这时候,我们要怎么办?所以输入验证在这里就有用处了。
类型转换和输入验证的关系是:类型转换是输入验证的前提,如果类型转换都出错了,那就不用再进行输入验证了。但是很多时候类型转换和输入验证是同时完成的。
输入验证有两种:
1、客户端验证;
2、服务端验证。这里主要讲解的是服务端验证(重写ValidateXxx方法和xml配置文件验证)
1.2、重写ValidateXxx方法的验证流程
1、类型转换器负责对字符串的请求参数进行类型转换,并将这些值设置成Action的属性值
2、在执行类型转换过程中可能出现异常,如果出现异常,异常信息会自动保存到ActionContext中,conversionError拦截器负责将其封装到fieldError中
3、通过反射调用ValidateXxx()方法,其中Xxx是即将处理用户请求的处理逻辑所对应的方法名
4、调用Action类的Validate方法
5、如果上面的步骤没有出现fieldError,将调用Action里处理用户请求的处理方法,如果出现fieldError,系统将转入input逻辑视图所指定的视图。
二、输入验证
2.1、输入验证这里讲解的有两种方式:
1、重写Validate方法或者自定义ValidateXxx方法(其中的Xxx是自己定义的名字,会先执行该方法,在执行Validate方法)
2、新建xml进行验证
2.2、重写Validate方法
在MVC框架,都会提供规范的数据验证部分,Struts2在这里提供的是一个Validate方法,我们重写Validate方法就可以进行输入验证,但是,重写Validate方法有两个点需要知道:1、Validate方法会在execute方法之前被执行;2、Validate方法对所有的Action都会执行校验规则,为了区别某一个Action,我们可以使用ValidateXxx方法。
注意:以下的例子是局部类型转换和输入验证一起使用的例子。
简单的注册验证例子:
新建实体类User:
package com.validatexxx;
public class User {
private String username;
private String password;
private String repassword;
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 String getRepassword() {
return repassword;
}
public void setRepassword(String repassword) {
this.repassword = repassword;
}
}
User
新建视图:Register.jsp
<%@ 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>注册用户</title>
</head>
<body>
<h2>使用validateXXX()方法验证</h2>
<form action="register_test">
用户:<input type="text" name="user"><br/>
密码:<input type="password" name="user"><br/>
密码:<input type="password" name="user"><br/>
<input type="submit" value="提交">
</form>
</body>
</html>
新建RegisterAction类继承ActionSupport
package com.validatexxx; import com.opensymphony.xwork2.ActionSupport; //重写validate()和validateXXX指定方法进行验证
/*
* 在struts.xml配置method方法为test(),会先调用ValidateTest()方法,
* 然后在调用validate方法
* 之后test方法被调用
* */
public class RegisterAction extends ActionSupport {
private User user; public User getUser() {
return user;
} public void setUser(User user) {
this.user = user;
}
//
@Override
public void validate(){
System.out.println("重写Validate方法");
if (null == user.getPassword() || "".equals(user.getPassword()) || null == user.getRepassword() || "".equals(user.getRepassword())) {
this.addFieldError("repassword", "repassword should be same password");
return;
}
if (!user.getPassword().equals(user.getRepassword())) {
//当FieldError中存在数据时,服务器会自动帮我们跳转到input的逻辑视图
this.addFieldError("repassword", "repassword should be same password");
}
}
//
public void validateTest(){
System.out.println("自定义校验方法:ValidateTest");
}
//
public String test(){
System.out.println("test:方法");
return SUCCESS;
}
}
注意:这里的属性是User,所以你jsp页面参数的名字要写实例的名字user,然后你还需要去创建一个类型转换器,返回一个填充好数据的类
新建struts.xml,存放在WEB-INF/classes/struts.xml

注意:这里的method必须是你ValudateXxx()方法后面你自己定义的,笔者这里是test。使用*的话,struts2还必须配置 strict-method-invocation="false",据说是因为版本太高了,它的安全性增加了,所有必须加才能够使用*

新建Usertypeconverter类继承StrutsTypeConverter(创建一个类型转换器)
package com.validatexxx; import java.util.Map; import org.apache.struts2.util.StrutsTypeConverter; //类型转换的类
public class Usertypeconverter extends StrutsTypeConverter { @Override
public Object convertFromString(Map arg0, String[] arg1, Class arg2) {
System.out.println("Usertypeconverter:类型转换!");
User user = new User();
user.setUsername(arg1[0]);
user.setPassword(arg1[1]);
user.setRepassword(arg1[2]);
return user;
} @Override
public String convertToString(Map arg0, Object arg1) {
User u = (User)arg1;
return u.getUsername()+"!";
} }
注意:该类型转换器创建好之后还需新建一个RegisterAction-conversion.properties,放在同级目录下

该文件的内容有:

前面是你在RegisterAction的属性名,后面是类型转换器的具体路径。
新建成功视图:success.jsp
<%@ 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>Success</title>
</head>
<body>
<h2>服务端使用validate方法验证</h2>
成功
</body>
</html>
success.jsp
新建错误视图:input.jsp
<%@ 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>
Error:<s:fielderror/>
</body>
</html>
input.jsp
代码执行成功的效果如下:
Register.jsp页面

成功跳转的页面为:success.jsp

控制台测试结果为:

数据跳转到Usertypeconverter进行类型转换,之后跳转到RegisterAction,执行ValidateTest方法(),Validate,test之后返回SUCCESS,然后执行result的视图。
我们看代码执行失败的顺序:
Register.jsp页面

input.jsp页面

控制台测试效果:

在Validate方法里面,笔者代码为:this.addFieldError(),在前面有说过,如果添加错误的话,那么服务器会自动帮我们跳转到错误的界面。它会返回input,而input在struts.xml中就有配置,会返回到input.jsp界面。
2.3、新建xml进行输入验证
新建视图界面:Test.jsp
<%@ 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>使用XML校验</title>
</head>
<body>
<s:form action="empinfo" method="post">
<s:textfield name="name" label="Name" size="20" />
<s:textfield name="age" label="Age" size="20" />
<s:submit name="submit" label="Submit" align="center" />
</s:form>
</body>
</html>
新建Employee类继承ActionSupport
该类有使用重写Validate方法和Xml配置,我们可以选择其中一种进行验证就可以
package com.validatexxx; import com.opensymphony.xwork2.ActionSupport; //使用validate()方法验证,这是服务端验证!
public class Employee extends ActionSupport {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
//第二步再执行该方法
public String execute(){
System.out.println("execute:"+this.age);
return SUCCESS;
}
/* 使用服务端的校验:重写validate方法();
//第一步先执行该方法
//重写validate方法有缺陷:每次都会使用validate方法验证,造成极大的资源浪费。
public void validate(){
System.out.println("validate");
if (name == null || name.trim().equals(""))
{
//当往该方法添加数据的时候,服务器会返回input,之后跳转到input.jsp页面中。
addFieldError("name","The name is required");
}
if (age < 28 || age > 65)
{
addFieldError("age","Age must be in between 28 and 65");
}
}
*/
}
在Struts.xml中进行配置:

这里的success.jsp和input.jsp还是使用上面的。
之后我们需要新建Employee-validation.xml,路径放在与Employee同级目录下,注意:-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="name">
<field-validator type="required">
<message>
The name is required.
</message>
</field-validator>
</field> <field name="age">
<field-validator type="int">
<param name="min">29</param>
<param name="max">64</param>
<message>
Age must be in between 28 and 65
</message>
</field-validator>
</field>
</validators>
重点:该文件的dtd限制必须有,不然回报错误:
ERROR DefaultDispatcherErrorHandler Exception occurred during processing request: [Connection timed out: connect - [unknown location], null]

接下来我们使用http://localhost:8080/LearStruts2/ValidateJSP/Test.jsp进行访问。
测试成功:
Test.jsp界面:

success.jsp

测试失败例子:

input.jsp界面:

说明例子是正确的。
其实在Struts2中有多个内置验证器:必填验证器,必填字符串验证器,整数验证器,日期验证器,表达式验证器,字符长度验证器,正则表达式验证器...等等,这个有需要的话,笔者在一一述说。
以上就是输入验证的两种方式。不足之处请下方留言,我会改正,谢谢!
Struts2入门(四)——数据输入验证的更多相关文章
- [原创]java WEB学习笔记70:Struts2 学习之路-- 输入验证,声明式验证,声明是验证原理
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- Struts2入门(三)——数据类型转换
一.前言 笔者一直觉得,学习一个知识点,你首先要明白,这东西是什么?有什么用?这样你才能了解.好了,不说废话. 1.1.类型转换为何存在?什么是类型转换? 在MVC框架中,都是属于表示层解决方案,都需 ...
- [ruby on rails] 跟我学之(10)数据输入验证
这里简单加上几个验证,非空,最小长度,唯一 修改模型 修改app/models/post.rb文件,如下: class Post < ActiveRecord::Base #attr_acces ...
- struts2(四)之输入校验
前言 这个本来是昨天就写好的,但是不知道为什么没有保存成功!但是今天起来再写一遍就当巩固一下知识吧. 一.输入校验概述 在以前我们写一个登录页面时,并没有限制用户的输入,不管用户输入什么,我们都存入数 ...
- Jqgrid入门-结合Struts2+json实现数据展示(五)
DEMO用的是ssh框架实现的,具体怎么搭建的就不多做说明了.分页表格的数据操作难点就是数据展现.至于增删改直接用hibernate原生的方法实现即可. 初步分析:表格要实现分页,那么 ...
- java struts2入门学习--基于xml文件的声明式验证
一.知识点总结 后台验证有两种实现方式: 1 手工验证顺序:validateXxx(针对Action中某个业务方法验证)--> validate(针对Action中所有的业务方法验证) 2 声明 ...
- struts2输入验证
1.方法 ① 基于Annotations的验证 ②基于XML配置的验证 http://blog.csdn.net/furongkang/article/details/692204 ...
- Struts2的输入验证
一.概述: ① Struts2的输入验证 –基于 XWorkValidation Framework的声明式验证:Struts2提供了一些基于 XWork Validation Framework的内 ...
- asp.net mvc3 数据验证(四)—Remote验证的一个注意事项
原文:asp.net mvc3 数据验证(四)-Remote验证的一个注意事项 前几篇把asp.net mvc3 中基于Model的主要数据验证的方法都已经讲完了,本节纯粹只是讲一个我 ...
随机推荐
- iOS微信第三方登录实现
iOS微信第三方登录实现 一.接入微信第三方登录准备工作.移动应用微信登录是基于OAuth2.0协议标准构建的微信OAuth2.0授权登录系统.在进行微信OAuth2.0授权登录接入之前,在微信开 ...
- git多账号登录问题
作者:白狼 出处:http://www.manks.top/git-multiply-accounts.html 本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文 ...
- 我的MYSQL学习心得(六) 函数
我的MYSQL学习心得(六) 函数 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据类 ...
- Topshelf 学习 跨平台
Topshelf是一个开源的跨平台的宿主服务框架,支持Windows和Mono,只需要几行代码就可以构建一个很方便使用的服务宿主. 官网:http://topshelf-project.com Git ...
- JS中给正则表达式加变量
前不久同事询问我js里面怎么给正则中添加变量的问题,遂写篇博客记录下. 一.字面量 其实当我们定义一个字符串,一个数组,一个对象等等的时候,我们习惯用字面量来定义,例如: var s = &quo ...
- 字符型图片验证码识别完整过程及Python实现
字符型图片验证码识别完整过程及Python实现 1 摘要 验证码是目前互联网上非常常见也是非常重要的一个事物,充当着很多系统的 防火墙 功能,但是随时OCR技术的发展,验证码暴露出来的安全问题也越 ...
- MVVM大比拼之AngularJS源码精析
MVVM大比拼之AngularJS源码精析 简介 AngularJS的学习资源已经非常非常多了,AngularJS基础请直接看官网文档.这里推荐几个深度学习的资料: AngularJS学习笔记 作者: ...
- EasyPR--开发详解(5)颜色定位与偏斜扭转
本篇文章介绍EasyPR里新的定位功能:颜色定位与偏斜扭正.希望这篇文档可以帮助开发者与使用者更好的理解EasyPR的设计思想. 让我们先看一下示例图片,这幅图片中的车牌通过颜色的定位法进行定位并从偏 ...
- web全栈开发之网站开发一(Mac环境配置)
个人第一次写博客,想给大家分享的是PHP+HTML5+MySQL开发一个个人网站所需的部分技术,希望能帮到志同道合和开发者,别人小白高手勿喷就行 先说一下我在制作这个网站之前的配置: 我用的是MacB ...
- 简述linux同步与异步、阻塞与非阻塞概念以及五种IO模型
1.概念剖析 相信很多从事linux后台开发工作的都接触过同步&异步.阻塞&非阻塞这样的概念,也相信都曾经产生过误解,比如认为同步就是阻塞.异步就是非阻塞,下面我们先剖析下这几个概念分 ...