3

我的问题是:

  1. 在Struts2中,是不是每个动作对象都有自己对应的ActionContext和ValueStack?

换句话说,对于每个新请求,都会创建一个新的操作对象。这是否意味着每次创建一个新的动作对象时,也会创建一个新的 ActionContext 和 ValueStack ?

  1. 考虑这种情况:

Action1------1st req----->view.jsp------2nd req--------->action2。

因此,当对 action1 的请求到来时,将创建 action1 的新对象以及相应的 ActionContext 和 ValueStack。

从 view.jsp(点击超链接)一个新的请求去 action2。

这是否意味着先前的 ActionContext 和 ValueStack(与 action1 相关)被销毁,而新的 ActionContext 和 ValueStack(与 action2 相关)被创建?

  1. 假设我在 view.jsp 中的 ActionContext(action1)中存储了一些东西,然后单击 action2(来自 view.jsp)的超链接,这些数据会与 ActionContext(action1)一起丢失吗?
4

2 回答 2

1

Q1。有一个 ActionContext,只有一个 ValueStack。

Q2。

这是否意味着先前的 ActionContext 和 ValueStack(与 action1 相关)被销毁,而新的 ActionContext 和 ValueStack(与 action2 相关)被创建?

不。

Q3。我不明白这个问题。我认为缺少的是对ThreadLocal的认识,因此尽管有一个 ActionContext 每个线程都能够拥有自己的变量,这些变量是该线程的本地变量,因此 ValueStack 的操作范围以这种方式保持。

于 2012-04-24T10:53:59.477 回答
1
  1. 是的
  2. 是的,在操作执行后清理将完成。

    //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.是的,如果您希望该数据在下一个动作使用链中可用(不建议使用)。

于 2012-04-24T11:00:48.500 回答