Struts2学习笔记③
今天把这两天看书体会的Struts的运行原理记录一下:其实Struts官方提供了一张图可以视为景点,几乎每一个将Struts的课程都会使用:
上面的图里面的struts核心过滤器已经更换为StrutsPreparedAndExecuteFilter了,使用的时候要注意,虽然长但是也很好记住的。上面的图把Struts实现原理已经讲得跟清楚了,我看的书上有的图也非常好在这里也贴出来:
其实这幅图是上面的图的简化加延伸,延伸了Model部分。
上面的概念都比较好理解,再把Struts的部分简化后就像下面一样:
在Struts中还有一个概念非常重要用的也很多:
ActionContext 这就相当于每个Action的一个内存数据库,在这里存放着每一个Action的数据,包括了Session、请求参数、请求属性等等,所有的数据都放在了这里。如果以后需要对Action中的属性进行赋值,调用ActionContext就行了。
下面是转来的文字 觉得还不错
ActionContext都是用来存放数据的。Struts2本身会在其中放入不少数据,而使用者也可以放入自己想要的数据。ActionContext本身的数据结构是映射结构,即一个Map,用key来映射value。所以使用者完全可以像使用Map一样来使用它,或者直接使用Action.getContextMap()方法来对Map进行操作。
Struts2本身在其中放入的数据有ActionInvocation、application(即ServletContext)、conversionErrors、Locale、action的name、request的参数、HTTP的Session以及值栈等。完整的列表请参考它的Javadoc(本文附录有对它包含内容的讨论)。
由于ActionContext的线程唯一和静态方法就能获得的特性,使得在非Action类中可以直接获得它,而不需要等待Action传入或注入。需要注意的是,它仅在由于request而创建的线程中有效(因为request时才创建对应的ActionContext),而在服务器启动的线程中(比如fliter的init方法)无效。由于在非Action类中访问其的方便性,ActionContext也可以用来在非Action类中向JSP传递数据(因为JSP也能很方便的访问它)。
ValueStack与ActionContext的联系和区别:
相同点:它们都是在一次HTTP请求的范围内使用的,即它们的生命周期都是一次请求。
不同点:值栈是栈的结构,ActionContext是映射(Map)的结构。