标签:and 注意 parameter sig param blog finally 区别 数据绑定
明确:动作类是多例的,每次动作访问,动作类都会实例化。所以是线程安全的。与Struts1的区别是,struts1的动作类是单例的。
问题:
每次请求时,都会产生一些请求数据,这些数据存放到哪里去了?
明确:
在每次动作执行前,核心控制器StrutsPrepareAndExecuteFilter都会创建一个ActionContext和ValueStack对象。且每次动作访问都会创建。
这两个对象存储了整个动作访问期间用到的数据。并且把数据绑定到了线程局部变量(ThreadLocal)上了。所以是线程安全的。
struts2的核心控制器的 doFilter 方法
1 public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { 2 3 HttpServletRequest request = (HttpServletRequest) req; 4 HttpServletResponse response = (HttpServletResponse) res; 5 6 try { 7 prepare.setEncodingAndLocale(request, response); 8 prepare.createActionContext(request, response); 9 prepare.assignDispatcherToThread(); 10 if (excludedPatterns != null && prepare.isUrlExcluded(request, excludedPatterns)) { 11 chain.doFilter(request, response); 12 } else { 13 request = prepare.wrapRequest(request); 14 ActionMapping mapping = prepare.findActionMapping(request, response, true); 15 if (mapping == null) { 16 boolean handled = execute.executeStaticResourceRequest(request, response); 17 if (!handled) { 18 chain.doFilter(request, response); 19 } 20 } else { 21 execute.executeAction(request, response, mapping); 22 } 23 } 24 } finally { 25 prepare.cleanupRequest(request); 26 } 27 }
ActionContext 的部分代码
1 public class ActionContext implements Serializable { 2 3 static ThreadLocal<ActionContext> actionContext = new ThreadLocal<ActionContext>(); 4 5 /** 6 * Constant for the name of the action being executed. 7 */ 8 public static final String ACTION_NAME = "com.opensymphony.xwork2.ActionContext.name"; 9 10 /** 11 * Constant for the {@link com.opensymphony.xwork2.util.ValueStack OGNL value stack}. 12 */ 13 public static final String VALUE_STACK = ValueStack.VALUE_STACK; 14 15 /** 16 * Constant for the action‘s session. 17 */ 18 public static final String SESSION = "com.opensymphony.xwork2.ActionContext.session";
Struts2的官方文档对contextMap的说明:
contextMap中存放的主要内容 |
||
Key |
Value |
说明 |
value stack (root) |
java.util.List |
没有root这个key。它是一个list。 |
application |
java.util.Map<String,Object> |
ServletContext中的所有属性。 |
session |
java.util.Map<String,Object> |
HttpSession中的所有属性。 |
request |
java.util.Map<String,Object> |
ServletRequest中的所有属性。 |
parameters |
java.util.Map |
参数 |
attr |
java.util.Map |
把页面、请求、会话、应用范围内的所有属性放到一起。 |
注意:
除了value stack之外,全是map,而contextMap也是一个map。其实就是Map中又封装的Map。(很像dbutils中KeyedHandler封装数据的结构,只是封装数据的结构)
查看contextMap中的数据:
在页面上使用<s:debug/>
标签:and 注意 parameter sig param blog finally 区别 数据绑定
原文地址:http://www.cnblogs.com/soficircle/p/7062266.html