一、Struts数据效验
1.1 表单数据的验证
前台验证:主要是通过JS验证, 表达数据是否合法!
后台验证:通过后台java代码进行验证!
Struts也提供了数据效验的方式!
1.2 Struts数据效验的原理
1.如果想要使用struts的数据校验功能,action必须要实现actionSuppoet类。
该类中维护了错误集合Map(存储错误数据),以及validate方法。
2. Struts数据效验, 通过拦截器完成:
<interceptor name="validation" class="org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor"/>
3.验证流程:
a.用户发送请求,首先会创建action实例,
然后执行拦截器,在执行action对应的method。
b.首先validate拦截器会调用该action的validate方法。
validate拦截器维护了一个map集合,存储错误信息。
用户需要实现validate方法,拦截相应字段。
如果有错误信息,则需要将错误信息放入map中。
然后它会判断map长度是否为空。
如果为空,则证明数据校验成功,执行action的method。
如果不为空,则表示数据校验失败,则返回一个input结果标记。
二、硬编码方式验证
2.1 数据校验,验证action中所有的方法
1.将action继承ActionSupport类
2.在action中重写validate方法。
UserAction.java
public class UserAction extends ActionSupport{
private UserEntity user;
public UserEntity getUser() {
return user;
}
public void setUser(UserEntity user) {
this.user = user;
}
/**
* 数据校验。该方法有validate拦截器进行执行。
* 执行完毕,会判断内部维护的map是否为空,如果不为空,则表示有错误信息。就不会执行目标方法。
*/
@Override
public void validate() {
if(user.getName()==null||"".equals(user.getName())) {
//保存错误信息到map中
super.addFieldError("name", "用户名为空");
}
if(user.getPwd()==null||"".equals(user.getPwd())) {
//保存错误信息到map中
super.addFieldError("pwd", "用户名密码为空");
}
}
public String reigster() {
return "success";
}
}
struts.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<package name="xxxx" extends="struts-default">
<action name="user_*" class="org.jsft.demo.UserAction" method="{1}">
<result name="success">/index.jsp</result>
</action>
</package>
</struts>
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<!-- 引入struts核心过滤器 -->
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
register.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="./user_reigster" method="post">
用户名:<input type="text" name="user.name"/><br/>
密码:<input type="text" name="user.pwd"/><br/>
生日:<input type="text" name="user.birth"/><br/>
<input type="submit"/><br/>
</form>
</body>
</html>
测试
用户访问register.jsp。不输入参数,则报错。
2.1 数据校验,验证action中的指定方法
1.将action继承ActionSupport类
2.在action中写一个校验方法,校验方法名称规则:
validate+要验证的方法名(方法名首字母大写)
eg:验证action的register方法,则验证的方法名:
validateRegister
eg:验证action的login方法,则验证的方法名:
validateLogin
UserAction.java
public class UserAction extends ActionSupport{
private UserEntity user;
public UserEntity getUser() {
return user;
}
public void setUser(UserEntity user) {
this.user = user;
}
/**
* 数据校验。该方法有validate拦截器进行执行。
* 执行完毕,会判断内部维护的map是否为空,如果不为空,则表示有错误信息。就不会执行目标方法。
*/
public void validateRegister() {
if(user.getName()==null||"".equals(user.getName())) {
//保存错误信息到map中
super.addFieldError("name", "用户名为空");
}
if(user.getPwd()==null||"".equals(user.getPwd())) {
//保存错误信息到map中
super.addFieldError("pwd", "用户名密码为空");
}
}
public String register() {
return "success";
}
}
struts.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<package name="xxxx" extends="struts-default">
<action name="user_*" class="org.jsft.demo.UserAction" method="{1}">
<result name="success">/index.jsp</result>
</action>
</package>
</struts>
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<!-- 引入struts核心过滤器 -->
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
register.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="./user_register" method="post">
用户名:<input type="text" name="user.name"/><br/>
密码:<input type="text" name="user.pwd"/><br/>
生日:<input type="text" name="user.birth"/><br/>
<input type="submit"/><br/>
</form>
</body>
</html>
测试
用户访问register.jsp。不输入参数,则报错。
三、XML方式验证
3.1 XML方式验证的引入
硬编码代码方式验证的缺点:
繁琐,设计很多重复的验证逻辑!
例如:非空验证、数值验证、email、日期等。
Struts对于常用的验证,进行了封装,即提供了验证器, 验证指定的常用业务逻辑!
而验证器的使用则需要在XML中引入。
3.2 Struts2 提供的验证器
3.2.1 Struts2 内置的验证器
Struts提供的所有验证器:
路径:xwork-core-2.3.4.1.jar/com.opensymphony.xwork2.validator.validators/default.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC
"-//Apache Struts//XWork Validator Definition 1.0//EN"
"http://struts.apache.org/dtds/xwork-validator-definition-1.0.dtd">
<!-- START SNIPPET: validators-default -->
<validators>
<validator name="required" class="com.opensymphony.xwork2.validator.validators.RequiredFieldValidator"/>
<validator name="requiredstring" class="com.opensymphony.xwork2.validator.validators.RequiredStringValidator"/>
<validator name="int" class="com.opensymphony.xwork2.validator.validators.IntRangeFieldValidator"/>
<validator name="long" class="com.opensymphony.xwork2.validator.validators.LongRangeFieldValidator"/>
<validator name="short" class="com.opensymphony.xwork2.validator.validators.ShortRangeFieldValidator"/>
<validator name="double" class="com.opensymphony.xwork2.validator.validators.DoubleRangeFieldValidator"/>
<validator name="date" class="com.opensymphony.xwork2.validator.validators.DateRangeFieldValidator"/>
<validator name="expression" class="com.opensymphony.xwork2.validator.validators.ExpressionValidator"/>
<validator name="fieldexpression" class="com.opensymphony.xwork2.validator.validators.FieldExpressionValidator"/>
<validator name="email" class="com.opensymphony.xwork2.validator.validators.EmailValidator"/>
<validator name="url" class="com.opensymphony.xwork2.validator.validators.URLValidator"/>
<validator name="visitor" class="com.opensymphony.xwork2.validator.validators.VisitorFieldValidator"/>
<validator name="conversion" class="com.opensymphony.xwork2.validator.validators.ConversionErrorFieldValidator"/>
<validator name="stringlength" class="com.opensymphony.xwork2.validator.validators.StringLengthFieldValidator"/>
<validator name="regex" class="com.opensymphony.xwork2.validator.validators.RegexFieldValidator"/>
<validator name="conditionalvisitor" class="com.opensymphony.xwork2.validator.validators.ConditionalVisitorFieldValidator"/>
</validators>
<!-- END SNIPPET: validators-default -->
3.2.2 Struts2 内置的验证器的使用
+++ required 必填校验器
<field-validator type="required">
<message>性别不能为空!</message>
</field-validator>
+++ requiredstring 必填字符串校验器
<field-validator type="requiredstring">
<param name="trim">true</param>
<message>用户名不能为空!</message>
</field-validator>
+++ stringlength 字符串长度校验器
<field-validator type="stringlength">
<param name="maxLength">10</param>
<param name="minLength">2</param>
<param name="trim">true</param>
<message><![CDATA[产品名称应在2-10个字符之间]]></message>
</field-validator>
+++ int 整数校验器
<field-validator type="int">
<param name="min">1</param>
<param name="max">120</param>
<message>年龄必须在1-120之间</message>
</field-validator>
+++ 字段OGNL表达式校验器
<field name="imagefile">
<field-validator type="fieldexpression">
<param name="expression"><![CDATA[imagefile.length() <= 0]]></param>
<message>文件不能为空</message>
</field-validator>
</field>
+++ email 邮件地址校验器
<field-validator type="email">
<message>电子邮件地址无效</message>
</field-validator>
+++ regex 正则表达式校验器
<field-validator type="regex">
<param name="expression"><![CDATA[^13\d{9}$]]></param>
<message>手机号格式不正确!</message>
</field-validator>
3.3 XML方法验证action中的所有方法(ActionClassName-validation.xml必须与action在同一个目录)
如果写xml,从而定义验证规则:
1)XML文件名称语法: ActionClassName-validation.xml
注意:此xml需要与当期要验证的action在同一个目录:
举例:UserAction-validation.xml
org/jsoft/demo/UserAction.java
public class UserAction extends ActionSupport{
private UserEntity user;
public UserEntity getUser() {
return user;
}
public void setUser(UserEntity user) {
this.user = user;
}
public String register() {
return "success";
}
}
org/jsoft/demo/UserAction-validation.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC
"-//Apache Struts//XWork Validator 1.0.3//EN"
"http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd">
<validators>
<!-- 验证的每一个字段用field表示 -->
<field name="user.name">
<!-- 指定使用的验证器 -->
<field-validator type="requiredstring">
<!-- 验证失败的错误提示信息 -->
<message>用户名不能为空!</message>
</field-validator>
</field>
<!-- 验证pwd -->
<field name="user.pwd">
<!-- 非空 -->
<field-validator type="requiredstring">
<message>密码不能为空!</message>
</field-validator>
<!-- 长度 -->
<field-validator type="stringlength">
<param name="minLength">6</param>
<param name="maxLength">8</param>
<message>密码必须为6-8位!</message>
</field-validator>
</field>
<!-- 验证日期 -->
<field name="user.birth">
<field-validator type="date">
<message>日期格式不对!</message>
</field-validator>
</field>
<!-- 验证Email -->
<field name="user.email">
<field-validator type="email">
<message>邮箱格式错误!</message>
</field-validator>
</field>
</validators>
struts.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<package name="xxxx" extends="struts-default">
<action name="user_*" class="org.jsft.demo.UserAction" method="{1}">
<result name="success">/index.jsp</result>
</action>
</package>
</struts>
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<!-- 引入struts核心过滤器 -->
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
register.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib uri="/struts-tags" prefix="s" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="./user_register" method="post">
用户名:<input type="text" name="user.name"/>
<s:fielderror fieldName="user.name"></s:fielderror>
<br/>
密码:<input type="text" name="user.pwd"/>
<s:fielderror fieldName="user.pwd"></s:fielderror>
<br/>
生日:<input type="text" name="user.birth"/>
<s:fielderror fieldName="user.birth"></s:fielderror>
<br/>
<input type="submit"/><br/>
</form>
</body>
</html>
测试
用户访问register.jsp。不输入参数,则提示错误信息
3.4 XML方法验证action中的指定方法(和上面验证方式一样,只不过需要修改验证文件的名称)
与上面xml验证方式大致相同: 验证xml文件内容不变;
文件命名:
语法:ActionClassName-ActionName(请求路径)-validation.xml
举例:UserAction-user_register-validation.xml
验证UserAction中的register方法
org/jsoft/demo/UserAction.java
public class UserAction extends ActionSupport{
private UserEntity user;
public UserEntity getUser() {
return user;
}
public void setUser(UserEntity user) {
this.user = user;
}
public String register() {
return "success";
}
}
org/jsoft/demo/UserAction-xxx1-validation.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC
"-//Apache Struts//XWork Validator 1.0.3//EN"
"http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd">
<validators>
<!-- 验证的每一个字段用field表示 -->
<field name="user.name">
<!-- 指定使用的验证器 -->
<field-validator type="requiredstring">
<!-- 验证失败的错误提示信息 -->
<message>用户名不能为空!</message>
</field-validator>
</field>
<!-- 验证pwd -->
<field name="user.pwd">
<!-- 非空 -->
<field-validator type="requiredstring">
<message>密码不能为空!</message>
</field-validator>
<!-- 长度 -->
<field-validator type="stringlength">
<param name="minLength">6</param>
<param name="maxLength">8</param>
<message>密码必须为6-8位!</message>
</field-validator>
</field>
<!-- 验证日期 -->
<field name="user.birth">
<field-validator type="date">
<message>日期格式不对!</message>
</field-validator>
</field>
<!-- 验证Email -->
<field name="user.email">
<field-validator type="email">
<message>邮箱格式错误!</message>
</field-validator>
</field>
</validators>
struts.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<package name="xxxx" extends="struts-default">
<action name="xxx1" class="org.jsft.demo.UserAction" method="{1}">
<result name="success">/index.jsp</result>
</action>
</package>
</struts>
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<!-- 引入struts核心过滤器 -->
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
register.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib uri="/struts-tags" prefix="s" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="./user_register" method="post">
用户名:<input type="text" name="user.name"/>
<s:fielderror fieldName="user.name"></s:fielderror>
<br/>
密码:<input type="text" name="user.pwd"/>
<s:fielderror fieldName="user.pwd"></s:fielderror>
<br/>
生日:<input type="text" name="user.birth"/>
<s:fielderror fieldName="user.birth"></s:fielderror>
<br/>
<input type="submit"/><br/>
</form>
</body>
</html>
测试
用户访问register.jsp。不输入参数,则提示错误信息
四、Struts数据验证总结
硬编码方式验证:
1.验证action所有方法:
继承ActionSupport类,重写validate() ,
2.验证指定“方法名”的方法:
继承ActionSupport类,定义Validate+方法名(),
特性:
比较灵活,可以满足所有的需求.
比较繁琐,要写重复的验证判断逻辑!
适合: 表单字段较少的情况用!
Xml方式验证:
1.验证所有方法: ActionClassName-validation.xml
2.验证指定方法: ActionClassName-actionName-validation.xml
特性:
通用,但不够灵活; 可以验证特定简单的业务。
适合: 验证表单字段较多,可以大大简化代码!
(配置文件过多)
五、Sturts数据验证的错误处理
Struts在进行数据效验的时候,验证失败,会返回input视图,
要求我们要在struts.xml中配置input视图对应的错误页面!
5.1 配置input视图:
Struts.xml
<!-- 注册失败跳转到注册页面,显示失败信息 -->
<global-results>
<result name="input">/register.jsp</result>
</global-results>
5.2 Jsp显示错误
5.2.1 显示所有的错误
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib uri="/struts-tags" prefix="s" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<!-- 显示所有的错误信息 -->
<s:fielderror></s:fielderror>
<form action="./user_register" method="post">
用户名:<input type="text" name="user.name"/>
<br/>
密码:<input type="text" name="user.pwd"/>
<br/>
生日:<input type="text" name="user.birth"/>
<br/>
<input type="submit"/><br/>
</form>
</body>
</html>
5.2.2 显示指定的错误
1.修改struts标签默认的样式: 不让换行
<style type="text/css">
ul{
display: inline;
}
ul li{
display: inline;
color: red;
}
</style>
2.显示指定的错误:
<s:fielderror fieldName="user.userName"></s:fielderror>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<style type="text/css">
ul{
display: inline;
}
ul li{
display: inline;
color: red;
}
</style>
</head>
<body>
<!-- 显示指定的错误信息 -->
<form action="./user_register" method="post">
用户名:<input type="text" name="user.name"/>
<s:fielderror fieldName="user.name"></s:fielderror>
<br/>
密码:<input type="text" name="user.pwd"/>
<s:fielderror fieldName="user.pwd"></s:fielderror>
<br/>
生日:<input type="text" name="user.birth"/>
<s:fielderror fieldName="user.birth"></s:fielderror>
<br/>
<input type="submit"/><br/>
</form>
</body>
</html>