`
wangyalei
  • 浏览: 51958 次
  • 性别: 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>

 

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics