「Interceptorでアクションクラスを知るには」の版間の差分

提供: tknotebook
移動: 案内検索
(チェック)
 
6行: 6行:
 
知る必要がある場合があります。
 
知る必要がある場合があります。
  
例えば未ログインの場合、アクションを実行せず強制的にログイン画面へ飛ばす、ログインチェックインターセプターを書く場合、
+
例えば未ログインの場合、アクションを実行せず強制的にログイン画面へ飛ばす、ログインチェックインターセプターを書くとしましょう。
ログイン画面のログインアクションの処理では、ログインチェックは無意味で、インターセプタは未ログインでもアクションを呼び出す必要が有ります。
+
 
 +
ログイン画面のログインアクションの処理では、ログインチェックは無意味なので、ログインチェックインターセプタは未ログインでもアクションを呼び出す必要が有ります。
  
 
その処理をコードにすると下記のような具合になります。
 
その処理をコードにすると下記のような具合になります。
23行: 24行:
 
         // 未ログインの場合
 
         // 未ログインの場合
 
         if (invocation.getAction().getClass().equals(Login.class)) {
 
         if (invocation.getAction().getClass().equals(Login.class)) {
             // ログイン画面のアクションなら次のインターセプター(アクション)へ
+
             // ログイン画面のアクションなら次のインターセプター(orアクション)へ
 
             return invocation.invoke();
 
             return invocation.invoke();
 
         } else {
 
         } else {
             // ログイン画面のアクションでなければ、アクションはスキップしてログイン画面へ
+
             // ログイン画面のアクションでなければ、アクションはスキップしてログイン画面の表示を促す文字列を返す
 
             return "login";
 
             return "login";
 
         }
 
         }
 
         return "login";
 
         return "login";
 
     } else {
 
     } else {
         // ログイン中ならアクションを呼び出す。
+
         // ログイン中なら次のインターセプター(orアクション)を呼び出す。
 
         return invocation.invoke();
 
         return invocation.invoke();
 
     }
 
     }
 
  }
 
  }

2017年1月17日 (火) 03:39時点における最新版

メインページ>コンピュータの部屋#Java>Struts2 Tips


インターセプターで処理を書く際、インターセプターで処理後、どのアクションクラスでアクションが処理されるか 知る必要がある場合があります。

例えば未ログインの場合、アクションを実行せず強制的にログイン画面へ飛ばす、ログインチェックインターセプターを書くとしましょう。

ログイン画面のログインアクションの処理では、ログインチェックは無意味なので、ログインチェックインターセプタは未ログインでもアクションを呼び出す必要が有ります。

その処理をコードにすると下記のような具合になります。 インターセプターからアクションの処理クラスのインスタンスは ActionaInvocation#getAction で簡単に取得できます。


@Override
public String intercept(ActionInvocation invocation) throws Exception {

    Map<String, Object> session = invocation.getInvocationContext().getSession();
    String loggedUser = (String) session.get("loggedUser");

    if (loggedUser == null) {
        // 未ログインの場合
        if (invocation.getAction().getClass().equals(Login.class)) {
            // ログイン画面のアクションなら次のインターセプター(orアクション)へ
            return invocation.invoke();
        } else {
            // ログイン画面のアクションでなければ、アクションはスキップしてログイン画面の表示を促す文字列を返す
            return "login";
        }
        return "login";
    } else {
        // ログイン中なら次のインターセプター(orアクション)を呼び出す。
        return invocation.invoke();
    }
}