我的问题是:
- 在 Struts2 中,每个动作对象都有自己对应的 ActionContext 和 ValueStack?
换句话说,对于每个新请求,都会创建一个新的操作对象。这是否意味着每次创建新的操作对象时,也会创建新的 ActionContext 和 ValueStack?
- 请考虑以下方案:
操作1------1st req------->view.jsp------2nd req--------->action2.
因此,当请求 action1 时,将创建一个新的 action1 对象以及相应的 ActionContext 和 ValueStack。
从视图中.jsp(单击超链接后)新请求将执行操作2。
这是否意味着以前的 ActionContext 和 ValueStack(与 action1 相关)被销毁,而新的 ActionContext 和 ValueStack(用于 action2)被创建?
- 假设我在视图中的ActionContext(操作1)中存储了一些东西.jsp然后单击操作2的超链接(从view.jsp),该数据以及(操作1的)的ActionContext会丢失吗?
- 是的
-
是的,操作执行清理完成后将完成。
//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); }
3.是的,如果您希望该数据在下一个操作中使用链(不建议)。
Q1。有一个 ActionContext,只有一个 ValueStack。
问题 2.
这是否意味着以前的ActionContext和ValueStack(与 action1)被销毁,一个新的ActionContext和ValueStack(用于 行动2)被创建?
不。
问题 3.我不明白这个问题。我认为缺少的是ThreadLocal的意识,因此尽管有一个ActionContext,但每个线程都能够拥有自己的变量,这些变量是该线程的本地变量,因此ValueStack的操作范围以这种方式维护。