struts1的处理流程:
1、根据浏览器是post还是get请求调用doPost()、doGet()方法,在其中调用ActionServlet的process()方法。
2、Process()获取RequestProcessor对象,调用RequestProcessor对象的process()方法
3、 Process()读取struts-config.xml,在其中查找<action>子元素,查找的条件是:用户请求的URI与 action元素的path属性值一样,找到后确定name属性,根据name找到<form-bean>元素,再根据action元素的 name匹配值找到相应的ActionForm bean。
4、 调用ActionForm bean的setter方法填充FormBean的属性,然后调用FormBean的validate()方法,对表单数据的有效性进行验证。
5、 RequestProcessor的process()方法根据3中找到的<action>中的type属性寻找Action bean对象(有则使用,无则创建),然后将FormBean对象,封装的请求对象等信息发给找到的Action对象,Action bean调用自己的execute()方法处理。
6、Action bean的execute()方法执行完璧后,返回一个ActionForward对象,又回到RequestProcessor对象的process()方法,process方法将根据ActionForward请求重新定向到指定的页面。
一个请求在Struts 2框架中的处理大概分为以下几个步骤。
客户端提交一个(HttpServletRequest)请求。
请求被提交到一系列(主要是3层)的过滤器(Filter),如(ActionContextCleanUp、其他过滤器(SiteMesh等)、 FilterDispatcher)。
FilterDispatcher是控制器的核心,就是MVC的Struts 2实现中控制层(Controller)的核心。
FilterDispatcher询问ActionMapper是否需要调用某个Action来处理这个请求,如果ActionMapper决定需要调用某个Action,FilterDispatcher则把请求的处理交给ActionProxy。
ActionProxy通过Configuration Manager询问框架的配置文件struts.xml,找到需要调用的Action类。
ActionProxy创建一个ActionInvocation实例,同时ActionInvocation通过代理模式调用Action。但在调用之前,ActionInvocation会根据配置加载Action相关的所有Interceptor(拦截器)。
一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果result。