Struts工作流程

    本文对于Struts的基本工作原理MVC模式不进行具体的讨论,仅针对container启动之后,struts框架中所发生的一些"事情"进行讨论。

    通常我们在配置Struts框架的时候,所使用的Controller都是默认的org/apache/struts/action/ActionServlet,它继承自javax.servlet.http.HttpServlet,因此具有一般servlet的所有特征,必须在web.xml中对其进行注册。当我们的container第一次启动的时候(这个说法不是很准确,或者是ActionServlet第一次被请求调用得时候),会自动加载ActionServlet,同时调用其中的init()方法。在init()方法中将发生如下动作:

    1.initInternal():初始化框架的内部消息绑定,这些消息用来输出提示,警告,和错误信息到日志文件中,主要操作是internal = MessageResources.getMessageResources(internalName);其中internalMessageResources的一个实例。

    2.initOther():加载web.xml中定义的不同参数,如config,用以控制ActionServlet的不

同行为,主要是读取<init-param></init-param>中所定义的参数。

    3.initServlet():加载并初始化web.xml文件所定义的servlet名称和servlet映射信息

    4.initModuleConfigFactory()ModuleConfig moduleConfig = initModuleConfig("",

config):加载并初始化struts-config.xml配置文件,默认配置文件被解析,产生一个

ModuleConfig对象于ServletContext  

5.initModuleMessageResources(moduleConfig):struts-config.xml配置文件中指定的每一个消息资源都被加载,初始化    

6.initModuleDataSources(moduleConfig):struts-config.xml配置文件中声明的每一个数据源被加载并且初始化,如果没有配置数据源,这一步跳过。           

    7.initModulePlugIns(moduleConfig):加载并初始化struts-config.xml配置文件中指定的插件。每一个插件的init()方法被调用。

    8.当默认应用加载完成,init()方法判断是否有应用模块需要加载,如果有,重复步骤47完成应用模块的加载。

    然后,在应用程序的运行过程中,当有用户发出请求的时候(当然这个请求必须得映射到ActionServlet上面去)ActionServlet就会收到这个请求,此时它的doPost或者doGet方法就会自动的被调用,这是servlet的内部机制。至于究竟是哪个方法会被调用取决于所请求的方法的类型,即html表单中的method属性。但是,不管是哪个方法会被调用ActionServlet中的process(HttpServletRequest request, HttpServletResponse response)方法都会被调用。ActionServlet中的process方法的主要作用就是得到一个相应的RequestProcessor类或者其子类的对象,然后调用这个它的process(HttpServletRequest request, HttpServletResponse response)方法来处理用户的需求。

    现在ActionServlet就已经完成了它的使命,剩下的任务就由RequestProcessor来完成了,RequestProcessor中将主要执行如下操作:

    1.processMultipart(request):对用户的请求进行预处理,如果HttpServletRequestPOST方式,且请求为multipart/form-data Struts框架将请求对象包装成处理multipart请求专用的请求对象,否则,只是简单地返回原有的请求对象。一般来说,除非需要处理文件上传,否则不用关心multipart 功能的具体细节。进行包装处理的类是MultipartRequestWrapper类,                                它以用户的请求为包装对象。

    2.processPath(request, response):该方法用来从请求URL中获应用取路径部分,获取到的信息在稍后的步骤中用于选择合适的Struts Action调用,与action标签的path属性相对应。

    3.processLocale(request, response):处理一些国际化的事务。

    4.processContent(request, response):设置响应体的编码方式,response.setContentType(contentType)

    5.processNoCache(request, response):根据noCache属性的设置调用processNoCache( ) 方法,如果noCache设置为true.则添加合适的响应头到响应对象中,使得页面保留在浏览器的Cache中。这些响应头包含Pragma, Cache-Control, Expires

    6.processPreprocess(request, response):该方法只是简单的返回一个true,它是以如下方式调用的:if(!processPreprocess(request, response)) return;因此我们可以在processPreprocess方法中进行一点的预处理,如果用户的请求不符合要求的话,我们就让它返回一个false值,这样的话action就不会调用。

    7.processMapping(request, response, path):利用前面所获取的path值,在struts-config.xml中寻找对应的action。即根据pathactionmappings标签中寻找其对应的action,如果找不到则返回一个error

    8.processRoles(request, response, mapping):可忽略,一般没啥用处。

    9.processActionForm(request, response, mapping):第一步,查看是否存在着为这个ActionMapping配置得ActionForm,具体的查看流程如下:1.action元素的attribute是否为null,如果为null,则返回null;2.如果attribute属性不为null则取得它的 name属性,然后根据name的值在<form-beans></form-beans>中寻找相应的ActionForm,也是通过name属性来配对的,如果找不到的话,则会产生错误日志,并且返回null。第二步,如果存在这样的ActionForm,我们就根据上面的attribute的值,在作用域查看是否存在着这样的ActionForm的实例,如果存 在则复用之,并把它作为返回值,否则的话,就重新创建这个ActionForm的一个实例,并且返回它,最后这个实例将会保存在相应的作用域中

10.processPopulate(request, response, form, mapping):如果存在为ActionMapping

置的ActionForm,则封装请求对象中的数据到ActionForm 中,在进行封装之前,先调用ActionForm reset( )方法进行属性值的默认化。

11.processValidate(request, response, form, mapping):如果ActionForm被配置好,并且Action元素的属性validate被设置为true ,则进一步调用validate( )方法进行规则校  验。如果validate()方法校验失败,就会保存一个ActionErrors 对象到请求区域中,请求将会自动重定向到action映射的input属性所指定的页面中。如果校验通过或在action映射中没有配置ActionForm,则继续处理请求。

    12.processForward(request, response, mapping)&processInclude(request, response, mapping):根据action 映射是否配置了forward属性或include属性来决定下一步操作。如果配置了任意一个,则相应地调用RequestDispatcher对象的forward( )方法或include( )方法,调用后,对客户请求的处理结束。否则,继续处理请求。

    13.processActionCreate(request, response, mapping):创建或获取一个Action对象实例处理请求。processActionCreate( )方法会在缓存中查找是否存在已经创 建好的Action实例,如果存在,则复用,否则,则重新创建并将其存于缓存中。如果该方法返回null,则请求处理结束(注:根据action映射得type属性来寻找对应得Action)

    14.processActionPerform(request, response, action, form, mapping):调用action 实例的execute( )方法。

  15.processForwardConfig(request, response, forward):传入actionexecute( )方法所返回的ActionForward对象实例,方法通过检查ActionForward对象实例,决定用 redirectforword方式进行重定向。究竟采用redirect还是forword取决于forward元素的redirect属性值。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值