`
hhr_michael
  • 浏览: 74325 次
  • 性别: Icon_minigender_1
  • 来自: 惠州
社区版块
存档分类
最新评论

struts2+hibernate3+spring2读书笔记6(拦截器)

阅读更多
                            
第7章 拦截器
    本章导读:
              拦截器是Struts2的一个重要的组成部分,甚至被人称为Struts2框架的基石,它与Servlet中的过滤器类似,可以Action的方法之前或之后执行一些预先设置的方法。拦截器一般用于进行类型转换操作,进行权限控制、防止表单的双重提交和处理文件上传等功能,它将各Action执行前后的重复代码提取出来,因此在很大程度上减少了重复代码,增加代码的复用。


一. 理解拦截器的实例:

1. 建立工程

2. 编写业务接口类:BusiInterface.java

     
 package amigo.struts.interceptor.conception;

public interface BusiInterface {
		public void doSomeThing();

}


3. 编写业务实现类:BusiImpl.java  (该类模拟实现BusiInterface接口)

      
 package amigo.struts.interceptor.conception;

public class busiImp1 implements BusiInterface {
         public void doSomeThing(){
        	 System.out.print("class=BusiImpl,method=doSomeThing");
        	 
         }
}
4. 编写拦截器类:Interceptor.java

          
 package amigo.struts.interceptor.conception;

/**
 * 拦截器
 * */
public class Interceptor {
	/**
	 * 在被拦截方法之前执行
	 * */
	public void before(){
		System.out.println("拦截器的方法,在doSomeThing之前执行");
		
	}
	
	public void after(){
		System.out.println("拦截器的方法,在doSomeThing之后执行");
		
	}
}

5.编写动态代理类:DynamicProxyClass.java

  
package amigo.struts.interceptor.conception;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;



/**
 * 动态代理类
 * */
public class DynamicProxyClass implements InvocationHandler {
			/** 被代理对象*/
				private Object busi;
				
			/** 拦截器*/	
				private Interceptor interceptor=new Interceptor();
				
			/**
			 * 动态生成一个代理类对象,绑定被代理类和代理处理器
			 * @param business
			 * @return 代理类对象
			 * */
				
			public Object bind(Object busi){
				this.busi=busi;
				return Proxy.newProxyInstance(
			busi.getClass().getClassLoader(),//被代理类的ClassLoader
			busi.getClass().getInterfaces(),//要被代理的接口,本方法返回对象会自动声称实现了这些接口
								//代理处理器以对象
			                   this);
					
			}	
			
			/**
			 * 代理要调用的方法,并在方法调用前后调用拦截器的方法.
			 * @param proxy 代理对象
			 * @param method 被代理的接口方法
			 * @param args 被代理接口立法的参数
			 * @throws Throwable
			 * */
			
			public Object invoke(Object proxy,Method method,Object[] args)
			 			throws Throwable{
				 	Object result=null;
				 	interceptor.before();
				 	result = method.invoke(busi,args);
				 	interceptor.after();
				    return null;
			}
			
}

6.编写测试类:Test.java

  
 package amigo.struts.interceptor.conception;
/**
 * 测试类
 * */
public class Test {
		public static void main(String args[]){
			//创建动态代理处理类
				DynamicProxyClass proxyClass=new DynamicProxyClass();
				BusiInterface busi=new busiImp1();
				//创建代理对象
				BusiInterface busiProxy=(BusiInterface)proxyClass.bind(busi);
				busiProxy.doSomeThing();
			
		}
}


从运行结果中可以看出,拦截器起了作用,通过动态代理处理器DynamicProxy类,在doSomeThing()方法之前调用了拦截器类的before()方法,在其后执行了拦截器类的after()方法。


二. 内建拦截器


1. 常见内建拦截器简介
(1) alias:这个拦截器实现在不同请求中相似参数别名的转换。
(2) exception:这个拦截器负责处理异常,它将异常转化为结果。
(3) fileUpload:这个拦截器主要用于文件上传,它负责解析表单中文件域的内容。
(4) i18n:这是支持国际化的拦截器,它负责把所选的语言、区域放入用户Session中。
(5) params:这是最基本的一个拦截器,它负责解析HTTP请求中的参数,并将参数值设置成Action对应的属性值。
(6) scope:这是拦截转换拦截器,它可以将Action状态信息保存到HttpSessin范围,或者保存到ServletContext范围内。
(7) timer:这个拦截器负责输出Action的执行时间,这个拦截器在分析该Action的性能瓶颈时比较有用。
(8) token:这个拦截器主要用于阻止重复提交,它检查传到Action中的token,从而防止多次提交。
(9) validation:这个拦截器通过执行在xxxAction-validation.xml中定义的校验器,从而完成数据校验。
(10) workflow:这个拦截器负责调用Action类中的validate()方法,如果校验失败,则返回input的逻辑视图。

2. 实例
     
(1) 建立源码包和jsp文件目录

(2) 建立Action类:TokenAction.java

               
 package amigo.struts.interceptor.buildin;

import com.opensymphony.xwork2.ActionSupport;

/**
 * 内建拦截器Token的使用实例
 * */
public class TokenAction extends ActionSupport {
     private static final long serialVersionUID=1L;
     private String username;
     
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public static long getSerialVersionUID() {
		return serialVersionUID;
	}
	
	public String execute(){
		System.out.print("token.jsp传过来的username参数:"+username);
		return SUCCESS;
		
	}
}

(3)建立jsp页面:token.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<!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>内建拦截器token的使用</title>
</head>
<body>
	<s:actionerror/>
	<s:form action="token">
	<s:textfield name="username" label="用户名"></s:textfield>
	<s:token></s:token>
	<s:submit></s:submit>
	</s:form>
</body>
</html>


(4)建立jsp页面: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>
	<h3>操作成功</h3>
</body>
</html>


(5)配置sturts.xml

<struts>
	<include file="struts-default.xml"/>
	<package name="amigo" extends="struts-default">
		<action name="token" class="amigo.struts.interceptor.buildin.TokenAction">
		<interceptor-ref name="token"></interceptor-ref>
		<result name="invalid.token">/interceptor/buildin/token.jsp</result>
		<result >/interceptor/buildin/success.jsp</result>
		</action>
	</package>
</struts>


只需要这样的配置,就实现了阻止重复提交的方法了。

三. 自定义拦截器(设置了自定义的拦截器后,原来的内置拦截器需要重新设置)

1. 编写拦截器类:TimerInterceptor.java

          
 package amigo.struts.interceptor.custom;

import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
/**
 * 自定义的执行时间的拦截器
 * */
public class TimerInterceptor extends AbstractInterceptor {
/**
 * 拦截方法以,在该方法中打印被拦截方法的执行时间
 * */
	@Override
	public String intercept(ActionInvocation invocation) throws Exception {
		// TODO Auto-generated method stub
	    long start=System.currentTimeMillis();
	    String result = invocation.invoke();
	    long end=System.currentTimeMillis();
	    System.out.println("执行被拦截方法的时间为= " +(end-start)+ "毫秒");
		return null;
	}

}

2.编写Action类:LoginAction.java

 
 package amigo.struts.interceptor.custom;

import com.opensymphony.xwork2.ActionSupport;
/**
 * 登录的Action
 * */
public class LoginAction extends ActionSupport {
	private String username;
	private String password;
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
 
	public String execute(){
		//System.out.println(username);
		//System.out.println(password);
		if(username !=null&&"amigo".equals(username)&&password !=null&&"amigo".equals(password)){
			System.out.println("username="+username+",password="+password);
			return this.SUCCESS;
		}else{
		
			return this.ERROR;
		}
	}
	
}


3.编写登录页面:login.jsp

  
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <%@ taglib prefix="s" uri="/struts-tags" %>
<!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>
	<s:form action="login">
		<s:textfield name="username" label="用户名"></s:textfield>
		<s:password name="password" label="密码"></s:password>
		<s:submit></s:submit>
	</s:form>
</body>
</html>

4.编写登录成功页面

  
<%@ 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>
	<h3>登录成功</h3>
</body>
</html>

5. 编写登录失败页面

    
 <%@ 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>
	<h3>登录失败</h3>
</body>
</html>

6. 配置struts.xml
       
<!DOCTYPE struts PUBLIC 
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" 
"http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>
	<include file="struts-default.xml"/>
	<package name="amigo" extends="struts-default">

         <interceptors>
	<interceptor name="timerInterceptor" class="amigo.struts.interceptor.custom.TimerInterceptor"></interceptor>
	</interceptors>	
		<action name="login" class="amigo.struts.interceptor.custom.LoginAction">
		<result name="success">/interceptor/custom/loginSuccess.jsp</result>
		<result name="error">/interceptor/custom/error.jsp</result>
		<!-- 为loginAction配置timerInterceptor 拦截器 -->
		<interceptor-ref name="timerInterceptor"></interceptor-ref>
		<interceptor-ref name="defaultStack"></interceptor-ref>
		</action>

	</package>
</struts>

以上六步完成了自定义的拦截器

分享到:
评论

相关推荐

    Struts2 + Spring + Hibernate + DWR 项目布署笔记

    首先,Struts2是一个基于MVC(Model-View-Controller)架构的开源Web应用框架,它提供了丰富的动作类、拦截器和结果类型,简化了控制器层的开发。Struts2与Spring的整合允许我们利用Spring的依赖注入(DI)和面向切...

    SSH项目(spring+hibernate+struts2)

    SSH项目是一种经典的Java Web开发框架组合,由Spring、Hibernate和Struts2三个开源框架组成。这个项目示例提供了一个基于这些技术的简单应用,帮助开发者理解如何将它们整合在一起进行实际开发。 **Spring框架**是...

    Struts2笔记+Hibernate3.6笔记+Spring3笔记

    SSH是Java开发中广泛使用的三大框架——Struts2、Hibernate和Spring的缩写。这三大框架结合使用,能够构建高效、灵活的企业级Web应用程序。现在,让我们深入探讨这些框架的知识点。 **Struts2笔记** Struts2是MVC...

    struts2+hibernate+spring三大框架知识点笔记

    Struts2、Hibernate和Spring是Java开发中三大主流框架,它们各自解决了Web开发中的不同问题,结合使用可以构建出高效、可维护的大型企业级应用。以下是对这三大框架及其结合使用的知识点详解。 **Struts2框架** ...

    jsp+tomcat+Struts2+Spring+Hibernate应用实例.rar

    Struts2提供了强大的Action类、拦截器、结果类型等机制,便于实现复杂的业务流程控制。 Spring是一个全面的企业级应用开发框架,它包含IoC(Inversion of Control,控制反转)和AOP(Aspect-Oriented Programming,...

    struts2+hibernate+spring的几篇入门用网文

    3. "MyEclipse下struts2、spring、hibernate整合 - 技术频道 IT168.mht":这篇文档可能详细描述了在MyEclipse中整合这三大框架的具体步骤,包括添加库、配置web.xml和struts.xml、Spring的bean配置以及Hibernate的...

    Struts 2 + Spring 2.0 + Hibernate 3.0整合笔记

    6. **配置拦截器**:Struts 2的拦截器可以用来实现一些通用功能,如日志、权限检查等。我们可以自定义拦截器并将其添加到配置文件中。 7. **测试和调试**:完成配置后,通过编写单元测试和集成测试来验证整合是否...

    struts+spring+hibernate学习笔记

    6. 实现Struts的拦截器,增强应用的功能。 7. Hibernate的查询机制,包括HQL和Criteria API。 8. SSH项目结构设计,包括各层之间的关系和职责划分。 通过深入学习和实践这些知识点,你将能够熟练地运用SSH架构进行...

    SSH整合学习笔记之struts2+spring+hibernate+c3p0源码

    首先,Spring需要配置Struts2的拦截器栈,以控制请求的处理流程。接着,Spring会管理Hibernate SessionFactory,为每个请求提供新的Session实例,以避免线程安全问题。同时,C3P0的配置包括设置初始连接数、最大连接...

    java学习资料集合梁建全老师(js+jsp+jqurey+Struts2+hibernate+Spring+jdbc+java基础等)

    它包括动作映射、拦截器、结果类型等概念。 "Java相关课程系列笔记之十四Hibernate学习笔记"是关于对象关系映射(ORM)框架Hibernate的。Hibernate简化了Java应用与数据库之间的交互,通过映射对象模型到关系数据库...

    struts2.1.8+spring2.5+hibernate3.2+ext3.0框架整合笔记(一)

    Struts2、Spring和Hibernate是Java开发中常用的三大框架,它们各自负责Web应用的不同层面:Struts2处理表现层逻辑,Spring提供业务层管理和依赖注入,而Hibernate则负责持久化层,管理数据库交互。在本笔记中,我们...

    struts2.1.8+spring2.5+hibernate3.2+ext3.0框架整合笔记(三)

    Struts2的拦截器机制允许在Action执行前后添加自定义逻辑,增强了灵活性。 2. **Spring2.5**:Spring是全面的企业级应用开发框架,它提供了依赖注入(DI)和面向切面编程(AOP)等功能。DI帮助管理对象的生命周期和...

    spring+hibernate+struts2使用笔记

    根据给定文件的信息,我们可以总结出关于Spring、Hibernate与Struts2框架的使用与整合的知识点。以下将从Struts2的基本概念、MVC设计模式、Struts2在MVC中的实现、Struts2配置以及相关环境搭建等方面进行详细介绍。 ...

    Struts2_hibernate_spring学习笔记.zip

    Struts2提供了丰富的拦截器(Interceptor)机制,可以方便地实现权限验证、日志记录等功能。此外,Struts2还支持多种结果类型和模板技术,如FreeMarker、JSP等,使得视图层的展现更加灵活。 Hibernate则是一个对象...

    SSH笔记-整合Spring2、Struts2、Hibernate4

    2. **拦截器**:Struts2使用拦截器实现业务逻辑前后的预处理和后处理,如权限验证、日志记录等。 3. **结果视图**:结合FreeMarker或JSP等模板技术,将数据渲染成视图展示给用户。 三、Hibernate4框架 Hibernate是...

    Struts2、Spring和Hibernate应用实例

    Struts2、Spring和Hibernate是Java Web开发中的三大框架,它们各自解决了一部分问题,而结合起来则能构建出高效、可维护的Web应用程序。这里,我们深入探讨这三个框架的核心概念和实际应用。 **Struts2** 是一个MVC...

    struts2.21 spring hibernate 整合笔记

    Struts2、Spring和Hibernate是Java Web开发中的三大框架,它们各自在应用程序的不同层面发挥着重要作用。Struts2作为MVC(模型-视图-控制器)框架,负责处理请求和控制应用程序流程;Spring则是一个全面的后端框架,...

    [尚硅谷]_佟刚java Struts2_Hibernate_Spring面试题答案分析.zip

    1. **Struts2的核心组件**:Action、Result、Interceptor(拦截器)是其核心组成部分,拦截器使得在请求处理前后可以插入自定义逻辑。 2. **FilterDispatcher与StrutsPrepareAndExecuteFilter**:Struts2的过滤器,...

    张龙圣思园struts2学习笔记word

    笔记中可能详细讲解了Struts2的配置文件,如struts.xml,它是整个应用的配置中心,定义了Action的映射、结果类型、拦截器栈等。在Action配置中,我们可以指定Action类、方法以及对应的URL路径,实现请求与业务的关联...

Global site tag (gtag.js) - Google Analytics