Struts执行流程

来源:互联网 发布:中国m2增速数据 编辑:程序博客网 时间:2024/05/12 01:57

本文转自ChinaUnix,作者:wjxcoder, 时间:2011-11-14 14:28:28

对于采用Struts框架的Web应用,在Web应用启动时就会加载并初始化ActionServlet,ActionServlet从struts- config.xml文件中读取配置信息,把它们存放到各种配置对象中,例如Action的映射信息存放在ActionMapping对象中。
当ActionServlet接收到一个用户请求时,将执行如下步骤:
1)检索和用户请求匹配的ActionMapping实例,如果不存在,就返回请求路径无效的信息。
2)如果ActionForm实例不存在,就创建一个ActionForm对象,把用户提交的表单数据保存在ActionForm对象中。
3)根据配置信息决定是否需要表单验证。如果需要验证,就调用ActionForm的validate()方法。
4)如果ActionForm的validate()方法返回null或返回一个不包含ActionMessage的ActionErrors对象,就表示表单验证成功。
5)ActionServlet根据ActionMapping实例包含的映射信息决定将请求转发给哪个Action。如果相应的Action实例不存在,就先创建这个实例,然后调用Action的execute()方法。
6)Action的execute()方法返回一个ActionForward对象,ActionServlet再把用户请求转发给ActionForward对象指向的JSP组件。
7)ActionForward对象指向的JSP组件生成动态网页,返回给用户。
步 骤4中,如果ActionForm的validate()方法返回一个包含一个或多个ActionMessage的ActionErrors对象,就表示 表单验证失败,此时ActionServlet将直接把请求转发给包含用户提交表单的JSP组件,在这种情况下,不会创建Action对象并调用 Action的execute方法。

1 Struts1的执行流程2

1)客户端发起.do结尾的请求,由ActionSerlvet接收;
2)ActionServlet接收请求,交给RequestProcessor处理(实际上就是调用RequestProcessor的process方法);
3)RequestProccessor根据请求路径查找对应的ActionMapping,如果找不到,报404错误;
4)RequestProccessor查找或者创建一个ActionForm对象(ActionForm可以被重用,存在于两个范围,Session或者Request);
5)RequestProccessor调用ActionForm的reset方法,重置状态信息;
6)RequestProccessor调用ActionForm的setXXX方法,将客户端提交的参数封装到ActionForm中;
7)RequestProccessor调用ActionForm的validate方法,如果此方法返回一个ActionErrors对象,并且这个对 象中包含错误信息,那么认为验证失败,如果验证失败,那么将请求转发到Action元素的input属性指定的路径上去,反之验证成功;
8)RequestProccessor查找或者创建一个Action(Action对象是单例的);
9)RequestProccessor调用Action对象的execute方法执行Action,并且传入ActionMapping,ActionForm,HttpServletRequest,HttpServletResponse这四个对象;
10)在Action的execute方法中可以通过调用ActionForm的getter方法来获得客户端提交的数据,可以调用模型的方法来处理业务;
11)通过ActionMapping的findForward方法返回一个ActionForward对象或者直接new一个ActionForward对象;
12)主控器获得Action返回的ActionForward对象,然后根据这个对象中封装的信息,将请求转发(重定向或者内部跳转)到具体页面;
13)jsp页面向客户端作出响应;
四个主要类的请求顺序是:ActionMapping--ActionForm---Action---ActionForward.

 


2 sturts1框架基本组件包

整个struts1大约由15个包,300个java类组成
核心包如下
org.apache.struts.Action:控制整个struts1框架运行的核心类;如ActionServlet,RequestProcessor,Action,ActionMapping,ActionForm,ActionForward等
org.apache.struts.Actions:特定适配器转换功能;如DispatchAction
org.apache.struts.Config:提供对配置文件struts-config.xml元素的映射
org.apache.struts.Taglib:标签类的集合
org.apache.struts.Util:支持web Application的一些常用服务功能
org.apache.struts.Validator:用于动态的配置form表单验证(struts1.1以上)

3、Struts1.2中组件的功能:

1)控制层的分类
1.ActionServlet:(公司的老总)
由Struts框架提供的一个类,用来接受所有客户端的*.do请求,但是他本身不会去处理请求,而是将请求委托给RequestProcessor全权处理;

2.RequestProcessor:(项目总监)
由Struts框架提供的一个类,用来接受ActionServlet转发过来的请求并处理请求,它会根据struts.xml中的配置调用不同的Action去全权处理客户端不同的请求;

3.Action:(程序员)
由Struts框架提供的一个类,它的功能和Servlet一样作为控制器来控制和转发请求,由它去调用模型层中的业务接口方法,并根据不同的结果选择不同的jsp视图显示; 注:我们用户需要自己写一个类继承Action(跟写Servlet一样)。

struts1应用的生命周期中RequestProcessor只保证一个Action实例,所有的客户请求都共享这个实例.所有请求可以同时执行它的 excute()方法。RequestProcessor类包含一个HashMap,作为存放所有Action实例的缓存。每个Action实例在缓存中 存放的key为Action类名。在RequestProcessor类的processActionCreate()方法中,首先检查在HashMap 中是否存在Action实例,如果有直接使用,否则创建一个新的。创建Action实例的代码位于同步代码块中,以保证只有一个线程创建Action实 例,然后放在HashMap中。供其他线程使用。 

2)模型层中的ActionForm:由struts框架提供的一个类
作用:
a.封装提交表单中的字段信息
b.对提交表单中的字段信息进行验证(服务器端验证)
c.可以对表单中的字段信息重新赋值

3)ActionMapping
继承自ActionConfig。ActionMapping的作用

4)ActionForward
ActionForword继承自ForwardConfig,它实际上是用来封装视图路径和转发请求方式的一个对象,目的是控制器将 Action 类的处理结果转发至目的地。这个对象可以有两种创建方式: 
//第一种返回页面的方法 
return new ActionForward("/basic/error.jsp"); 
//第二种返回页面的方法--一般采用此方法 
return mapping.findForward("error"); 

5)ActionMessages和ActionErrors
ActionMessages和ActionErrors的详细介绍

参考链接:

1.Strus执行流程1.http://blog.chinaunix.net/uid-22627501-id-3017695.html;

2.Strus执行流程2.http://blog.chinaunix.net/uid-22627501-id-3017733.html;

3.lige239141,原文链接.http://pengshao.iteye.com/blog/635724

0 0
原创粉丝点击