`
wangyalei
  • 浏览: 53981 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

Struts2校验学习笔记(一)

阅读更多

最近学习了Struts2的输入校验,然后自己总结了下,以后可能还会回头看看自己的学习札记,就当给复习做个准备了。

对于输入校验,Struts2提供了两种方式,1:采用手工编写代码实现;2:基于XML配置方面实现 。

1:采用手工编写代码实现。

通过继承ActionSupport类,然后重写vlidate方法进行数据校验,当某个数据校验失败时,我们应该调用addFieldError()或是addActionError()这个方法向系统的FieldError添加信息,如果校验失败了,Struts2会自动转发到名为input的result这个结果页上面,在input视图上可以通过<s:fielderror /> 这样一个标签来获得失败信息,这样就可以完成一个校验了,(注意执行顺序:数据类型转换--------》数据字段校验-------》execute)具体代码如下

 

index.jsp:提供用户输入的界面 

<%@ page language="java" import="java.util.*" pageEncoding="GB18030"%>
<%@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">
<html>
	<head>
		<base href="<%=basePath%>">

      <script type="text/javascript">
       
             function validate(){
             		  return true;
             }
      
      </script>

 </head>

	<body>
	  <!--validate="true" 是 执行struts2的 客户端的验证  -->
		<s:form method="post" action="validation" onsubmit="return validate();">
			<s:textfield name="username" label="姓名" />
			<s:password name="password" label="密码" />
			<s:password name="repassword" label="重复密码" />
			<s:textfield name="age" label="年龄" />
			<s:textfield name="birth" label="出生日期" />
			<s:textfield name="graduation" label="毕业日期" />
			<s:textfield name="phone" label="手机号码" />
			<s:textfield name="email" label="地址邮箱" />
			
        <s:submit></s:submit>
      </s:form>
	</body>
</html>

 

  success.jsp -------------------》校验成功后 转到此页面 进行 输出 用户的信息

 

<%@ page language="java" import="java.util.*" pageEncoding="GB18030"%>
<%
	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>
		<form action="" method="post">
			<table algin="center" width="60%" boder="1">
				<tr>
					<td>
						姓名:
					</td>
					<td>
						${username }
					</td>
				</tr>

				<tr>
					<td>
						密码:
					</td>
					<td>
						${password }
					</td>
				</tr>

				<tr>
					<td>
						重复密码:
					</td>
					<td>
						${repassword }
					</td>
				</tr>


				<tr>
					<td>
						年龄:
					</td>
					<td>
						${age }
					</td>
				</tr>


				<tr>
					<td>
						出生日期:
					</td>
					<td>
						${birth }
					</td>
				</tr>


				<tr>
					<td>
						毕业日期:
					</td>
					<td>
						${graduation}
					</td>
				</tr>

				<tr>
					<td>
						手机号码:
					</td>
					<td>
						${phone}
					</td>
				</tr>

				<tr>
					<td>
						邮箱地址:
					</td>
					<td>
						${email}
					</td>
				</tr>

				<tr>
					<td>
						个人主页:
					</td>
					<td>
						${url}
					</td>
				</tr>


			</table>

		</form>
	</body>
</html>

 

 

为了防止用户输入的字段类型 不正确 例如:年龄 用户输入了 abc  所以我们 用配置一个文件 当struts2类型转换失败的时候 给用户提示(struts2类型转换 请看我写的学习笔记 )

 Validation.properties

 

invalid.fieldvalue.age = \u5E74\u9F84\u7C7B\u578B\u8F6C\u6362\u5931\u8D25
invalid.fieldvalue.birth = \u51FA\u751F\u65E5\u671F\u8F6C\u6362\u683C\u5F0F\u5931\u8D25
invalid.fieldvalue.graduation = \u6BD5\u4E1A\u65E5\u671F\u683C\u5F0F\u8F6C\u6362\u5931\u8D25

 

struts.xml

 

 

<?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.custom.i18n.resources" value="Validation"></constant>
	<package name="default" namespace="/" extends="struts-default">
		<action name="validation"
			class="cn.validation.test.Validation">
			<result name="success">/success.jsp</result>
			<result name="input">/index.jsp</result>
		</action>
	</package>
</struts>

 

 

  Validation.java

   

package cn.validation.test;

import java.util.Calendar;
import java.util.Date;
import java.util.regex.Pattern;

import com.opensymphony.xwork2.ActionSupport;

public class Validation extends ActionSupport {

	// 年龄
	private int age;
	// 生日
	private Date birth;
	// 邮箱
	private String email;
	// 毕业时间
	private Date graduation;
	// 密码
	private String password;
	// 手机号码
	private String phone;
	// 重复密码
	private String repassword;
	// 用户名
	private String username;

	public int getAge() {
		return age;
	}

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

	public Date getBirth() {
		return birth;
	}

	public void setBirth(Date birth) {
		this.birth = birth;
	}

	public String getEmail() {
		return email;
	}

	public void setEmail(String email) {
		this.email = email;
	}

	public Date getGraduation() {
		return graduation;
	}

	public void setGraduation(Date graduation) {
		this.graduation = graduation;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	public String getPhone() {
		return phone;
	}

	public void setPhone(String phone) {
		this.phone = phone;
	}

	public String getRepassword() {
		return repassword;
	}

	public void setRepassword(String repassword) {
		this.repassword = repassword;
	}

	public String getUsername() {
		return username;
	}

	public void setUsername(String username) {
		this.username = username;
	}

	@Override
	public String execute() throws Exception {
		System.out.println("execute");
		return "success";
	}

	@Override
	public void validate() {
		System.out.println(" validate ");
		if (null == username || username.length() < 6 || username.length() > 10) {

			this.addFieldError("username", "用户名应在6到10之间");
		}

		if (null == password || password.length() < 6 || password.length() > 10) {

			this.addFieldError("password", "密码应在6到10之间");
		}

		else if (null == repassword || repassword.length() < 6
				|| repassword.length() > 10) {

			this.addFieldError("repassword", "重复密码应在6到10之间");
		}

		else if (!password.equals(repassword)) {
			this.addFieldError("password", "重复密码与密码不一至");
		}

		if (age < 1 || age > 150) {

			this.addFieldError("age", "年龄应在1到150之间");
		}

		if (null == birth) {
			this.addFieldError("birth", "出生日期不能为空");
		}

		if (null == graduation) {
			this.addFieldError("graduation", "毕业时间不能为空");
		}

		if (null != graduation && null != birth) {
			// 毕业日期必须比 出生 日期大
			Calendar end = Calendar.getInstance();
			end.setTime(graduation);
			Calendar start = Calendar.getInstance();
			start.setTime(birth);
			if (!start.before(end)) {
				this.addFieldError("birth", "毕业日期必须大于出生日期");
			}

		}

		if (null == phone) {
			this.addFieldError("phone", "手机号码不能为空");
		}
		// 14.....是 3G 网卡 也是手机卡号
		if (!Pattern.compile("^1[3,4,5,8]\\d{9}$").matcher(phone).matches()) {
			this.addFieldError("phone", "手机号码格式不正确");
		}

		if (null == email) {
			this.addFieldError("email", "邮箱地址不能为空");
		}

		if (!Pattern
				.compile(
						"^([a-z0-9A-Z]+[-|\\.]?)+[a-z0-9A-Z]@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?\\.)+[a-zA-Z]{2,}$")
				.matcher(email).matches()) {
			this.addFieldError("email", "邮箱地址格式不正确");
		}

	}

}

 

以上是手工编码的形式进行了数据校验 ,不过这也有一个缺点 ,我们有时候不需要对 特有的方法进行校验 而 其他的方法

又必须校验,这怎么办呢? struts2 为我们提供了 很好的解决方案。

我们手工写一个方法 此方法的签名 与 validate()方法一样  ,例如 我们需要 对 abc() 方法进行 校验 ----》 validateAbc() ,(注意:虽然我们不写validate()方法 但他还是会执行的,如果对execute()方法进行校验我们写成 validateExecut())

2:采用XML实现。

 采用xml 配置实现,xml配置文件必须放到与action 同包中, 命名规则 ActionName-validation.xml(这个是对Action整体进行校验) 对Action 其中的方法进行校验————》AcitonName-MthodName-validation.xml

 Validation-validation.xml

<!DOCTYPE validators PUBLIC
        "-//OpenSymphony Group//XWork Validator 1.0.2//EN"
        "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">

<validators>
	<!-- name="View name"  -->

	<field name="username">
		<!-- type 用什么类型进行 判断   short-circuit="true" 短路 如果此不成立 就不向下判断 -->
		<field-validator type="requiredstring" short-circuit="true">
			<message key="用户名不能为空" />
		</field-validator>
		<field-validator type="stringlength">
			<param name="maxLength">10</param>
			<param name="minLength">6</param>
			<message>用户名必须在${minLength} 与${maxLength} 之间</message>
		</field-validator>
	</field>

	<!-- 也可以这样写
		<validator type="requiredstring" short-circuit="true">
		<param name="fieldName">username</param>
		<message key="用户名不能为空"></message>
		</validator>
		<validator type="stringlength">
		<param name="fieldName">username</param>
		<param name="maxLength">10</param>
		<param name="minLength">6</param>
		<message>用户名必须在${minLength} 与${maxLength} 之间</message>
		</validator>
	-->

	<field name="password">

		<field-validator type="requiredstring" short-circuit="true">
			<message key="密码不能为空" />
		</field-validator>
		<field-validator type="stringlength">
			<param name="maxLength">10</param>
			<param name="minLength">6</param>
			<message>密码必须在${minLength} 与${maxLength} 之间</message>
		</field-validator>
	</field>

	<field name="repassword">
		<field-validator type="requiredstring" short-circuit="true">
			<message key="重复密码不能为空" />
		</field-validator>
		<field-validator type="stringlength">
			<param name="maxLength">10</param>
			<param name="minLength">6</param>
			<message>重复密码必须在${minLength} 与${maxLength} 之间</message>
		</field-validator>
		<field-validator type="fieldexpression">
			<param name="expression">repassword.equals(password)</param>
			<message>重复密码与密码不一致</message>
		</field-validator>
	</field>

	<field name="age">

		<field-validator type="int" short-circuit="true">
			<param name="max">150</param>
			<param name="min">1</param>
			<message>年龄不需是在${min}与 ${max}之间</message>
		</field-validator>
	</field>

	<field name="birth">
		<field-validator type="date" short-circuit="true">
			<param name="max">2010-12-31</param>
			<param name="min">1989-12-31</param>
			<message>年龄不需是在${min}与 ${max}之间</message>
		</field-validator>
		<field-validator type="required">
			<message key="生日不能为空" />
		</field-validator>
	</field>

	<field name="graduation">
		<field-validator type="date" short-circuit="true">
			<param name="max">2010-12-31</param>
			<param name="min">1989-12-31</param>
			<message>年龄不需是在${min}与 ${max}之间</message>
		</field-validator>
		<field-validator type="required">
			<message key="毕业不能为空" />
		</field-validator>
		<field-validator type="fieldexpression">
			<param name="expression"><![CDATA[(birth < graduation)]]></param>
			<message>毕业日期必须大于出生日期</message>
		</field-validator>
	</field>

	<field name="email">
		<field-validator type="stringlength" short-circuit="true">
			<message key="邮箱地址不能为空" />
		</field-validator>
		<field-validator type="email">
			<message>邮箱地址格式不正确</message>
		</field-validator>
	</field>

	<field name="url">
		<field-validator type="stringlength" short-circuit="true">
			<message key="网址不能为空" />
		</field-validator>
		<field-validator type="url">
			<message>网址输入不正确</message>
		</field-validator>
	</field>

	<field name="phone">
		<field-validator type="stringlength" short-circuit="true">
			<message key="不能为空" />
		</field-validator>
		<field-validator type="regex">
			<param name="expression"><![CDATA[^1[3458]\d{9}$]]></param>
			<message>电话号码格式不正确</message>
		</field-validator>

	</field>

</validators>

 

 

 

分享到:
评论

相关推荐

    struts2校验器与校验框架精彩学习笔记

    本学习笔记主要探讨了Struts2中的校验器(Validator)和校验框架,帮助开发者理解如何有效地实现数据验证,确保应用程序的健壮性。 首先,我们来看Struts2的校验框架。这个框架提供了强大的功能,可以对用户输入...

    struts2学习笔记.doc

    ### Struts2学习笔记知识点概览 #### 一、环境搭建 **1.1 Struts2简介** - **Struts2概述**:Struts2是一个开源的MVC框架,它结合了Struts 1.x、WebWork和其他一些框架的优点。Struts2的主要目标是简化Web应用程序...

    Struts2超详细学习笔记分享(献给自学新人)

    本篇超详细学习笔记将带你逐步深入理解Struts2的核心概念和运作机制。 首先,让我们了解Struts2的基本特性。Struts2是一个基于Servlet的框架,它通过将JSP作为视图(View),Servlet作为控制器(Controller),并将...

    传智播客struts2全程学习笔记

    ### 传智播客Struts2全程学习笔记 #### Struts2的优点 1. **无侵入式设计**:与Struts1相比,Struts2的设计更为先进,它不依赖于Servlet API或Struts API,这使得Struts2更加灵活且易于集成到其他环境中。在代码...

    struts2学习笔记

    Struts2是一个强大的MVC(Model-View-Controller)框架,它在Java Web开发中广泛使用,提供了丰富的功能和灵活性。下面将详细讲解Struts2的一些核心知识点。 **一.Struts2核心文件:struts.xml配置** Struts2的...

    Struts2_学习笔记.zip

    这个"Struts2_学习笔记"包含了关于Struts2框架的深入学习资料,是理解并掌握Struts2核心概念和技术的关键。 Struts2的核心设计理念是模型-视图-控制器(MVC)架构模式,它简化了Java Web开发,将业务逻辑、数据展示...

    struts2的学习笔记+测试源代码

    这个学习笔记和测试源代码是针对Struts2中的输入校验机制进行的深入探讨。 在Struts2中,输入校验是确保用户提交的数据符合预期格式和业务规则的关键步骤。它可以防止非法数据进入系统,从而避免潜在的安全风险和...

    struts2学习笔记八(第8讲.Struts2的校验框架)

    Struts2是一个强大的Java web应用程序框架,用于构建和维护可扩展、高效且易于维护的Web应用。本讲主要探讨Struts2的校验框架,它提供了对用户输入数据进行验证的功能,确保数据的有效性和安全性。 在传统的MVC模式...

    struts2学习笔记九(第9讲.Struts2的校验框架 续)

    在第九讲中,我们将深入探讨Struts2的校验框架,这是一个非常重要的功能,它有助于确保输入数据的准确性和完整性,防止非法数据导致的系统异常。 在传统的Java web开发中,数据验证通常在服务器端进行,如Servlet或...

    struts2学习笔记一

    Struts2是Java开发中的一个强大的MVC(Model-View-Controller)框架,它极大地简化了基于Java的企业级应用程序的构建过程。作为Apache软件基金会的开源项目,Struts2是在Struts1的基础上,结合WebWork的技术发展起来...

    struts2学习笔记六(第6讲.Struts2的输入校验续一)

    Struts2是一个强大的Java web框架,它为开发者提供了构建MVC(模型-视图-控制器)应用程序的强大工具。在第六讲中,我们将深入探讨Struts2的输入验证机制,这是确保应用程序数据安全性和正确性的重要环节。Struts2的...

    Struts2学习笔记

    此外,Struts2还支持Action级别和全局级别的异常处理,以及强大的数据校验机制。通过`@FieldValidator`和`@Validations`注解,可以在Action类中声明字段级和类级的验证规则。如果验证失败,Struts2会自动处理错误并...

    struts2学习笔记三(第3讲.Struts2的类型转换)

    在本篇“Struts2学习笔记三”中,我们将聚焦于Struts2的类型转换这一核心特性。类型转换在处理用户提交的数据时非常关键,它允许Struts2自动将请求参数转换为Java对象的属性。 在Struts2中,类型转换主要由`...

    struts2综合笔记

    - **发展历程**: Struts2 是在 WebWork 框架的基础上发展起来的,因此学习 Struts2 实际上也是学习 WebWork。 #### 二、Struts2 的核心组件分析 **控制器**: - **Servlet VS Filter**: - **Servlet**: - 在内存...

    struts学习笔记

    Struts2 学习笔记-part2: 实现用户登录功能 在上一部分中,我们了解了构建一个基于Struts2的Java Web项目所需的基本库和配置文件。现在,我们将逐步实现一个简单的用户登录功能。 一、创建Action类 在Struts2框架...

Global site tag (gtag.js) - Google Analytics