基于配置文件的表单验证方式,可以减少java代码的编写。
如果要验证的Action是LoginAction,那么配置文件名需命名为LoginAction-validation.xml并把它放在与LoginAction同文件夹下即可。
范例:login.jsp文件:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
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>登录</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="firstC.action" method="post">
<p>用户名:<input type="text" name="name" value="${name }"/>${fieldErrors.name}</p>
<p>年龄:<input type="number" name="age" value="${age }"/>${fieldErrors.age}</p>
<p>生日:<input type="date" name="bir" value="${bir }"/>${fieldErrors.bir}</p>
<p>密码:<input type="password" name="password" value="${password }"/>${fieldErrors.password}</p>
<p>确认密码:<input type="password" name="repassword" value="${repassword }"/>${fieldErrors.repassword}</p>
<p>手机号:<input type="text" name="tel" value="${tel }"/>${fieldErrors.tel}</p>
<p><input type="submit" value="提交"/></p>
</form>
</body>
</html>
范例:CheckAction.java代码
package org.action;
import java.util.Date;
import org.bean.User;
import com.opensymphony.xwork2.ActionSupport;
public class CheckAction extends ActionSupport
{
private String name;
private int age;
private Date bir;
private String password;
private String repassword;
private String tel;
public CheckAction()
{
// TODO 自动生成的构造函数存根
}
@Override
public String execute() throws Exception
{
// TODO 自动生成的方法存根
return SUCCESS;
}
public String first()
{
System.out.println("first");
return SUCCESS;
}
public String second()
{
return SUCCESS;
}
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public int getAge()
{
return age;
}
public void setAge(int age)
{
this.age = age;
}
public Date getBir()
{
return bir;
}
public void setBir(Date bir)
{
this.bir = bir;
}
public String getPassword()
{
return password;
}
public void setPassword(String password)
{
this.password = password;
}
public String getRepassword()
{
return repassword;
}
public void setRepassword(String repassword)
{
this.repassword = repassword;
}
public String getTel()
{
return tel;
}
public void setTel(String tel)
{
this.tel = tel;
}
}
范例:CheckAction-validation.xml代码
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC
"-//OpenSymphony Group//XWork Validator 1.0.3//EN"
"http://www.opensymphony.com/xwork/xwork-validator-1.0.3.dtd">
<validators>
<field name="name">
<field-validator type="requiredstring">
<message>用户名不能为空!</message>
</field-validator>
<field-validator type="stringlength">
<param name="minLength">2</param>
<param name="maxLength">8</param>
<message>用户名长度应为2-8个字符!</message>
</field-validator>
</field>
<field name="age">
<field-validator type="required">
<message>年龄不能为空!</message>
</field-validator>
<field-validator type="int">
<param name="min">1</param>
<param name="max">150</param>
<message>年龄必须在1-150之间!</message>
</field-validator>
</field>
<field name="bir">
<field-validator type="required">
<message>生日不能为空!</message>
</field-validator>
<field-validator type="date">
<param name="min">1900-01-01</param>
<param name="max">2029-07-22</param>
<message>超出日期范围!</message>
</field-validator>
</field>
<field name="password">
<field-validator type="requiredstring">
<message>密码不能为空!</message>
</field-validator>
<field-validator type="stringlength">
<param name="minLength">8</param>
<param name="maxLength">16</param>
<message>密码长度应为8-16个字符!</message>
</field-validator>
</field>
<field name="repassword">
<field-validator type="requiredstring">
<message>确认密码不能为空!</message>
</field-validator>
<field-validator type="fieldexpression">
<param name="expression">
<![CDATA[repassword.equals(password)]]>
</param>
<message>两次密码不一致!</message>
</field-validator>
</field>
<field name="tel">
<field-validator type="requiredstring">
<message>电话号码不能为空!</message>
</field-validator>
<field-validator type="regex">
<param name="expression">
<![CDATA[1[34578]\d{9}]]>
</param>
<message>电话号码格式不正确!</message>
</field-validator>
</field>
</validators>
范例:welcome.jsp代码
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
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>欢迎</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>
<p>欢迎</p>
${name}<br>
${password}<br>
</body>
</html>
范例:struts.xml代码:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
<!-- 自定义根命名空间 -->
<package name="space" namespace="/" extends="struts-default">
<action name="*C" class="org.action.CheckAction" method="{1}">
<result name="success">/jsp_check/welcome.jsp</result>
<result name="input">/jsp_check/login.jsp</result>
</action>
</package>
</struts>
通过以上代码可以发现,xml框架拦截此时会拦截Action的所有方法,此种拦截方式有时并不适合。
解决办法:使用xml框架拦截的方法拦截。
只需要把原来的xml拦截文件改写成action类名+请求action名+validation.xml即可。
例如此例子中form表单请求的action属性为:firstC.action,处理的action类为CheckAction.java,则xml验证文件为:CheckAction-firstC-validation.xml。此时xml验证文件只会验证表单action属性为firstC的请求。