文章目录
简介
Struts2 的校验器是在后端对前端提交的数据进行校验,在调用 Action 的指定方法前会先调用校验器的有关方法,校验通过才会调用 Action 指定的方法,校验不通过则会调用 Action 的方法 input(),该方法返回字符串“input”。
校验不通过会将有关的提示信息存储到 Action 对象中的成员变量 validationAware 中(这个成员变量继承自 ActionSupport),然后再调用 Action 的方法 input()(这个方法继承自 ActionSupport),该方法返回字符串“input”。
控制器再将请求转发给名为“input”的 JSP 页面。
使用校验器步骤
1.先写前端页面 JSP
写页面时要确定哪些字段的数据需要校验,在需要校验的字段旁边添加标签 <s:fielderror/>
,如下所示:
<tr>
td>邮箱:</td>
<td><input type="text" name="email"/></td>
<%--使用<s:fielderror/>标签输出对应字段的错误信息,属性fieldName指定出现错误信息的字段名称--%>
<td><s:fielderror fieldName="email"/></td>
</tr>
2.写 Action
Action 的属性名称要和前端页面的字段名称保持一致。自定义的 Action 必须继承自 ActionSupport。
3.struts.xml 对 Action 配置
<action name="register" class="priv.lwx.struts2.validator.web.RegisterAction">
<result name="success">success.jsp</result>
<!--校验失败后,struts2会把页面转到名为"input"的页面中-->
<result name="input">register.jsp</result>
</action>
4.创建校验器配置文件
首先确定调用哪个 Action 需要校验请求参数的数据。
例如,调用名称为 register 的 Action 需要校验页面表单项的数据,那么就需要在 Action 所在的包目录下创建一个校验器配置文件,并且该配置文件的取名规则为:Action 类的名称-Action 的名称-validation.xml
Action 的名称:struts.xml 文件中标签 <action/>
的属性 name 的值
例如,下面的 action:
<action name="register" class="priv.lwx.struts2.validator.web.RegisterAction">
<result name="success">success.jsp</result>
<!--校验失败后,struts2会把页面转到名为"input"的页面中-->
<result name="input">register.jsp</result>
</action>
访问 register,需要校验表单数据,那么就可以创建名为 RegisterAction-register-validation.xml 的配置文件。并将该配置文件存放在 RegisterAction 所在的包目录下。Maven 项目在开发时,只能将配置文件存放在目录 resources 下,因此需要将该配置文件存放在目录 resources 中相对应的包目录下,所以你要先在目录 resources 目录下创建和 RegisterAction 的包目录结构相同的目录,再将配置文件存放在对应的包目录下,如下图所示:
如果配置文件命名为 RegisterAction-validation.xml,则只要访问类 RegisterAction 就会去调用校验器。
校验器调用顺序:
按下面的顺序加载解析校验器配置文件,调用相应的校验器。
先加载 action类名-validation.xml,然后加载 action类名-name属性值-validation.xml 文件。
5.校验器配置
先指定被校验的字段,再指定校验器。谁被校验,由谁来校验!这是【字段 → 校验器】配置风格
例如:
<!-- 属性name指定被校验的字段名称,这里对字段email进行校验 -->
<field name="email">
<!-- 属性type指定校验器名,requiredstring:非空字符串校验器 -->
<field-validator type="requiredstring">
<!--校验不通过,标签<message/>中的文本会作为标签<s:fielderror/>所输出的HTML标签的文本,显示在页面中-->
<message>邮箱不能为空</message>
</field-validator>
<!-- 一个字段可以配置多个校验器,email:邮箱格式校验器 -->
<field-validator type="email">
<message>邮箱格式不正确</message>
</field-validator>
</field>
先指定校验器,再指定被校验的字段。由谁来校验,来校验谁!这是【校验器 → 字段】配置风格。
例如:
<validator type="校验器名">
<param name="fieldName">需要被校验的字段</param>
<param name="参数名">参数值</param>
<!--校验不通过在页面显示的提示信息 -->
<message>提示信息</message>
</validator>
演示案例
项目结构图如下:
register.jsp的代码如下:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%--引用struts2标签库--%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<s:head/>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>注册</title>
</head>
<body>
<form action="register1.action" method="post">
<table>
<tr>
<td>邮箱:</td>
<td><input type="text" name="email"/></td>
<%--使用<s:fielderror/>标签输出对应字段的错误信息,属性fieldName指定出现错误信息的字段名称--%>
<td><s:fielderror fieldName="email"/></td>
</tr>
<tr>
<td>密码:</td>
<td><input type="password" name="password"/></td>
<td><s:fielderror fieldName="password"/></td>
</tr>
<tr>
<td>重复密码:</td>
<td>
<input type="password" name="repassword"/></td>
<td><s:fielderror fieldName="repassword"/></td>
</tr>
<tr>
<td>电话:</td>
<td><input type="text" name="phone"/></td>
<td><s:fielderror fieldName="phone"/></td>
</tr>
<tr>
<td><input type="submit" value="提交"/></td>
<td></td>
<td></td>
</tr>
</table>
</form>
</body>
</html>
success.jsp的代码如下:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>注册成功</title>
</head>
<body>
欢迎你 ${email}
</body>
</html>
RegisterAction 的代码如下:
package priv.lwx.struts2.validator.web;
import com.opensymphony.xwork2.ActionSupport;
/**
* description
*
* @author liaowenxiong
* @date 2022/5/31 18:43
*/
public class RegisterAction extends ActionSupport {
// 页面中需要校验的字段必须和Action的属性一一对应
private String email;
private String password;
private String repassword;
private String phone;
public String execute() throws Exception {
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;
}
}
struts.xml 的配置如下:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<constant name="struts.i18n.encoding" value="UTF-8"/>
<package name="default" namespace="/" extends="struts-default">
<!-- http://localhost:8080/sv/register.jsp -->
<action name="register" class="priv.lwx.struts2.validator.web.RegisterAction">
<result name="success">success.jsp</result>
<!--校验失败后,struts2会把页面转到名为"input"的页面中-->
<result name="input">register.jsp</result>
</action>
</package>
</struts>
RegisterAction-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">
<!--校验不通过,标签<message/>中的文本会作为标签<s:fielderror/>所输出的HTML标签的文本,显示在页面中-->
<message>邮箱不能为空</message>
</field-validator>
<!-- 一个字段可以配置多个校验器,email:邮箱格式校验器 -->
<field-validator type="email">
<message>邮箱格式不正确</message>
</field-validator>
</field>
<field name="password">
<field-validator type="requiredstring">
<message>密码不能为空</message>
</field-validator>
<!-- stringlength:字符串长度校验器 -->
<field-validator type="stringlength">
<!-- 通过校验器参数来添加和设置校验规则,minlength:最小长度 -->
<param name="minLength">6</param>
<message>密码长度不能少于6位</message>
</field-validator>
</field>
<!-- 校验两次密码是否一致,使用fieldexpression校验器。expression参数指定判断用的表达式-->
<field name="repassword">
<field-validator type="fieldexpression">
<!-- 表达式要写在<![CDATA[]]>内 -->
<param name="expression"><![CDATA[repassword==password]]></param>
<message>两次密码不一至</message>
</field-validator>
</field>
<!-- 校验电话格式,使用regex正则表达式校验器,regexExpression参数指定正则表达式 -->
<field name="phone">
<field-validator type="regex">
<!-- 注意!2.3.15前的版本使用expression参数 -->
<param name="regexExpression"><![CDATA[\d{11}]]></param>
<message>电话号码格式不正确</message>
</field-validator>
</field>
</validators>
常用校验器
Struts2 提供了大量的内置校验器,你可以在 xwork-core-2.1.6.jar 的 com.opensymphony.xwork2.validator.validators 下的 default.xml 中查看所有的内置校验器。
required
必填校验器,要求field的值不能为null。
requiredstring
必填字符串校验器,要求field的值不能为null,并且长度大于0
参数 | 说明 |
---|---|
trim | 指定在校验字符串长度之前是否去除字符串前后的空格。 |
stringlength
字符串长度校验器,要求field的值的长度必须在指定的范围内,否则校验不通过。
参数 | 说明 |
---|---|
minLength | 指定最小长度。 |
maxLength | 指定量大长度。 |
trim | 指定在校验字符串长度之前是否去除字符串前后的空格。 |
regex
正则表达式校验器,校验field的值是否与指定的正则表达式相匹配。
参数 | 说明 |
---|---|
expression | 指定正则表达式(2.3.15版用regexExpression)。 |
caseSensitive | 指定进行正则表达式匹配时是否区分大小写。 |
int
整数校验器,要求field的值必须是整型数值,且数值必须在指定的范围内。
参数 | 说明 |
---|---|
min | 指定最小值。 |
max | 指定最大值。 |
double
双精度浮点数校验器,要求field的值必须是double数值,并且数值必须在指定范围内。
参数 | 说明 |
---|---|
min | 指定最小值。 |
max | 指定最大值。 |
fieldexpression
OGNL 表达式校验器。要求 field 的值满足一个 ognl 表达式。
参数 | 说明 |
---|---|
expression | 指定ognl表达式(表达式要写在 <![CDATA[]]> 内)。 |
邮件地址校验器。如果field的值非空,则必须符合邮箱地址格式的要求(即必须是合法的邮箱地址)
url
网址校验器。如果field的值非空,则必须符合url格式的要求(即必须是合法的URL地址)
date
日期校验器,要求field的值必须是日期类型的,且日期值必须在指定范围内
参数 | 说明 |
---|---|
min | 指定最小值。 |
max | 指定最大值。 |
conversion
转换校验器,指定在类型转换失败时,提示错误信息。
visitor
用于校验action中的复合属性。它指定一个校验文件用于校验复合属性中的属性。
expression
OGNL表达式校验器。要求 field 满足一个ognl表达式。该校验器不可用在【字段 → 校验器】风格的配置中!
参数 | 说明 |
---|---|
expression | 指定ognl表达式(表达式要写在 <![CDATA[]]> 内)。 |