3

私の質問は次のとおりです。

  1. Struts2 では、すべてのアクション オブジェクトに対応する独自の ActionContext と ValueStack がありますか?

つまり、新しいリクエストごとに新しいアクション オブジェクトが作成されます。これは、新しいアクション オブジェクトが作成されるたびに、新しい ActionContext と ValueStack も作成されるということですか?

  1. 次のシナリオを検討してください。

Action1------1 つ目の要件------->view.jsp------2 つ目の要件--------->action2.

そのため、action1 に対するリクエストが来ると、action1 の新しいオブジェクトと、対応する ActionContext および ValueStack が作成されます。

(ハイパーリンクをクリックすると) view.jsp から新しい要求が action2 に送られます。

これは、以前の ActionContext と ValueStack (action1 に関連) が破棄され、新しい ActionContext と ValueStack (action2 用) が作成されるということですか?

  1. view.jsp の (action1 の) ActionContext に何かを保存し、(view.jsp からの) action2 のハイパーリンクをクリックすると、そのデータは (action1 の) ActionContext とともに失われますか?
4

2 に答える 2

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 に答える
1

Q1. ActionContext は 1 つ、ValueStack は 1 つだけです。

Q2.

これは、以前の ActionContext と ValueStack (action1 に関連) が破棄され、新しい ActionContext と ValueStack (action2 用) が作成されるということですか?

いいえ。

Q3. この質問がわかりません。欠けていると思うのはThreadLocalの認識です。1 つの ActionContext がありますが、各スレッドはそのスレッドに対してローカルな独自の変数を持つことができるため、ValueStack のアクション スコープはこのように維持されます。

于 2012-04-24T10:53:59.477 に答える