一.Struts2中拦截器和过滤器的区别
1.过滤器依赖于Servlet容器,而拦截器不依赖于Servlet容器;
2.Struts2拦截器只能对Action请求起作用,而过滤器则可以对几乎所有的请求起作用;
3.拦截器可以访问ActionContext(Action上下文)和值栈里的对象,而过滤器不能;
4.在Action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化的时候被调用一次。
二、拦截器的生命周期与工作过程
每个拦截器都需要实现Interceptor接口(这个接口中有三个方法init( )、intercept( )、destroy( ))
init( )是在Struts2框架运行时执行,在拦截器的生命周期中只执行一次,可以在这个方法中对相关资源进行必要的初始化;
intercept(ActionInvocation invocation)每拦截一个动作请求,该方法就调用一次,intercept( )方法接收一个ActionInvocation接口的实例,通过这个接口可以获取动作类对象invocation.getAction( ),invocation.getProxy( ).getAction( )跟invocation.getAction( )方法获取的是同一个对象,invocation.getProxy( ).getActionNme( )获取action标签的name属性,invocation.getProxy( ).getMethod( )动作类要执行的方法名,invocation.getProxy( ).getNamespace( )获取自定义配置标签的namespace属性的值。
destroy( )是在拦截器销毁前执行,在拦截器的声明周期中只执行一次。
三、Struts2的工作流程
(Struts2最核心的原理是用AOP实现的,即动态代理:可以把所有的拦截器看成切面,把拦截器中的方法看成通知,我们在编写Struts2的Action时仅仅写的是目标类的目标方法。在Struts2中,action和拦截器是松耦合的,彼此不知道对方的存在,彼此没有关联,二者通过代理对象ActionProxy把二者联系起来)
1.当tomcat启动时,执行过滤器的init()方法,Dispatcher dispatcher = init.initDispatcher(config);→initDispatcher( )→dispatcher.init( )→init_DefaultProperties(); init_TraditionalXmlConfiguration( );
DEFAULT_CONFIGURATION_PATHS = "struts-default.xml, struts-plugin.xml, struts.xml";
init_DefaultProperties方法加载了default.properties配置文件;init_TraditionalConfigurations( )加载了三个配置文件:struts-default.xml只有一个,struts-plugin.xml可能有多个,struts.xml只有一个 ,这三个配置文件的did一样,如果出现相同的选项,后者覆盖前者。Struts2容器会在classpath环境下,及jar包下找所有的struts-plugin.xml文件。
2.当访问一个url时,首先执行doFilter方法,然后再执行executeAction(request, response, mapping)方法→serviceAction(request, response, servletContext, mapping),再然后产生ValueStack,调用ActionProxy.execute。
****在struts的配置文件中,利用<bean type=" " name=" " class=" ">的形式写的类都叫静态注入,当tomcat服务器启动的时候就加载了,比如:<bean type="com.opensymphony.xwork2.util.ValueStackFactory" name="struts" class="com.opensymphony.xwork2.ognl.OgnlValueStackFactory"/>意味着在web服务器启动的时候,ValueStack接口的实现类是OgnlValueStack*****
Struts2的流程总结:1.请求发给StrutsPrepareAndExecuteFilter,2.StrutsPrepareAndExecuteFilter判断该请求是否是一个Struts2请求,3.若该请求是一个Struts2请求,则StrutsPrepareAndExecuteFilter把请求的处理交给了ActionProxy,4.ActionProxy创建一个ActionInvocation的实例,并进行初始化,5.ActionInvocation实例在调用Action的过程前后,涉及到相关拦截器Intercepter的调用,6.Action执行完毕,ActionInvacation负责根据struts.xml的配置找到对应的结果,调用结果的execute方法,渲染结果,7.执行各个拦截器invocation.invoke()之后的代码,8.把结果发给客户端
四、Struts2中默认包struts-default有什么作用?
1.struts-default包是struts2内置的,它定义了struts2内部的众多拦截器和Result类型,而Struts2很多核心的功能都是通过这些内置的拦截器实现,如:从请求中把请求参数封装到action、文件上传和数据验证等等都是通过拦截器实现的,当包继承了struts-default包才能使用这些功能。
2.struts-default包是在struts-default.xml中定义,struts-default.xml也是Struts2默认配置文件。Struts2每次都会自动加载struts-default.xml文件。
3.通常每个包都应该继承struts-default包。