在用Struts开发的Web应用中,我们主要编写Action类来处理到来的请求,但请求到达Action之前,Struts为我们做了很多工作。
Struts使用ActionServlet统一处理所有到来的请求,每到来一个请求,它都要做很多事情,执行我们编写的Action只是其中之一,Struts处理请求的过程如下:
1. 选择模块
根据请求URL和应用的所有模块名(这个模块名的集合在ActionServlet的初始化时放到ServletContext里),分析出请求对应的模块名。
根据这个模块名,从ServletContext里拿到对应的模块(ModuleConfig对象),放到request作用域里。
根据这个模块里的MessageResources配置信息,从ServletContext里拿到对应的MessageResources对象,放到request作用域里。
2. 获得模块对应的RequestProcessor
从ServletContext里拿模块对应的RequestProcessor,如果没拿到(说明模块第一次被访问),根据模块里Controller的配置信息创建一个RequestProcessor,放到ServletContext里。
3. 处理multipart请求
如果请求是POST的,并且其contentType属性值为multipart/form-data,将请求包装成MultipartRequestWrapper。
4. 处理请求路径
将请求的URI掐头去尾,也就是将URI中的模块名和后缀名两部分去掉。如果路径为null,处理请求结束。
5. 处理Locale
如果Struts配置文件里controller元素的locale属性没有指定为false,并且session里没有Locale的话,就从request里拿到Locale,放到session里。
6. 处理内容类型
如果Struts配置文件里controller元素给出了contentType属性,将response的内容类型设置为它的值。
7. 处理no-cache headers
如果Struts配置文件里controller元素的nocache属性指定为true(默认为false),设置response的相关header属性。
8. 预处理
默认的,Struts在这一步没做任何事情,如果需要,可以继承RequestProcessor,重写这一步,实现条件性的确定是否继续执行后面的步骤。
9. 处理缓存信息
在session里找名字为Globals.MESSAGE_KEY和Globals.ERROR_KEY的ActionMessages,如果有并且已经被访问过,就从session里删除它们。
10. 处理ActionMapping
根据请求的路径,从模块里找ActionMapping(对应于Struts配置文件里的action元素),如果没有完全匹配路径的,就找模糊匹配的。
如果没找到,就找第一个指定unknown属性为true的。
找到后放到request里,没找到就向response发送错误信息。
11. 处理角色权限
针对上面拿到的ActionMapping,如果它设置了roles属性值,检查请求者是否属于这些角色。
12. 处理ActionForm
针对上面拿到的ActionMapping,根据它的name属性,查找对应的form-bean元素。
根据它的attribute和scope属性,在request或session里查找ActionForm,如果找到,还要对照刚才找到的form-bean元素,检查它们的类型是否匹配。
如果没找到ActionForm或检查类型不匹配,就根据form-bean元素创建新的ActionForm。
根据scope属性,把ActionForm放到request或session里。
13. 填充ActionForm
用请求参数填充对应的ActionForm属性。
14. 验证ActionForm
实际上就是调用ActionForm的validate()方法,如果validate()方法返回的ActionErrors不为空,表示没有通过验证,请求将转向到ActionMapping的input属性指定的路径。
如果出现下面的情况之一将跳过这一步:
ActionForm为null;
ActionMapping的validate属性指定为false;
当前请求由点击“取消”按钮(即<html:cancel>)产生。
15. 处理Forward
如果ActionMapping设置了forward属性值,请求将转向该属性指定的路径。
16. 处理include
如果ActionMapping设置了include属性值,请求将包含该属性指定的路径。
17. 获得Action对象
Action对象是ActionMapping的type属性指定类的实例。如果Action对象以前被访问过,可以直接获得该对象;如果没有被访问过,则创建新的Action对象。
18. 执行Action的execute()方法
这个execute()方法就是使用Struts的程序员最熟悉的那个方法。
19. 处理ActionForward
上面的execute()方法返回一个ActionForward对象,将请求转发或重定向到ActionForward的path属性指定的路径。
分享到:
相关推荐
最详细的struts流程图 最详细的struts流程图 最详细的struts流程图
1.Struts流程描述.ppt 1-2.Struts应用.ppt 2-1.Struts的工作流程.ppt 2-2.JSP文件解析.ppt 2-3.struts实验1.ppt 2-4.struts实验2.ppt 3.struts控制器.ppt 3.配置struts.ppt
struts流程图struts流程图struts流程图struts流程图
我们已在前面学习了Servlet 数据库应用,有了JSP、Servlet 、JDBC的一些知识、理解和...2. Struts2基本流程 3. 了解核心控制器FilterDispatcher及在web.xml中的配置 4. 了解业务控制器Action及在struts.xml中的配置
理解Struts的工作流程对于开发者来说至关重要,因为它可以帮助我们更好地组织代码,提高开发效率,并确保应用程序的可维护性和扩展性。下面将详细解析Struts的流程。 1. **请求发起**:当用户在浏览器中输入URL并...
底层,详细. Struts运行流程图(详细) Struts运行流程图(详细) Struts运行流程图(详细)
在深入探讨Struts2的工作流程之前,我们先了解一下MVC模式的基本概念。MVC模式将应用逻辑分隔为三个部分:模型(Model)处理业务逻辑,视图(View)负责展示数据,控制器(Controller)协调用户输入和模型间的交互。...
虽然Struts2号称是一个全新的框架,但这仅仅是相对Struts 1而言。Struts 2 与Struts 1相比,确实有很多革命性的改进,但它并不是新发布的新框架,而是在另一个赫赫有名的框架:WebWork基础上发展起来的。从某种程度...
在上述的描述中,我们了解了Struts工作流程的关键步骤: 1. **客户端请求**:当用户在浏览器中输入一个以`.do`结尾的URL(例如http://localhost:8080/helloapp/Hello.do)时,这个请求会被Web服务器捕获并传递给...
以下是Struts工作流程的详细说明: 1. **模型(Model)**: 模型层主要负责应用程序的状态管理和业务逻辑处理。在Struts框架中,模型通常由JavaBean或Enterprise JavaBeans(EJB)来实现。JavaBean是简单的Java类...
一个请求在Struts 2框架中的处理大概分为以下几个步骤。 客户端提交一个(HttpServletRequest)请求,如上文在浏览器中输入 http://localhost: 8080/bookcode/ch2/Reg.action就是提交一个(HttpServletRequest)...
非常明确的,清晰明了的struts 业务流程图,把图看懂了就懂struts了。
struts流程 struts流程 ,并在2004年3月成为ASF的顶级项目。它通过采用JavaServlet/JSP技术,实现了基于Java EEWeb应用的MVC设计模式的应用框架,是MVC经典设计模式中的一个经典产品 Hibernate是一个开放源代码的...
struts流程,个人的一点总结,各位将就着看吧
### Struts1的工作流程详解 #### 一、概述 Struts1是Apache Struts的第一个版本,它是基于Java Servlet/JavaServer Pages技术构建的MVC框架。对于初学者来说,了解Struts1的工作流程是非常重要的,这有助于理解...
这张流程图 深刻的描述了 struts2的执行流程 帮助了解Struts2