十一、Sturts2其他细节 -- 数据校验(一)

一、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>

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值