输入校验在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>
以上就基本上是一个校验器的知识,也有许多没涉及进去,后续会继续追加!^_^