说在前面
1.动作类的生命周期:
明确:动作类是多例的,每次动作访问,动作类都会实例化。所以是线程安全的。与Struts1的区别是,struts1的动作类是单例的。
2.请求动作的数据存放
问题:
每次请求时,都会产生一些请求数据,这些数据存放到哪里去了?
明确:
在每次动作执行前,核心控制器StrutsPrepareAndExecuteFilter都会创建一个ActionContext和ValueStack对象。且每次动作访问都会创建。
这两个对象存储了整个动作访问期间用到的数据。并且把数据绑定到了线程局部变量(ThreadLocal)上了。所以是线程安全的。
3.contextMap:存储数据
Struts2的官方文档对contextMap的说明:
contextMap中存放的主要内容
Key | Value | 说明 |
---|---|---|
value stack (root) | java.util.List | 没有root这个key。它是一个list。 |
application | java.util.Map<,> | ServletContext中的所有属性。 |
session | java.util.Map<,> | HttpSession中的所有属性。 |
request | java.util.Map<,> | ServletRequest中的所有属性。 |
parameters | java.util.Map | 参数 |
attr | ava.util.Map | 把页面、请求、会话、应用范围内所有属性放一起 |
注意:
除了value stack之外,全是map,而contextMap也是一个map。其实就是Map中又封装的Map。(很像dbutils中KeyedHandler封装数据的结构,只是封装数据的结构)
查看contextMap中的数据:在页面上使用
<s:debug/>
测试存入数据:
进入正题:用ActionContext存数据
注:需要熟悉ActionContext的API,框架为我们存数据。
1.存数据:利用ActionContext存数据
2.取数据:用Struts2的标签(OGNL表达式)在JSP上(用的最多)
使用s:property取数据, 取ActionContext中的数据,需使用#