struts原理

struts的处理过程:
当页面访问一个action时,执行过程是这样的:

1、客户端发送请求到tomcat,将HttpServletRequest传入,
2、HttpServletRequest请求经过一系列Filter
3、传到FilterDispatcher,访问ActionMapper
   实际上在部署应用程序的时候,tomcat已经读取了struts.xml文件,并产生一个ActionMapper,即action的映射文件,strutsPreapareAndExecuteFilter读的是ActionMapper,这样提高了

   效率
4、ActionMapper决定调用某个ActionFilterDispatcher把请求交给ActionProxy
5、ActionProxy调用ActionInvocation的invoke方法,
6、在ActionInvocation的invoke方法中先进入层层Intercept拦截器,利用递归的方式最后访问到真正的Action的execute方法,然后退出层层Intercept,
7、Action执行完毕后,ActionInvocation根据返回的字符串,找到对应的result。然后将Result内容通过HttpServletResponse返回给服务器
8、服务器将内容发送给浏览器

Struts2拦截器,每个拦截器类只有一个对象实例,即采用单例模式,所有引用这个拦截器的Action都共享这一拦截器类的实例,因此,在拦截器中如果使用类变量,要注意同步问题。
1、拦截器是在访问某个方法,字段之前或之后实施拦截。
2、拦截器是AOP的一种实现
3、拦截器栈(Interceptor Stack):
    拦截器栈就是将拦截器按一定的顺序联结成一条链。
 在访问被拦截的方法或字段时,拦截器链中的拦截器就会按其之前定义的顺序被调用。

拦截器和过滤器的区别
1. 拦截器和过滤器的概念非常类似。
2. 过滤器隶属于web容器,可以过滤一切请求(包括action、servlet、jsp、html等等)。
3. 而拦截器隶属于struts2框架,只能拦截action(无法拦截对jsp的请求)。
4. 过滤器内部采用函数回调来实现。拦截器采用动态代理+递归调用来实现!

 

 

你可能感兴趣的:(struts原理)