`
smiky
  • 浏览: 257773 次
  • 性别: Icon_minigender_1
  • 来自: 天门
社区版块
存档分类
最新评论

struts的执行流程

阅读更多
ActionServlet在系统启动时加载(load-on-startup=1)
struts加载流程:
一.加载内部资源文件
initInternal(),org.apache.struts.action下面的
ActionResources开头的两个文件

二.加载配置文件路径及处理向后兼容
initOther()获取config参数指定的要加载的配置文件的名称(多个之间用逗号分开),系统默认给定的
config值为/WEB-INF/struts-config.xml,如果获取的config不为空则用这个值代替系统值
并处理向后兼容的问题
三.加载ActionServlet的相关信息
initServlet()从web.xml中获取Action-servlet的配置信息(name,url-pattern等),它在解析的时候会调
用addServletMapping()将url-pattern的值传给servletMapping并将servletMapping放入servletContext
中(将/*.do放入了servletContext)

四.struts配置文件的初始化
1.ModuleConfig moduleConfig = initModuleConfig("", config);用于初始化ModuleConfig,它代理了一个
struts配置文件的内容(初始化完成后会以这个字名org.apache.struts.action.MODULE+prefix放入sevletContext
之中),默认配置文件是没有前缀的,多模块开发的时候才有,就是web.xml中的config/prefix后面这个prefix)
initModuleConfig(String prefix, String paths)方法中的config会按逗号分割成多个配置文件路径,并解析到一个ModuleConfig中
2.获取ModuleConfig对象
ModuleConfigFactory factoryObject = ModuleConfigFactory.createFactory();
ModuleConfig config = factoryObject.createModuleConfig(prefix);
这两句话是创造一个ModuleConfig的实例,工厂比较简单,直接new了一个ModuleConfigImpl的对象并返回
ModuleConfigImpl里面可值得一看了,它里面有整个struts配置文件所具有的各种配置信息(如datasource,formbean等),它定义了
大量的hashmap来存放这些配置信息对应的对象(如actionConfigs用于存放actionmapping对象信息),可以把它看成一个容器
3.解析struts配置信息,并将产生的相关配置对象放入moduleconfig对象之中
Digester digester = initConfigDigester();这句是用来解析struts配置文件所用
initConfigDigester()中configDigester.addRuleSet(new ConfigRuleSet());为解析配置规则
进去ConfigRuleSet类中,下面是类中的一段注释
*These rules assume that an instance of
* <code>org.apache.struts.config.ModuleConfig</code> is pushed
* onto the evaluation stack before parsing begins.
我对Digester不是太懂,我这里是这样猜想的(应该没有错)digester在解析时,可以调用一个压入
stack的对象的方法(如解析了datasoure,那么要将这个对象添加到相应的ModuleConfigImpl对象之中),
如下,在解析datasource的时候就有这样一句(其它所有的都有类似的)
digester.addSetNext
            ("struts-config/data-sources/data-source",
             "addDataSourceConfig",//ModuleConfigImpl有一个addDataSourceConfig方法,用于添加DataSourceConfig对象
             "org.apache.struts.config.DataSourceConfig");
添加完规则后就回到initModuleConfig()方法中去,解析开始:
将config对应的路径进行处理,如果有多个文件就一个一个解析(看来它把这多个文件是当成一个模块来处理的),
解析完成后将moduleConfig对象放入sevletContext
五.加载国际化文件
initModuleMessageResources(moduleConfig)
首先取出所有的MessageResourcesConfig对象MessageResourcesConfig mrcs[] = config.findMessageResourcesConfigs();
先建一个工厂对象(org.apache.struts.util.PropertyMessageResourcesFactory),然后取出MessageResourcesConfig对象中
的parameter值,它不正是那个路径么,从而new一个PropertyMessageResources的对象,实际上起作用的只有路径
PropertyMessageResources有个getMessage方法,当调用它时,它会调用loadLocale方法,它首先判断这个key找不找得到,
找不到的话它会加载指定路径的资源文件(它首先对路径进行处理将.换成/,也就是说com.abc.zengge将会加载com/abc/zengge_*.properties),
并将相应的信息放入messages这个hashmap,说明资源文件是在第一次访问时才真正的加载起来

六.初始化数据源
initModuleDataSources(),从moduleconfig中取出所有的DataSourceConfig对象,根据里面的类型信息,用户,密码等产生出
一个datasource对象(这些信息存在一个hashmap中,用BeanUtils直接将值给弄进datasource对象)

七.初始化plugin
initModulePlugIns(),(以ValidatorResources为例)根据className定义的类实例化一个Plugin对象,
并将hashmap中的值全弄进plugin,接着调用init方法,init方法默认取出property名字为pathnames的值,
并将值按逗号进行分割,并加载分割后的路径的文件,一个文件对应一个ValidatorResources

一个ModuleConfig加载完成,调用其freeze(),防止己加载的配置信息被修改(比如ActoinConfig对应path为path1,
加载后你就不能想改为path2)

加载完默认或web.xml中指定的配置文件后就得加载分模块的配置文件了,以config/*命名的参数的值,过程同上(四到七步),
先moduleconfig,再datasource,messageresource,plugin

所有的配置文件加载完成后,将用到的前缀放进servletcontext中


请求的执行流程:
一.获取RequestProcessor对象,struts将所有的请求委托给它处理(像用spring管理action的DelegatingRequestProcessor就是它的子类)
,接着调用它的init方法(将action清空,action是放在它的hashmap中的,action是实例化一次)

二.doGet或doPost调用RequestProcessor类的process(request,response)方法
2.1 processLocale(request, response)方法将locale信息存入session
2.2 processContent(request, response)有contentType就设置它response.setContentType()
     processNoCache(request, response)有nocache就在头里面设置它response.setHeader("Pragma", "No-cache")等
2.3 processCachedMessages(request, response)去除session中的ActionMessages
session.removeAttribute(Globals.ERROR_KEY);
session.removeAttribute(Globals.MESSAGE_KEY);
2.4处理ActionMapping啦
    processMapping(request, response, path)中的
ActionMapping mapping = (ActionMapping)
            moduleConfig.findActionConfig(path);根据请求path得到mapping对象
ModuleConfigImpl(moduleConfig)对象里面有大量的hashmap,看看下面这些名字
actionConfigs,dataSources,exceptions,formBeans,forwards,messageResources,plugIns
及一个list:actionConfigList(ActionConfig是ActionMapping的父类)
对于actionConfig的map与list意义好像是一样的啊
如果得到的mapping为空,那么去取unknown为true的action(默认action),如果没定义,就准备
接错误信息吧

2.5到了ActionForm了哦
    ActionForm form = processActionForm(request, response, mapping);
    processPopulate(request, response, form, mapping);

a.processActionForm方法最精华的一句
ActionForm instance = RequestUtils.createActionForm
            (request, mapping, moduleConfig, servlet);
//得到action的name属性(不就是form的名字吗),那个有好多hashmap的对象得去找对应的Form了哦
String name = mapping.getName();
    FormBeanConfig config = moduleConfig.findFormBeanConfig(name);
FormBeanConfig有一个hashmap叫作formProperties,估计它用来记录actionform的属性
这是原话(A JavaBean representing the configuration information of a actionform)
上面的理解有误啦formProperties:The set of FormProperty elements defining dynamic form properties for
     * this form bean, keyed by property name.
仔细一看FormBeanConfig里面常用的属性都有对应的方法了,看来这个hashmap是对应于这种东东的LazyValidatorForm

这句话就更得注意了:ActionForm instance = lookupActionForm(request, attribute, mapping.getScope());
String attribute = mapping.getAttribute()首先取出这个form对应的存在request或session中的名字,这里要注意一下的
就是在mapping.getAttribute()中当没有定义attribute时默认返回的是name的值
接着从scope定义的范围中取出actionForm,如果没取到就调用createActionForm方法,它会用反射机制来为产生一个form对象,
接着就将产生的form放到request或者是session中

b.processPopulate年名字就知道要给actionform填值啦
form.reset(mapping, request);执行reset方法
接着就要往form填值了
RequestUtils.populate(form, mapping.getPrefix(), mapping.getSuffix(),
                              request);
这个方法首先判断是否为文件上传请求,如果不是则将请求的参数与值放到一个hashmap之中去,
这个相信大家都会明白的BeanUtils.populate(bean, properties),所以这个时候form的set方法会被调用

接下来就执行form的validate方法,成功就往下进行
processValidate(request, response, form, mapping)

2.6 属性forward
如果从mapping中能找到forward(这对应action中的forward属性,而不是forward的元素),就直接跳转了
processForward(request, response, mapping)

2.7 include页面
processInclude(request, response, mapping)取得到include的话就包含页面,并停止向下执行

2.8 action
Action action = processActionCreate(request, response, mapping);建一个相应的action对象,首先从
hashmap中找,找不到才新建(在spring管理时,直接用WebApplicationContext去getBean)

ActionForward forward =
            processActionPerform(request, response,action, form, mapping);这句话会执行
大家平时override父Action的execute方法

processForwardConfig(request, response, forward);处理跳转,forward中是包含有路径信息的哦,
取出来就可以转发了或跳转了


DispatchAction的可取之处:
String parameter = getParameter(mapping, form, request, response);取出mapping中的parameter的值
String name = getMethodName(mapping, form, request, response, parameter);的实质是request.getParameter(parameter)根据parameter的值取出方法名

有了方法名就可以用反射取出Method对象并执行了,在这里struts做的更好了,它定义了一个methods的hashmap,
key为methodname,value为Method对象,它首先会根据方法名去找有没有这个Method的对象,如果有就直接用,否则就
class.getMethod(name,type)获取Method对象并将它们放过hashmap,也就是说所有的Method对象只建一次就OK了
分享到:
评论

相关推荐

    Struts程序的执行流程.pdf

    在了解Struts程序的执行流程之前,我们需要首先理解几个核心概念: 1. ActionServlet:是Struts框架中的控制器,负责接收用户请求,调用Action的execute()方法处理请求,并根据返回的ActionForward对象进行页面跳转...

    超详细struts2执行流程图

    这张流程图 深刻的描述了 struts2的执行流程 帮助了解Struts2

    struts工作流程.doc

    在上述的描述中,我们了解了Struts工作流程的关键步骤: 1. **客户端请求**:当用户在浏览器中输入一个以`.do`结尾的URL(例如http://localhost:8080/helloapp/Hello.do)时,这个请求会被Web服务器捕获并传递给...

    struts2工作流程

    在深入探讨Struts2的工作流程之前,我们先了解一下MVC模式的基本概念。MVC模式将应用逻辑分隔为三个部分:模型(Model)处理业务逻辑,视图(View)负责展示数据,控制器(Controller)协调用户输入和模型间的交互。...

    Struts2执行流程 面试常问到

    面试中经常询问Struts2的执行流程,因为理解这一流程有助于开发者深入掌握其工作原理,从而更好地设计和调试应用。以下是Struts2执行流程的详细解析: 1. **Web.xml部署描述符**: 在Struts2应用启动时,Web容器...

    struts2流程与流程图

     一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果result。 Struts 2的核心控制器是FilterDispatcher,有3个重要的方法:destroy()、doFilter()和Init(),可以在Struts 2的下载...

    Struts工作流程

    以下是Struts工作流程的详细说明: 1. **模型(Model)**: 模型层主要负责应用程序的状态管理和业务逻辑处理。在Struts框架中,模型通常由JavaBean或Enterprise JavaBeans(EJB)来实现。JavaBean是简单的Java类...

    struts执行原理

    Struts 1.2 的执行流程主要包括以下五个关键步骤: 1. **客户端请求**:客户端(通常是浏览器)发送 HTTP 请求至服务器端。该请求通常指向一个特定的 URL,例如 `*.do`。 2. **ActionServlet 接收请求**:服务器端...

    Struts 原理 流程图

    ### Struts工作流程 1. **初始化阶段**: Web应用启动时,容器加载struts相关的jar包,并在web.xml中配置ActionServlet,使其监听特定的URL模式。 2. **请求接收**: 客户端通过HTTP请求访问应用,如`Login.do`。这...

    Struts2的执行流程图

    以下是Struts2与Struts1.2在关键点上的对比和Struts2的执行流程概述: 1. **Action类的设计**: - 在Struts1中,Action类需要继承自抽象基类,这导致了面向抽象类编程而非接口编程,限制了灵活性。 - Struts2则...

    struts1的工作流程

    综上所述,Struts1的工作流程主要包括用户请求的接收、请求的解析、ActionForm的创建与验证、Action的执行以及结果的呈现。这一流程清晰地展示了Struts1如何实现MVC设计模式,帮助开发者更好地组织代码结构,提高...

    struts的执行的核心流程时序图

    struts的执行的核心流程时序图

    Struts2工作流程

    在深入理解Struts2的工作流程之前,我们需要先了解一些基本概念。 1. **MVC模式**: MVC模式将应用程序分为三个主要组件:模型(Model)、视图(View)和控制器(Controller)。模型负责业务逻辑,视图负责显示...

    struts详细流程图

    在这个"struts详细流程图"中,我们可以看到Struts框架的工作原理和各个组件之间的交互过程。 首先,让我们从基础开始。在传统的Web应用中,用户发送请求到服务器,服务器处理请求并返回响应。Struts框架引入了一个...

    struts运行流程图

    对于初学者来说,理解Struts的运行流程至关重要。 在Struts框架中,一个典型的请求处理流程可以分为以下步骤: 1. **用户请求**:当用户通过浏览器发起一个HTTP请求,比如访问`HelloWorld.do`,这个请求首先会被...

    Struts2的工作流程及配置文件

    ### Struts2的工作流程及配置文件详解 #### 一、Struts2简介 Struts2是基于MVC设计模式的Java Web开发框架之一,它继承了Struts1的优点,并在此基础上进行了大量的改进和扩展。Struts2框架的核心是拦截器...

    Struts2运行流程测试

    `ActionInvocation`对象是执行流程的核心,它会按照配置的顺序执行拦截器、Action和Result。 在单元测试中,Struts2提供了一个名为`StrutsTestCase`的基类,允许开发者直接通过URL获取`ActionProxy`。这样,我们就...

    Java面试题48.struts2的执行流程或者struts2的原理.mp4

    Java面试题48.struts2的执行流程或者struts2的原理.mp4

Global site tag (gtag.js) - Google Analytics