struts2核心技术

Struts2两个重要组成部分

struts2核心就是核心控制器和业务控制器。

核心控制器StrutsPrepareAndExecuteFilter

StrutsPrepareAndExecuteFilter作为一个filter运行在web应用中,负责拦截所有用户请求,该filter 会过滤用户请求,然 后将请求都交给struts2框架处理。

拦截器会默认拦截扩展名为.action的请求,什么后缀名都不写也可以。例如 hello.action或者hello都会进行拦截。xxx.jsp就不会进行拦截,直接放行。

 

(1)启动Tomcat,tomcat加载web.xml文件。同时加载和初始化核心过滤器,查看struts2源码,发现核心过滤器的初始化方法中会加载struts.xml等struts2配置文件。

(2)当用户请求到达时,核心过滤器拦截用户请求,将请求交给struts2框架来处理,即去匹配struts.xml的内容。 
struts2框架获取用户请求后,根据请求的名字来决定调用哪个业务逻辑组件,实例化相应的类。例如,对于login请求,调用名为login的Action处理。

(3)struts2的所有Action都被定义在struts.xml文件中,Action有name和class属性,name决定了该Action处理哪个用户请求,class决定了该Action的实现类。

(4)Struts2用户处理用户请求的Action实例,并不是用户实现的业务控制器,而是Action代理,他会回调用户的处理方法,因为用户实现的业务控制器没有与Servlet API有任何关系,所以根本没办法进行获取参数等请求处理,而struts2定义了一系列拦截器,会对请求参数解析,传入到Action中,回调execute方法。

我们每次请求都会实例化相应的类,所以不会出现线程不安全的情况。而Servlet为单例,会出现线程不安全。

业务控制器:

业务控制器就是用户实现的Action类,Action类中通常包含一个execute方法,该方法返回一个字符串,字符串与struts.xml中的result的name相对应,跳转到不同页面。

 

struts2内部运行流程

struts2核心技术

(1)客户端发出HTTP请求

(2)然后请求被核心过滤器StrutsPrepareAndExecuteFilter拦截

(3)核心过滤器将请求转发到Action映射器,Action映射器负责识别当前的请求是否需要交由Struts2处理。

(4)Action映射器返回需要struts2处理的信息,StrutsPrepareAndExecuteFilter会创建一个Action代理

(5)Action代理并不知道执行哪一个Action,它会向配置管理器询问调用哪一个Action,配置管理器会从struts.xml读取我们配置的Action信息。

(6)Action代理创建相关请求的Action对象,调用相关的方法之前,struts2的一系列拦截器会帮我们做一些操作,例如获取请求参数等。

(7)然后调用execute方法根据返回的字符串去匹配相应的页面,

(8)页面可以获取一些页面模板,然后生成最终页面,再倒序的执行拦截器的后续操作

(9)最后生成HTTP响应内容