Struts2中的校验器

      输入校验在Web应用中具有重要的作用,因为我们不能保证用户提交给程序的数据都是符合要求的,而如果不符合要求,就会使程序运行出错,所以输入校验是每个结构严谨的应用程序都必须的。

       对于输入校验Struts2提供了两种实现方法:1.手工编写代码实现   2.通过配置XML实现

  1. 

  首先来说说第一种手工编写代码的实现,很简单,只需要在Action中重写方法validate(),代码如下

	   /**
	 * 专门用于验证的方法validate,一有错误的时候,则会找到<result>节点的input所映射的路径
	 */
	@Override
	public void validate() {
		if (user.getName() == null || "".equals(user.getName())) {
			// 该方法用于保存错误的信息
			this.addFieldError("user.name", "用户名不能为空"); 
		}
		if (user.getAge() == null) {
			// 该方法用于保存错误的信息
			super.addFieldError("user.age", "年龄不能为空"); 
		}
		if (user.getSalary() == null) {
			// 该方法用于保存错误的信息
			super.addFieldError("user.salary", "工资不能为空"); 
		}
		if (user.getBirthday() == null) {
			// 该方法用于保存错误的信息
			super.addFieldError("user.birthday", "出生日期不能为空"); 
		}
	}
(Action和配置就不写出了)
jsp页面

<%@ page language="java" pageEncoding="GBK"%>
<%@ taglib prefix="s" uri="/struts-tags"%>

<html:html lang="true">
  <head>
    <html:base /> 
    <title>struts2_simple_demo.jsp</title>
  </head>
  
  <body>
    <s:form action="user.action" method="post">
        姓名:<input type="text" name="user.name" value="<s:property value="user.name"/>"/>
             <s:property value="fieldErrors['user.name'][0]"/><br>
             
        年龄:<input type="text" name="user.age" value="<s:property value="user.age"/>"/>
             <s:property value="fieldErrors['user.age'][0]"/><br>
             
        工资:<input type="text" name="user.salary" value="<s:property value="user.salary"/>"/>
             <s:property value="fieldErrors['user.salary'][0]"/><br>
             
        生日:<input type="text" name="user.birthday" value="<s:property value="user.birthday"/>"/>
             <s:property value="fieldErrors['user.birthday'][0]"/><br>
             
         <input type="submit" value="提交"/>
         <input type="reset" value="重置"/>
    </s:form>
  </body>
</html:html>
以上就是直接使用代码的方法完成校验,但是如果 我们在一个企业级应用中,需要用到大量的输入校验。如果全部用编码方式,工程会变得臃肿不堪,难于维护和管理,所以,鉴于此,当有大量的属性需要进行校验的时候,此时使用xml配置来实现不失为一个好方法


 2.

  首先看下Action:(ValidatAction.java)

package com.aheadetp.action;

import com.aheadetp.model.User;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;

/**
 * 
 * @author xxxx
 *
 */
// ModelDriven:直接把实体类当成页面数据的收集对象
public class ValidatAction extends ActionSupport implements ModelDriven<User>{
	private User user = new User();
	@Override
	/**
	 * 
	 */
	public String execute() throws Exception {
		System.out.println("i am execute!");
		return super.execute();
	}
	
	@Override
	/**
	 * 
	 */
	public User getModel() {
		return user;
	}
	
	/**
	 * @return the user
	 */
	public User getUser() {
		return user;
	}

	/**
	 * @param user the user to set
	 */
	public void setUser(User user) {
		this.user = user;
	}
}
这里为什么要使用ModelDriver,往后在说,或者看下上一篇博文

在Action对应下的包下新建一个xml文件,该文件的命名规则是:Action名-validation.xml(这里的命名是ValidatAction-validation.xml)

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.2//EN" 
"http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
<validators>
	<field name="user">
		<field-validator type="visitor">
			<!-- 对应于User-userC-validation.xml中的userC -->
			<param name="context">userC</param>
			<!-- 是否在错误信息前添加message的信息作为前缀 -->
			<param name="appendPrefix">true</param>
			<message>用户的:</message>
		</field-validator>
	</field>
</validators>

POJO类:(User.java)

package com.aheadetp.model;

import java.util.Date;

public class User {
	private int age;
	
	private String name;
	
	private String pass;
	
	private String re_pass;
	
	private String email;
	
	private String url;
	
	private Date birth;
	
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getPass() {
		return pass;
	}
	public void setPass(String pass) {
		this.pass = pass;
	}
	public String getRe_pass() {
		return re_pass;
	}
	public void setRe_pass(String re_pass) {
		this.re_pass = re_pass;
	}
	public String getEmail() {
		return email;
	}
	public void setEmail(String email) {
		this.email = email;
	}
	public String getUrl() {
		return url;
	}
	public void setUrl(String url) {
		this.url = url;
	}
	public Date getBirth() {
		return birth;
	}
	public void setBirth(Date birth) {
		this.birth = birth;
	}
}

在该pojo类目录下家里一个xml文件,该文件专门用户校验,命名规则:POJO类名-xxx-validation.xml(User-userC-validation.xml)

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.2//EN" 
"http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
<validators>
	<field name="name">
		<!-- 必填字符串校验器 -->
		<field-validator type="requiredstring">
			<message><![CDATA[(Name should not be blank!)]]></message>
		</field-validator>
		<!-- 字符串长度校验器 -->
		<field-validator type="stringlength">
			<param name="maxLength">6</param>
			<param name="minLength">3</param>
			<param name="trim">true</param>
			<message><![CDATA[(Length of the name should between 3 and 6!)]]></message>
		</field-validator>
	</field>
	
	<field name="re_pass">
		<!-- 必填字符串校验器 -->
		<field-validator type="requiredstring">
			<message><![CDATA[(Re_pass should not be blank!)]]></message>
		</field-validator>
		<!-- 字段表达式校验器 -->
		<field-validator type="fieldexpression">
			<param name="expression">re_pass.equals(pass)</param>
			<message><![CDATA[(Pass should be same as re_pass!)]]></message>
		</field-validator>
	</field>
	
	<field name="age">
		<!-- 必填校验器 -->
		<field-validator type="required">
			<message><![CDATA[(Age should not be blank!)]]></message>
		</field-validator>
		<!-- 整数校验器 -->
		<field-validator type="int">
			<param name="max">150</param>
			<param name="min">1</param>
			<message><![CDATA[(Age should be between 1 and 150!)]]></message>
		</field-validator>
	</field>
	
	<field name="email">
		<!-- 必填整数校验器 -->
		<field-validator type="requiredstring">
			<message><![CDATA[(Email should not be blank!)]]></message>
		</field-validator>
		<!-- 电子邮件校验器 -->
		<field-validator type="email">
			<message><![CDATA[(The pattern of the Email is not good!)]]></message>
		</field-validator>
	</field>
	
	<field name="url">
		<field-validator type="requiredstring">
			<message><![CDATA[(URL should not be blank!)]]></message>
		</field-validator>
		<!-- 网址校验器 -->
		<field-validator type="url">
			<message><![CDATA[(The pattern of the URL is not good!)]]></message>
		</field-validator>
	</field>
	
	<field name="birth">
		<field-validator type="required">
			<message><![CDATA[(birth should not be blank!)]]></message>
		</field-validator>
		<!-- 日期校验器 -->
		<field-validator type="date">
			<param name="max">2013-5-27</param>
			<param name="min">1999-10-1</param>
			<message><![CDATA[(birth should before 2013-5-27 And after 1999-10-1!)]]></message>
		</field-validator>
	</field>
	
</validators>

此种类型也成为字段校验器,好了在来看看前台页面吧

index.jsp:

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<%@ taglib prefix="sx" uri="/struts-dojo-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%>">
		<title>Convert Error</title>
		<meta http-equiv="pragma" content="no-cache">
		<meta http-equiv="cache-control" content="no-cache">
		<meta http-equiv="expires" content="0">
		<sx:head/>
	</head>

	<body>
		<s:fielderror/>
		<s:form action="valid">
			<s:textfield name="name" label="姓名" tabindex="1"/>
			<s:password name="pass" label="密码" tabindex="2"/>
			<s:password name="re_pass" label="确认密码" tabindex="3"/>
			<s:textfield name="age" label="年龄" tabindex="4"/>
			<sx:datetimepicker type="date" name="birth" label="生日" tabindex="5"/>
			<s:textfield name="email" label="Email" tabindex="6"/>
			<s:textfield name="url" label="URL" tabindex="7"/>
			<s:submit></s:submit>
		</s:form>
	</body>
</html>

以上就基本上是一个校验器的知识,也有许多没涉及进去,后续会继续追加!^_^


   


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值