Struts2数据输入验证教程详解_java

一、前言

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:

 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;
  }
  //2
  @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");
     }
  }
  //1
  public void validateTest(){
    System.out.println("自定义校验方法:ValidateTest");
  }
  //3
  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

 success.jsp

新建错误视图:input.jsp

 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数据输入验证教程详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索struts2数据验证
struts2表单验证详解、struts.xml配置详解、struts2配置文件详解、struts2值栈详解、struts2.xml配置详解,以便于您获取更多的相关知识。

时间: 2024-09-16 10:06:58

Struts2数据输入验证教程详解_java的相关文章

Spring整合MyBatis(Maven+MySQL)图文教程详解_java

一. 使用Maven创建一个Web项目 为了完成Spring4.x与MyBatis3.X的整合更加顺利,先回顾在Maven环境下创建Web项目并使用MyBatis3.X,第一.二点内容多数是回顾过去的内容 . 1.2.点击"File"->"New"->"Other"->输入"Maven",新建一个"Maven Project",如下图所示: 1.2.请勾选"Create a si

Struts中使用validate()输入校验方法详解_java

1.在ActionSupport中有一个validate()方法,这个方法是验证方法,它会在execute()方法执行之前执行,所以能够起到很好的验证的作用. @Override //重写Action中的validate()方法 public void validate() { if(null==this.username||this.username.length()<4||this.username.length()>6){ this.addActionError("userna

Struts2 Result 返回JSON对象详解_java

如果是作为客户端的HTTP+JSON接口工程,没有JSP等view视图的情况下,使用Jersery框架开发绝对是第一选择.而在基于Spring3 MVC的架构下,对HTTP+JSON的返回类型也有很好的支持.但是,在开发工作中,对功能的升级是基于既定架构是很常见的情况.本人碰到需要用开发基于Struts2的HTTP+JSON返回类型接口就是基于既定框架结构下进行的. Struts2返回JSON有两种方式:1.使用Servlet的输出流写入JSON字符串:2.使用Struts2对JSON的扩展.

java中Struts2文件上传问题详解_java

首先是网页部分,upload_file.jsp <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <!DOCTYPE HTML> <html> <head> <title>Upload File</title> </head> <body> <form act

java图片验证码生成教程详解_java

首先,我们先来看本地如何生成图片验证码的,再来写输出到网页的验证码如何实现. 先来看最简单的-实现的功能是,将一个字符串变成图片写入到文件中 实现代码: package cn.hncu.img; import java.awt.Graphics; import java.awt.image.BufferedImage; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOE

WebService教程详解(二)_java

在上篇文章给大家介绍了WebService教程详解(一) 使用工具的原因: 1. 使用工具可以更好的了解WebService请求的过程 2. 使用工具WsExplore可以获取SOAP数据发送和接收的格式 3. 使用工具Tcp/Ip Monitor可以监控拦截器请求头和响应头的具体数据 什么是SOAP? SOAP是一种基于XML编码规范的文本协议,简单的说SOAP就是在HTTP的基础上传输XML数据,以实现远程调用[无论你的服务端是什么语言书写的,只要接收SOAP协议的XML数据,并返回SOAP

Mybatis velocity脚本的使用教程详解(推荐)_java

可能很多童鞋都还不是很清楚在mybatis可以使用各种脚本语言来定义Mapper文件里面的动态SQL:目前mybatis支持的脚本语言有XML(默认的):Velocity和Freemarker三种.使用不同的脚本语言来完成Mapper文件的编写,第一是使用自己熟悉的脚本语言,第二是能够定义更多丰富的自定义指令来简化Mapper的开发,关于MyBatis支持脚本的原理分析,自定义脚本指令后面再写文章分析,本文先介绍mybatis中velocity脚本的使用方式. mybatis-velocity项

Oracle数据操作和控制语言详解_oracle

正在看的ORACLE教程是:Oracle数据操作和控制语言详解.SQL语言共分为四大类:数据查询语言DQL,数据操纵语言DML, 数据定义语言DDL,数据控制语言DCL.其中用于定义数据的结构,比如 创建.修改或者删除数据库:DCL用于定义数据库用户的权限:在这篇文章中我将详细讲述这两种语言在Oracle中的使用方法.  DML语言 DML是SQL的一个子集,主要用于修改数据,下表列出了ORACLE支持的DML语句. 插入数据 INSERT语句常常用于向表中插入行,行中可以有特殊数据字段,或者可

jQuery Validate验证框架详解

版本信息: /*! * jQuery Validation Plugin v1.14.0 * * http://jqueryvalidation.org/ * * Copyright (c) 2015 Jörn Zaefferer * Released under the MIT license */   一.导入js库 <script type="text/javascript" src="validate/jquery-1.6.2.min.js">&