我的问题是:
- 在Struts2中,确实每一个动作的对象有自己的相应ActionContext中和值栈?
换句话说,对于每一个新的请求创建一个新的操作对象。 这是否意味着每创建一个新的操作对象时,一个新的ActionContext中和值栈还获得创建?
- 考虑以下情形:
措施1 ------ 1 REQ -------> view.jsp的------第二届REQ ---------> 1动作。
所以,当一个请求到来的动作1的动作1的新对象和相应的ActionContext中和值栈将得到建立。
从view.jsp的(在单击超链接)一个新的请求也适用于1动作。
这是否意味着以前ActionContext中和值栈(涉及到动作1)被破坏,新的ActionContext中和值栈(用于动作2)被创建?
- 假设我存储在view.jsp的在ActionContext中(的动作1)的东西,然后单击超链接动作2(从view.jsp的),将与ActionContext中(的动作1)沿着数据丢失?
- 是
是动作执行清理后会做。
//SourceCode from StrutsPrepareAndExecuteFilter. //Cleans up a request of thread locals public void cleanupRequest(HttpServletRequest request) { Integer counterVal = (Integer) request.getAttribute(CLEANUP_RECURSION_COUNTER); if (counterVal != null) { counterVal -= 1; request.setAttribute(CLEANUP_RECURSION_COUNTER, counterVal); if (counterVal > 0 ) { if (log.isDebugEnabled()) { log.debug("skipping cleanup counter="+counterVal); } return; } } // always clean up the thread request, even if an action hasn't been executed ActionContext.setContext(null); Dispatcher.setInstance(null); }
。是的,如果你想在未来的操作使用链可用的数据(不耳根)。
Q1。 有一个ActionContext中,并且只有一个ValueStack中。
Q2。
这是否意味着以前ActionContext中和值栈(涉及到动作1)被破坏,新的ActionContext中和值栈(用于动作2)被创建?
没有。
Q3。 我不明白这个问题。 我觉得缺少的是意识的ThreadLocal所以虽然是一个ActionContext中每个线程都能够有自己的变量,是当地为ValueStack的线程,因而行动范围保持这种方式。