数据校验指对数据合法性进行检查,根据验证数据的位置可以分为客户端验证和服务器端验证,服务器端数据验证主要特点:
·数据提交后在服务器端验证
·防止绕过客户端验证提交的非法数据
·可以在服务器端处理数据前保证数据的合法性
Struts2中有两种实现服务器端验证的方式。采用手工编写代码实现、基于XML配置方式实现。本文主要介绍基于XML配置方式实现。
在实际开发中,很多验证是相同的,对于这些许重复实现的验证,完全可以统一实现,struts2的验证框架就实现了这一功能。使用验证框架时,所有的验证规则是写在配置文件中,便于开发与维护,所以这里详细介绍一下验证框架。
1、jsp代码编写
<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!-- 加载struts2标签库 -->
<%@ taglib uri="/struts-tags" prefix="s"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<base href="<%=basePath%>">
<s:head/>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>注册</title>
</head>
<body>
<form action="register" method="post">
<table>
<tr>
<td>邮箱:</td>
<td><input type="text" name="email"/></td>
<!-- 使用<s:fielderror/>标签输入相应的字段错误信息 -->
<td><s:fielderror >
<s:param>email</s:param>
</s:fielderror></td>
</tr>
<tr>
<td>密码:</td>
<td><input type="password" name="password"/></td>
<td><s:fielderror>
<s:param>password</s:param>
</s:fielderror>
</tr>
<tr>
<td>重复密码:</td><td>
<input type="password" name="repassword"/></td>
<td><s:fielderror>
<s:param>repassword</s:param>
</s:fielderror></td>
</tr>
<tr>
<td>电话:</td>
<td><input type="text" name="phone"/></td>
<td><s:fielderror>
<s:param>phone</s:param>
</s:fielderror></td>
</tr>
<tr>
<td><input type="submit" value="提交"/></td>
<td></td>
<td></td>
</tr>
</table>
</form>
</body>
</html>
2、编写Action类和struts.xml配置文件
package struts.org;
import com.opensymphony.xwork2.ActionSupport;
public class RegisterAction extends ActionSupport{
//需要校验的字段必需在类中提供相应的字段和相应的get,set方法
private String email;
private String password;
private String repassword;
private String phone;
public String execute() throws Exception {
System.err.println(111);
return SUCCESS;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
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 getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
}
<!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.i18n.encoding" value="UTF-8" />
<constant name="struts.devMode" value="true"></constant>
<!-- <constant name="struts.ui.theme" value="simple"></constant> -->
<package name="/" extends="struts-default">
<action name="register" class="struts.org.RegisterAction">
<result name="success">success.jsp</result>
<!-- 校验失败后,struts2会把页面转到名为"input"的页面中 -->
<result name="input">register.jsp</result>
</action>
</package>
</struts>
3、编写 validation配置文件
配置文件的命名必须为Xxx-yyy-validation.xml,Xxx为对应的action类名,yyy为配置文件中action元素的name属性值,这个文件只要与对应action类放在同一目录下就会被自动识别,这里命名为RegisterAction-register-validation.xml。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC
"-//Apache Struts//XWork Validator 1.0.2//EN"
"http://struts.apache.org/dtds/xwork-validator-1.0.2.dtd">
<validators>
<!-- name值为需要被校验的字段,这里对email字段进行校验 -->
<field name="email">
<!-- type值为校验器名,requiredstring:非空字符串校验器 -->
<field-validator type="requiredstring" short-circuit="true">
<message>${getText("email.not.empty")}</message>
</field-validator>
<!-- 一个字段可以配置多个校验器,email:校验邮箱格式 -->
<field-validator type="email">
<message>${getText("email.form.error")}</message>
</field-validator>
</field>
<field name="password">
<field-validator type="requiredstring" short-circuit="true">
<message>${getText("pass.not.empty")}</message>
</field-validator>
<!-- stringlength:字符串长度校验 -->
<field-validator type="stringlength">
<!-- 为校验器指定参数实现不同的校验规则,minlength:最少长度 -->
<param name="minLength">6</param>
<message>${getText("pass.min.lenght")}</message>
</field-validator>
</field>
<!-- 校验两次密码是否一致,使用 fieldexpression 校验器。expression参数指定判断用的表达式-->
<field name="repassword">
<field-validator type="fieldexpression">
<!-- 表达式要写在 <![CDATA[]]> 内 -->
<param name="expression"><![CDATA[repassword==password]]></param>
<message>${getText("repass.not.same")}</message>
</field-validator>
</field>
<!-- 校验电话格式,使用regex正则表达示校验,regexExpression参数指定正则表达式 -->
<field name="phone">
<field-validator type="regex">
<!-- 注意!2.3.15后的版本使用 regexExpression 参数 2.3.15之前的版本为expression<span style="line-height: 17.28px; font-family: Verdana, Arial, Helvetica, sans-serif;"> </span><span style="line-height: 17.28px; font-family: Verdana, Arial, Helvetica, sans-serif;">--></span>
<param name="regexExpression"><![CDATA[\d{11}]]></param>
<message>${getText("tel.form.error")}</message>
</field-validator>
</field>
</validators>
实现效果:
另外可以使用Dojo插件实现类似于Ajax提交校验的效果
1、首先引入struts2-dojo-plugin-2.3.15.3.jar包
2、修改jsp页面(此处我使用的是另一个新的jsp)
<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!-- 加载struts2标签库 -->
<%@ taglib uri="/struts-tags" prefix="s"%>
<%@ 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" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<base href="<%=basePath%>">
<sx:head/>
<s:head/>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>注册</title>
</head>
<body>
<s:form action="register" method="post" validate="false">
<table>
<tr>
<td>邮箱</td>
<td><s:textfield name="email"></s:textfield></td>
<td><s:fielderror fieldName="email" cssStyle="color:blue"></s:fielderror>
</td>
</tr>
<tr>
<td>手机</td>
<td>
<s:textfield name="phone"></s:textfield>
</td>
<td>
<s:fielderror fieldName="phone"></s:fielderror>
</td>
</tr>
<tr>
<td colspan="3">
<sx:submit validate="true"/>
</td>
</tr>
</table>
</s:form>
</body>
</html>
重要的是添加<sx:head/>和<sx:submit validate="true"/>部分
实现效果:
struts客户端校验很简单,在要提交的表单<s:form>上加上validate="true"属性即可实现。
<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!-- 加载struts2标签库 -->
<%@ taglib uri="/struts-tags" prefix="s"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<base href="<%=basePath%>">
<s:head/>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>注册</title>
</head>
<body>
<s:form action="register" method="post" validate="true">
<s:textfield label="邮箱" name="email"></s:textfield>
<s:textfield label="电话" name="phone"></s:textfield>
<s:submit ></s:submit>
</s:form>
</body>
</html>
不过需要注意两点:
1、不能配置<constant name="struts.ui.theme" value="simple"></constant>;
2、form标签必须使用struts的标签,即<s:form></s:form>和<s:textfield></s:textfield>等;
3、不能直接访问jsp页面,否则会出现如下错误,需要经过action进入jsp。
如果不想使用通过action进入jsp的方法,那么还有另一个解决办法:
<s:form action="register.action" method="post" validate="true">
即在action属性值后面加.action
实现效果:
资源下载
struts2.3.15.3.all包下载包含了struts2-dojo-plugin-2.3.15.3.jar包
参考资料:
struts2 form标签加上validate="true"就出错的解决办法