Struts2 ActionContext and ValueStack?



我的问题是:

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

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

  1. 请考虑以下方案:

操作1------1st req------->view.jsp------2nd req--------->action2.

因此,当请求 action1 时,

将创建一个新的 action1 对象以及相应的 ActionContext 和 ValueStack。

从视图中.jsp(单击超链接后)新请求将执行操作2。

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

  1. 假设我在视图中的ActionContext(操作1)中存储了一些东西.jsp然后单击操作2的超链接(从view.jsp),该数据以及(操作1的)的ActionContext会丢失吗?
  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.是的,如果您希望该数据在下一个操作中使用链(不建议)。

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

问题 2.

这是否意味着以前的ActionContext和ValueStack(与 action1)被销毁,一个新的ActionContext和ValueStack(用于 行动2)被创建?

不。

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

最新更新