Struts2
一个请求在Struts2框架中的处理大概分为以下几个步骤
1、客户端初始化一个指向Servlet容器(例如Tomcat)的请求
2、这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做ActionContextCleanUp的可选过滤器,这个过滤器对于Struts2和其他框架的集成很有帮助,例如:SiteMesh Plugin)
3、接着FilterDispatcher被调用,FilterDispatcher询问ActionMapper来决定这个请是否需要调用某个Action
4、如果ActionMapper决定需要调用某个Action,FilterDispatcher把请求的处理交给ActionProxy
5、ActionProxy通过ConfigurationManager询问框架的配置文件,找到需要调用的Action类 ,这里,我们一般是从struts.xml配置中读取。
6、ActionProxy创建一个ActionInvocation的实例。
8、一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。返回结果通常是(但不总是,也可能是另外的一个Action链)一个需要被表示的JSP或者FreeMarker的模版。在表示的过程中可以使用Struts2 框架中继承的标签。在这个过程中需要涉及到ActionMapper
拦截器
1. 如果拦截器堆栈中还有其他的Interceptor,那么invocation.invoke()将调用堆栈中下一个Interceptor的执行。
2. 如果拦截器堆栈中只有Action了,那么invocation.invoke()将调用Action执行。
3. 如果在拦截器中,我们不使用invocation.invoke()来完成堆栈中下一个元素的调用,而是直接返回一个字符串作为执行结果,那么整个执行将被中止。
4. 我们可以以invocation.invoke()为界,将拦截器中的代码分成2个部分,在invocation.invoke()之前的代码,将会在Action之前被依次执行,而在invocation.invoke()之后的代码,将会在Action之后被逆序执行。
由此,我们就可以通过invocation.invoke()作为Action代码真正的拦截点,从而实现AOP。
(摘自:http://blog.csdn.net/csh624366188)
自定义拦截器
在Struts2程序开发中,如果要创建自己的拦截器,要使用接口:com.opensymphony.xwork2.interceptor.AbstractInterceptor,该接口提供了如下三个方法:
- void init()
- void destroy()
- String intercept(ActionInvocation invocation) throws Exception:用户实现的拦截动作,返回一个字符串作为逻辑视图。
拦截器有什么用?
比如,在一个商城系统中,用户执行了某些敏感操作,那么在执行前我必须判断用户是否登录,如果没有,则跳转到登录页面。
验证登录实例
AuthorizationInterceptor.java (拦截器核心代码)
package com.digital.interceptor;
import java.util.Map;
import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
public class AuthorizationInterceptor extends AbstractInterceptor {
@Override
public String intercept(ActionInvocation invocation) throws Exception {
Map session=invocation.getInvocationContext().getSession();
String usr=(String)session.get("CURRENT_USER");
if (usr==null) {
return Action.INPUT; //返回'input'字符串
}else{
return invocation.invoke();
}
}
}
struts.xml里加上:
<interceptors>
<interceptor name="myAuthorization" class="com.digital.interceptor.AuthorizationInterceptor"></interceptor>
<!-- 定义拦截器栈 -->
<interceptor-stack name="myStack">
<interceptor-ref name="defaultStack"/>
<interceptor-ref name="myAuthorization"/>
</interceptor-stack>
</interceptors>
<!-- 定义默认的拦截器引用,都拦截 -->
<!--<default-interceptor-ref name="myStack"/>-->
<action name="list" class="com.digital.action.ProductInfoAction" method="list">
<result name="index">/index.jsp</result>
<interceptor-ref name="myStack"></interceptor-ref><!--访问list时,拦截-->
</action>
这样,当访问“list.action”时,会启动拦截器AuthorizationInterceptor进行拦截,如果用户没有登录,则转到登录页面。