struts2工作流程
struts主要包括核心控制器strutsPrepareAndExecuteFilter、业务控制器Action、用户逻辑组件
工作流程:
1.用户请求经过一系列过滤器,控制器strutsPrepareAndExecuteFilter被调用,到达ActionMapper判断该请求是否需要struts进行处理
2.若ActionMapper判断该请求需要某个Action进行处理,则将该请求交给ActionProxy
3.ActionProxy通过Configuration Manager来读取struts.xml配置文件找到需要调用的Action类
4.ActionProxy创建一个ActionInvocation实例并经过一系列拦截器Interceptor
5.若通过拦截器将响应内容通过strutsPrepareAndExecuteFilter返回到结果处
struts2的优势
1.MVC架构,开发方便简单
2.使用OGNL表达式进行参数传递,方便获取Request、session、application域的对象
3.强大的拦截器功能,struts2的拦截器是一个Action级别的AOP,可以用作异常处理,权限拦截等
4.对某个指定方法进行校验
5.方便整合
struts2启动流程
通过核心控制器strutsPrepareAndExecuteFilter启动,strutsPrepareAndExecuteFilter中的init()方法会读取struts.xml内容,将其封装成JAVABean对象并装入内存,因此用户每次请求都是读取内存中的数据,而不是去读struts.xml
strutsPrepareAndExecuteFilter作用
是struts2的核心控制器,用于拦截用户请求
拦截器与过滤器的区别
1.拦截器是基于反射,过滤器是基于函数回调
2。在Action的生命周期里,拦截器可以多次调用,过滤器只能在容器初始化调用一次
3.拦截器可以访问Action上下文、值栈里面对象,过滤器不可以
4.拦截器只能对Action请求起作用,过滤器可以对所有请求起作用
struts2线程安全性
struts2是线程安全的,对每一个请求都会创建一个Action实例(因此性能会出现问题),同时一个Action实例可以处理多个请求(通过在配置文件创建不同的method)
注:servlet是线程不安全的,因为servlet默认是单例模式,多个请求访问同一个servlet的service方法,当方法中出现共享变量时,可能会出现并发问题
struts2与springMvc的不同之处
1.struts2的核心控制器是采用Filter的(strutsPrepareAndExecuteFilter),springMvc是采用servlet的(dispatcherServlet)
2.springMvc方法独立,独享request域以及response域,方法间不共享变量,struts2虽然方法独立,但是用属性接受参数,所有的action变量是共享的
3.struts2有自己的配置机制,而spring使用独立的AOP方式,配置文件比springMvc多
struts2的拦截器与springMvc拦截器的对比
1.struts2的拦截器是基于类拦截的,一个类对应一个request上下文,springMcv的拦截器是基于方法拦截的,一个方法对伊一个request上下文,同时对应一个url
2.他们的拦截器都是继承了servlet的filter且都传递了response与request,springMvc过滤后去找controller,struts2过滤后去struts的配置文件找action
参考
https://www.cnblogs.com/zhanglizhi/p/5250887.html
https://www.cnblogs.com/firstdream/p/5589314.html