您当前的位置: 首页 > 

Charge8

暂无认证

  • 3浏览

    0关注

    447博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

Struts2拦截器

Charge8 发布时间:2018-07-08 13:26:09 ,浏览量:3

Struts2拦截器概述

拦截器:Interceptor

------------------------------

拦截器(Interceptor):Struts2拦截器是在访问某个Action或Action的某个方法之前或之后实施拦截,并且Struts2拦截器是可插拔的,拦截器是 Spring AOP的一种实现.

 

AOP:面向切面编程.其实现原理:动态代理模式

 

WebWork中文文档解释:拦截器是动态拦截Action调用的对象。它提供了一种机制使开发者可以定义在一个Action执行的前后执行的代码,也可以在一个action执行前阻止其执行。同时也提供了一种可以提取Action中可重用的代码的方式。

 

拦截器栈(InterceptorStack):Struts2拦截器栈就是将拦截器按一定的顺序连接成一条链。在访问被拦截的方法或字段时,Struts2拦截器链中的拦截器就会按其之前定义的顺序被调用。

-----------------------------------------------------------------

拦截器的作用

---------------------------------------------------

DRY原则:Dont't Repeat Yourself.

拦截器在设计和程序结构上的优点:

  拦截器能把很多功能从Action中独立出来,分散到不同的拦截器里面,减少了Action的代码。如此,拦截器和Action本身的功能都更单一了。当通用的功能代码被封装在拦截器里面(代码模块化),就可以对不同的Action,根据功能需要,来配置相应功能的拦截器了。提高了拦截器所实现的功能的重用性,也变相实现了装配式和可插拔式的体系结构,使得整个系统结构变得更灵活。

 

1.简化Action的实现

2.功能更单一

3.通用代码模块化

4.提高重用性

 

 

Struts2中Action的执行流程

 

Struts2中Action的执行流程

----------------------------------------------------------

①.客户端发送请求;

②.该请求经过一系列的过滤器(Filter):其中可选过滤器ActionContextCleanUp,帮助Struts2和其他框架集成。例如:SiteMesh Plugin。

③.接着FilterDispatcher(前端控制器)被调用,FilterDispatcher询问ActionMapper,来决定该请求是否需要调用某个Action。拦截器只对Action作拦截

④.若ActionMapper决定需要调用某个Action,FilterDispatcher把请求的处理交给ActionProxy。

⑤.ActionProxy通过Configuration Manager询问框架的配置文件struts.xml,找到需要调用的Action类。

⑥.ActionProxy创建一个ActionInvocation的实例。

⑦.ActionInvocation实例调用Action的前后,涉及到相关拦截器(Intercepter)的调用。

⑧.一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果result。返回结果是一个JSP或其他页面(也可以是其他的Action链)。 JSP页面展现可使用Struts2框架中的标签(该过程会涉及ActionMapper)。

-----------------------------------------------------------------

在上述整个过程中,Struts2框架中会产生很多对象,都是由Struts2中的xwork容器负责创建的-ObjectFactory

 

Struts2内置拦截器

Struts2之所有强大,是因为它内置了很多拦截器,Struts2框架中自定义的,可以直接拿来使用的拦截器.

不同的拦截器栈(interceptor-stack)是不同拦截器的组合,用户根据不同的需求选择不同的拦截器栈.

Struts2中内置的拦截器:

在struts-core-2.3.x.jar--->struts-default.xml中

------------------------------------------

常见的拦截器:

1:params拦截器

   这个拦截器偷偷的把请求参数设置到相应的Action的属性去的,并自动进行类型转换。       

2.modelDriven拦截器

   如果Action实现ModelDriven接口,它将getModel()取得的模型对象存入OgnlValueStack中。

 

3.execption拦截器

   顾名思义,在抛出异常的时候,这个拦截器起作用。最好把它放在第一位,让它能捕获所有的异常。

 

4.validation拦截器

   调用验证框架读取 *-validation.xml文件,并且应用在这些文件中声明的校验。

 

5.token拦截器

   核对当前Action请求(request)的有效标识,防止重复提交Action请求。

 

6.fileUpload拦截器

    用来处理文件上传

 

7.workflow拦截器

     调用Action的validate方法,一旦有错误返回,重新定位到INPUT结果视图

在校验的时候,如果有错误,将将错误信息放到一个List集合中,此时workflow拦截器来判断List集合中是否有数据,如果有就返回一个逻辑试图名称为input

 

8.servletConfig

    通过感知接口,获取感应对象

 

自定义拦截器

步骤1.定义拦截器类

      方式1:实现com.opensymphony.xwork2.interceptor.Interceptor接口.

      方式2:继承com.opensymphony.xwork2.interceptor.AbstractInterceptor类.

 

public class LoginInterceptor extends MethodFilterInterceptor{
	@Override
	protected String doIntercept(ActionInvocation invocation) throws Exception {
		ActionContext act = invocation.getInvocationContext();
		
		Map session = act.getSession();
		Object user = session.get("user");//假设登录成功后session中 会有一个user的对象
		if(user == null){
			//没有登录
			return "login";
		}
		return invocation.invoke();
	}

}

步骤2.在struts.xml中注册拦截器,告诉Struts2

      第一步:先在中声明拦截器CheckLoginInterceptor.

      第二步:在中来引用CheckLoginInterceptor拦截器.

第三步:设置当前使用的拦截器栈.

 


	
				
		
			
			
			
				
				
				
				select
			
			
			
			
				
				
			
		
		
		
		
		
		
		
			/index.jsp
				
		
			/index.jsp
			/login.jsp
		
		
	

 

 

 

关注
打赏
1664721914
查看更多评论
立即登录/注册

微信扫码登录

0.0373s