Struts2输入校验之validate输入校验方式

一.在Web系统项目中有大量的视图页面需要用户自行输入很多数据。这些数据的类型有很多种。为了防止某些客户的恶意输入以及对Web项目的恶意破坏,必须引入输入校验,像Windows操作系统的防火墙一样把一些垃圾数据过滤掉,挡在Web系统之外。接下来就来介绍一下validate输入校验方式:

1.validate方法进行输入校验:这里直接附上一个简单的用户注册功能具体介绍利用validate方法对数字、字符串、日期等类型数据进行输入校验方式介绍:

(1).首先,新建一个Struts2项目InputValidate,项目结构图如下:

(2).新建一个注册页面,register.jsp页面,用于输入校验的输入数据,代码如下:

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ taglib uri="/struts-tags" prefix="s"%>
<%
	String path = request.getContextPath();
	String basePath = request.getScheme() + "://"
			+ request.getServerName() + ":" + request.getServerPort()
			+ path + "/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">

<title>My JSP 'register.jsp' starting page</title>

<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
	<link rel="stylesheet" type="text/css" href="styles.css">
	-->

</head>

<body>
	<s:form action="register" namespace="/">
		<s:textfield name="username" label="用户名"></s:textfield>
		<s:password name="password" label="密码"></s:password>
		<s:password name="password1" label="密码确认"></s:password>
		<s:textfield name="birthday" label="生日"></s:textfield>
		<s:textfield name="mobile" label="手机号码"></s:textfield>
		<s:textfield name="age" label="年龄"></s:textfield>
		<s:submit value="注册"></s:submit>
	</s:form>
</body>
</html>

(3).新建一个Action类,RegisterAction类,代码如下:

package com.gk.action;

import java.util.Date;

import com.opensymphony.xwork2.ActionSupport;

public class RegisterAction extends ActionSupport {
	private String username;
	private String password;
	private String password1;
	private Date birthday;
	private String mobile;
	private int age;

	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 getPassword1() {
		return password1;
	}

	public void setPassword1(String password1) {
		this.password1 = password1;
	}

	public Date getBirthday() {
		return birthday;
	}

	public void setBirthday(Date birthday) {
		this.birthday = birthday;
	}

	public String getMobile() {
		return mobile;
	}

	public void setMobile(String mobile) {
		this.mobile = mobile;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public String execute() {
		return SUCCESS;
	}

	public void validate() {
		if (getUsername() == null || getUsername().trim().equals("")) {
			addFieldError("username", "请输入用户名");
		}
		if (getPassword() == null || getPassword().trim().equals("")) {
			addFieldError("password", "请输入密码");
		}
		if (getPassword1() == null || getPassword1().trim().equals("")) {
			addFieldError("password1", "请输入确认密码");
		}
		if (!getPassword().equals(getPassword1())) {
			addFieldError("password", "密码和输入密码不一致");
		}
		if (getBirthday() == null) {
			addFieldError("birthday", "请输入生日日期");
		} else if (getBirthday().after(new Date())) {
			addFieldError("birthday", "请不要输入未来日期");
		}
		if (getMobile().length() != 11) {
			addFieldError("mobile", "请输入正确的手机号码");
		}
		if (getAge() < 1 || getAge() > 120) {
			addFieldError("age", "请输入正确年龄");
		}
	}

}

(4).接着配置一下struts.xml文件,成功跳转success.jsp页面,代码如下:

<?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.0.dtd">

<struts>
	<constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>
	<constant name="struts.devMode" value="true"></constant>
	<package name="input" namespace="/" extends="struts-default">
		<action name="register" class="com.gk.action.RegisterAction">
			<result name="success">/success.jsp</result>
			<result name="input">/register.jsp</result>
		</action>
	</package>
</struts>

(5).接下来附上success.jsp的代码,用来输出注册成功后的信息:

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ taglib uri="/struts-tags" prefix="s"%>
<%
	String path = request.getContextPath();
	String basePath = request.getScheme() + "://"
			+ request.getServerName() + ":" + request.getServerPort()
			+ path + "/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">

<title>My JSP 'success.jsp' starting page</title>

<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
	<link rel="stylesheet" type="text/css" href="styles.css">
	-->

</head>

<body>
	用户名为:
	<s:property value="username" />
	<br /> 密码为:
	<s:property value="password1" />
	<br /> 生日为:
	<s:property value="birthday" />
	<br /> 手机号码为:
	<s:property value="mobile" />
	<br /> 年龄为:
	<s:property value="age" />
</body>
</html>

(6).部署此项目到Tomcat服务器上,开启Tomcat服务器,在地址栏输入:http://localhost:8083/InputValidate/register.jsp ,运行效果如下:

不输入任何数据,点击注册按钮,如下图所示:

输入密码不一致时和生日日期不合法时,如下图所示:

(7).对以上代码进行解释:

— Struts2对输入校验这方面采用的最基本的方法是在每个Action里继承ActionSupport类,并且重写它的输入校验方法validate()。上述例子中的RegisterAction代码中显示,根据页面上输入的各种校验将所有不符合输入校验规则的错误信息都由ActionSupport类中另一方法addFieldError方法将错误信息加入到表单错误信息,并且在输入数据的页面显示,而不会再由Action导航到注册成功页面。struts.xml也定义了一个名字为"input"的result,它表明将所有输入失败的错误信息导航到一个特定页面。上述例子将这个特定页面定义为数据输入的页面。

— 再次阅读RegisterAction代码,可以发现在validate方法里编写了很多if语句,每一个if语句中都针对表单中某一字段进行输入校验。如果发现不符合输入校验规则都调用addFieldError方法。该方法中有两个参数,第一个参数都是表单中字段名,这里所有的名字和输入数据的页面中每一个字段的name属性中内容相同。否则Struts2是找不到具体错误信息是针对哪一个字段。这些内容就是在输入校验失败时候显示在之前所说的特定页面中的。

— validate方法中的各个if语句判断了表单中各个字段的输入数据是否符合输入校验的规则,这些规则也是开发人员根据特定业务逻辑定义的。比如其中数据是否输入,输入的生日信息是否在当前日期之前等等。这里又可以发现并没有对这些字段进行类型转换,但在Action中某些字段类型都已经变成Java的一些基本类型。比如生日字段,页面上输入时候是字符串,在Action中已经变成Java中的Date类型。页面上输入的数据已经都由字符串类型转换成Action中指定的Java类型。

— 而输入生日时因为Struts2通过内置的类型转换器进行类型转换,转换失败所以提示Invalid field value for field “birthday”信息。

2.validateXXX方法进行输入校验:这里我们将上面那个InputValidate项目里的一些代码进行修改,看下如何利用validateXXX方法对Action中某一特定的方法进行校验。

(1).首先,修改InputValidate项目的register.jsp页面,只是表单的action属性改为register!register.action,即动态调用action,修改后如下:

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ taglib uri="/struts-tags" prefix="s"%>
<%
	String path = request.getContextPath();
	String basePath = request.getScheme() + "://"
			+ request.getServerName() + ":" + request.getServerPort()
			+ path + "/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">

<title>My JSP 'register.jsp' starting page</title>

<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
	<link rel="stylesheet" type="text/css" href="styles.css">
	-->

</head>

<body><s:fielderror></s:fielderror>
	<s:form action="register!register.action" namespace="/">
		<s:textfield name="username" label="用户名"></s:textfield>
		<s:password name="password" label="密码"></s:password>
		<s:password name="password1" label="密码确认"></s:password>
		<s:textfield name="birthday" label="生日"></s:textfield>
		<s:textfield name="mobile" label="手机号码"></s:textfield>
		<s:textfield name="age" label="年龄"></s:textfield>
		<s:submit value="注册"></s:submit>
	</s:form>
</body>
</html>

(2).接着修改一下RegisterAction这个类,里面写了一个方法register和validateRegister方法,其中手机号码那里使用了正则表达式来验证手机号的正确性,修改后代码如下:

package com.gk.action;

import java.util.Date;

import com.opensymphony.xwork2.ActionSupport;

public class RegisterAction extends ActionSupport {
	private String username;
	private String password;
	private String password1;
	private Date birthday;
	private String mobile;
	private int age;

	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 getPassword1() {
		return password1;
	}

	public void setPassword1(String password1) {
		this.password1 = password1;
	}

	public Date getBirthday() {
		return birthday;
	}

	public void setBirthday(Date birthday) {
		this.birthday = birthday;
	}

	public String getMobile() {
		return mobile;
	}

	public void setMobile(String mobile) {
		this.mobile = mobile;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public String register() {
		return SUCCESS;
	}

	public void validateRegister() {
		if (getUsername() == null || getUsername().trim().equals("")) {
			addFieldError("username", "请输入用户名");
		}
		if (getPassword() == null || getPassword().trim().equals("")) {
			addFieldError("password", "请输入密码");
		}
		if (getPassword1() == null || getPassword1().trim().equals("")) {
			addFieldError("password1", "请输入确认密码");
		}
		if (!getPassword().equals(getPassword1())) {
			addFieldError("password", "密码和输入密码不一致");
		}
		if (getBirthday() == null) {
			addFieldError("birthday", "请输入生日日期");
		} else if (getBirthday().after(new Date())) {
			addFieldError("birthday", "请不要输入未来日期");
		}
		if (getMobile().isEmpty()) {
			addFieldError("mobile", "手机号码不为空");
		} else if (!getMobile().matches("\\d*")) {
			addFieldError("mobile", "手机号码错误");
		} else if (getMobile().length() != 11) {
			addFieldError("mobile", "请输入正确的手机号码");
		}
		if (getAge() < 1 || getAge() > 120) {
			addFieldError("age", "请输入正确年龄");
		}
	}
}

(3).其它保持不变,重新部署此项目和开启服务器后,不输入任何数据,点击注册按钮,其地址栏发生变化,如下图:

密码输入不一致和生日类型转换失败,手机号码不正确的话,如下图所示:

(4).对以上代码解释:

— Struts2中除了validate方法之外它还有1种validateXXX方法针对Action中某一特定方法进行该方法的各种字段的输入校验。其中XXX就是该特定方法名。在本示例中定义了一个register方法,该方法和上一小节中的execute方法类似只是一个简单的导航。但是在该registerAction中就没有了validate方法,取而代之的是validateRegister方法。

注意:如果使用validateRegister方法,那最好不要再使用validate方法。虽然和上一小节示例代码比较这两个方法里的内容是完全一摸一样的,但是validate方法是对所有Action中方法的输入校验都进行校验,validateRegister方法只对register方法进行校验。因此两者不能重复使用,都使用会造成两个方法都进行了校验的结果。执行顺序是先validateRegister后validate。如果validateRegister方法有特殊的输入校验则就会被validate方法“覆盖”,因此达不到预期的输入校验目的。

— validateRegister方法中各个if语句定义和上一小节的validate方法内容相同。这里只是作为示例所以两个方法中的内容相同,其实可以和上一小节中的validate方法的内容不相同,用来进行register方法中特定的表单字段输入校验。

— 在数据输入的视图界面又增加了Struts2的标签fielderror。在表单头部也有出错信息显示。这其实和Struts2的校验顺序有关。

在之前说明validateRegister方法和validate方法时候也记述了两者的执行校验顺序是先validateRegister后validate。其实在视图界面进行表单提交后。输入校验顺序是以如下的顺序:

查找Action中是否有validateXXX方法。如果有则执行该方法。将校验产生的错误信息放置到ActionContext对象中。

查找Action中是否有validate方法。如果有则执行该方法。将校验产生的错误信息放置到ActionContext对象中。

查找视图界面是否有fielderror标签定义。如果有则返回到result为“input”的视图。同时ActionContext对象中有关的输入校验的错误信息也显示在该视图中。

Struts2的输入校验顺序就是按照如上说明来先后执行的,这也更好的说明了validateRegister方法和validate方法并存在Action时候输入校验是如何进行的。

(5).修改后的InputValidate项目下载地址:http://download.csdn.net/detail/u012561176/8911561

3.以上内容仅供大家学习参考,写得不好,请见谅,如有错误,请指出,谢谢!



版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-11 22:47:14

Struts2输入校验之validate输入校验方式的相关文章

JavaEE----使用Struts2的输入校验之手动编码校验

Struts.xml <action name="login" class="com.cug.demo04.LoginAction"> <result>/demo04/success.jsp</result> <result name="input">/demo04/login.jsp</result> </action> <action name="logi

案例17-validate自定义校验规则校验验证码是否输入正确

1 自定义校验规则代码 <script type="text/javascript"> //使用validate插件进行表单的校验 $(function(){ $("#myform").validate({ rules:{ checkCode:{ "required":true, "checkVerificationCode":true } }, messages:{ checkCode:{ "requi

SpringMVC框架下数据的增删改查,数据类型转换,数据格式化,数据校验,错误输入的消息回显

在eclipse中javaEE环境下: 这儿并没有连接数据库,而是将数据存放在map集合中: 将各种架包导入lib下... web.xml文件配置为 <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/

Spring Boot构建的Web项目如何在服务端校验表单输入

本文首发于个人网站:Spring Boot构建的Web项目如何在服务端校验表单输入 这个例子用于演示在Spring Boot应用中如何验证Web 应用的输入,我们将会建立一个简单的Spring MVC应用,来读取用户输入并使用validation注解来检查,并且当用户输入错误时,应用需要再屏幕上显示错误信息提示用户重新输入. 首先构建Maven项目,该项目的pom文件内容如下: <?xml version="1.0" encoding="UTF-8"?>

(转)struts2:数据校验,通过XWork校验框架实现(validation.xml)

转载自:http://www.cnblogs.com/nayitian/p/3475661.html struts2:数据校验,通过XWork校验框架实现(validation.xml) 根据输入校验的处理场所的不同,可以将输入校验分为客户端校验和服务器端校验两种.服务器端验证目前有两种方式: 第一种: 参考:struts2:数据校验,通过Action中的validate()方法实现校验,图解 第二种: 使用validate()方法校验时,如果Web应用中存在大量Action就需要多次重写val

Struts2学习(三)———— 输入校验和拦截器

一.输入校验 在以前我们写一个登录页面时,并没有限制用户的输入,不管用户输入什么,我们都存入数据库中,很显然这是不行的,我们需要检测用户输入的文本是否合法,是否符合我们需要的文本格式,符合菜放行,而struts2中就有这种功能,能帮我们在服务器段进行判断,比如用户名不能为空,年龄只能在0-100之间等.现在我们就来说说如何使用struts2中的校验功能把. 分为两种,编程式校验和配置校验(XML配置校验) 1.1编程式校验, 对action中所有方法都执行校验 实现Validateable接口,

Struts2中使用校验文件对表单的校验以及常用的校验

之前的手动校是在Action中编写validate犯法或validateXXX形式的方法来完成校验的,如果要给予验证框架来完成输入校验,只需在于Action同一目录下创建一个xml格式的验证文件即可.而之前Action中添加validate方法或validateXXX方法就不需要了. Action.java代码 package action; import com.opensymphony.xwork2.ActionSupport; public class check extends Acti

jQuery Validate 自定义校验及ajax校验

http://www.w3cschool.cc/jquery/jquery-plugin-validate.html这里文档比较全面! 实践: 复杂的一些校验,如正则校验,可以通过jQuery.validate.addMethod()http://jqueryvalidation.org/jQuery.validator.addMethod 来实现,添加完后,就可以通过jQuery.validate()在rules中添加校验规则 jQuery.validator.addMethod("numOr

jQuery表单校验jquery.validate.js的使用

一:首先在页面引入 <script type="text/javascript" src="jquery.js"></script> <script type="text/javascript" src="jquery.validate.js"></script> 二:纯HTML代码 <html xmlns="http://www.w3.org/1999/xhtm