1。インターセプターの紹介
インターセプターの関数は、web.xmlファイルのフィルターに似ています。ユーザーリクエストを傍受して、ユーザーリクエストを傍受することにより、ページを制御できます。インターセプターは、Struts-Core-2.2.3.Jarで構成されています。元のインターセプターは、struts-default.xmlで構成されており、インターセプターの基本的な使用方法を密封します。
Struts2インターセプター関数は、サーブレットフィルターに似ています。アクションが実行される前に、struts2は最初にstruts.xmlで参照されるインターセプターを実行します。複数のインターセプターがある場合、上下の順に実行されます。すべてのインターセプターのインターセプター方法を実行した後、実行の実行方法が実行されます。
struts2インターセプターは、com.opensymphoy.xwork2.interceptor.interceptorからこのインターフェイスを実装する必要があります。次の3つの方法を定義されたインターセプターに実装する必要があります。
void Destroy(); void init(); String Intercept(ActionInvocation Invocation)は例外をスローします。
カスタムインターセプターは、上記の3つの方法をオーバーライドする必要があります。さらに、インターセプター構成ファイルstruts.xml struts2のxmlは、元のファイルstruts-default.xmlファイルを継承しているため、struts-default.xmlのすべての構成情報が対応する<パッケージ>に自動的に所有されます。特定のコードは次のとおりです。
<パッケージ名= "demo" extends = "struts-default"> ... </package>
2.インターセプターを追加します
インターセプターを使用するには、構成する必要があります。 Struts2はマッピング方法を使用するため、特定の関数を使用する場合は、構成ファイルで構成する必要があり、インターセプターも例外ではありません。したがって、対応するインターセプター要素をパッケージに追加する必要があり、インターセプターは、アクションが実行される前に対応するインターセプターが実行されるように、対応するクラスファイルに関連付ける必要があります。特定の使用方法は次のとおりです。
(1)構成ファイルstruts.xmlを追加し、ファイルにインターセプターを追加します
<パッケージname = "testlogin" namespace = "/" extends = "struts-default"> <! - interceptor名= "my interceptor"> </interceptor> </interceptor> <action name = "demo"> <result name = "error" type = "redirect">/エラーname = "checkerror">/checkssession.jsp </result> <interceptor-ref name = "my interceptor"> </interceptor-ref> <interceptor-ref name = "defaultStack"> </interpectector-ref> </action> </package>
上記のパッケージでは、MyInterceptorという名前のインターセプターが追加され、Javaクラスがインターセプターに登録されました。これはMyInterceptorという名前で、com.Interceptorパッケージでブロックされました。さらに、対応するアクションがパッケージに追加されました。アクションを実行する前に、MyInterceptorインターセプターが最初に実行されます。
(2)登録されたインターセプタークラスMyInterceptorを書き込みます。このクラスはcom.opensymphoy.xwork2.interceptor.interceptorインターフェイスを実装し、対応する方法をオーバーライドする必要があります
パッケージcom.interceptor; java.util.mapをインポートします。 com.entity.userをインポートします。 com.opensymphony.xwork2.actioncontextをインポートします。 com.opensymphony.xwork2.actionInvocationをインポートします。 com.opensymphony.xwork2.interceptor.interceptorをインポートします。パブリッククラスMyInterceptorはインターセプターを実装しています{プライベートユーザー; public user getUser(){return user; } public void setuser(user user){this.user = user; } @Override public void Destroy(){// todo auto-enerated method stub.out.println( "---- Destroy()----"); } @Override public void init(){// todo auto-fenated method stub.out.println( "------ init()-------"); } @Override public String Intercept(ActionInvocation Invocation)スロー例外{// todo auto-enerated method stub.out.println( "----------"); map <string、object> session = invocation.getInvocationContext()。getSession(); if(session.get( "username")!= null){system.out.println( "ログインに正常に!"); //session.put( "username"、user.getusername()); returnInvocation.Invoke(); } else {system.out.println( "login failed!"); 「チェックエラー」を返します。 }}}(3)最初の2つのステップの後、インターセプターが構成されました。最後の部分は、インターセプターを使用することです。対応するタグを表示ページに追加し、タグに上記で作成されたデモという名前のアクションを指定します。次に、ページを実行して、コンソールの対応するインターセプターコンテンツを印刷します。
<%@ page Language = "Java" contentType = "text/html; charset = utf-8" pageencoding = "utf-8"%> <! <html> <head> <メタhttp-equiv = "content-type" content = "text/html; charset = utf-8"> <title>挿入タイトル</title> </head> <body> <form action = "demo" type = "submit" name = "ok" value = "submit"> </form> </body> </html>
印刷コンテンツ:
出力の結果を分析します。プログラムコンピレーション段階では、構成ファイルstruts.xmlが最初に構成ファイルstruts.xmlを読み取り、構成ファイルアクションで、インターセプターが追加されたかどうかを検索します。インターセプターが追加された場合、インターセプターまたはインターセプタースタックがインターセプター名に従って<インターセプター>で定義されているかどうかを見つけます。インターセプターが定義されていることがわかった場合、インターセプターに基づいて対応する登録クラスを見つけ、最後にパッケージで登録クラスを見つけて、対応するinit()メソッドを実行します。実行中の段階の一般的なプロセスは、コンピレーション段階に似ています。ユーザーがフォアグラウンドでリクエストを送信した後、彼はstruts.xmlで対応するアクションを探します。それが見つかった場合、インターセプターが見つかります。発見されていない場合、対応するエラーがスローされます。最後に、インターセプター登録クラスのインターセプト方法が実行されます。
3。インターセプタースタック
インターセプターにはスタックの概念もあります。彼らは、統一された管理を達成するために使用されたインターセプターを共有状態に定義し、インターセプターをパッケージで共有できるようにし、インターセプターの使用を大幅に促進します。繰り返されるインターセプターは、パッケージでよく使用されます。インターセプターREFを毎回アクションに追加すると、非常に面倒です。次に、この問題を解決するためにインターセプタースタックが生成されます。特定の構成は次のとおりです。
<パッケージname = "testlogin" namespace = "/" extends = "struts-default"> <! - interceptor-> <interceptor name = "myintector"> </interceptor> <! - パブリックインターセプターチェーンを定義します。アクションタグでは、インターセプターチェーンのみを参照する必要があります - > <インターセプタースタック名= "defaulttstack1"> <interceptor-ref name = "myintector"> </interceptor-ref> <interceptor-ref name = " type = "redirect">/error.jsp </result> <result name = "success">/success.jsp </result> <result name = "checkerror">/checkssession.jsp </result> <interceptor-ref name = "defaultStack1"> </interceptor-ref> </action> </package>
この例では、インターセプタースタックを使用して、DefaultTStack1という名前のインターセプタースタックを定義します。実行されるインターセプターがスタックに追加され、インターセプターがカプセル化され、インターセプタースタックがアクションで直接呼び出され、インターセプタースタックの共有を実現します。
4。デフォルトインターセプタースタック
さらに、デフォルトのインターセプタースタックを定義できます。つまり、アクションでインターセプターが定義されていない場合、デフォルトでパブリックインターセプターを実行します。インターセプタータグと同じレベルに属し、default-interceptor-refを使用して定義されています。
<パッケージname = "testlogin" namespace = "/" extends = "struts-default"> <! - interceptor-> <interceptor name = "myintector"> </interceptor> <! - パブリックインターセプターチェーンを定義します。アクションタグでは、インターセプターチェーンのみを参照する必要があります - > <インターセプタースタックname = "defaultinter"> <interceptor-ref name = "my interceptor"> </interceptor-ref> <interceptor-ref name = "defaultStack"> </interceptor-ref> </interceptors> </interpectors> <default-interceptor-ref name = "defaultinter"> </default-interceptor-ref> <action name = "demo"> <result name = "error" type = "redirect">/error.jsp </result name> <result name = "success">/success.jsp </result> <result name = "checkerror">チェックセッション
定義されたデフォルトインターセプタースタックは、アクションがインターセプターを指定しない場合にのみ、カスタムデフォルトインターセプタースタックを実行します。インターセプターがアクションで再定義されている場合、カスタムデフォルトインターセプタースタックをオーバーライドします。
5.インターセプターの実行なし
パッケージがデフォルトのインターセプターを定義する別の状況がありますが、特定のアクションではインターセプターを実行する必要はありません。次に、DefaultStackという名前のインターセプターを対応するアクションに追加できます。システムのデフォルトインターセプターであり、操作はありません。
<パッケージname = "testlogin" namespace = "/" extends = "struts-default"> <! - interceptor-> <interceptor name = "myintector"> </interceptor> <! - パブリックインターセプターチェーンを定義します。アクションタグでは、インターセプターチェーンのみを参照する必要があります - > <インターセプタースタックname = "defaultinter"> <interceptor-ref name = "my interceptor"> </interceptor-ref> <interceptor-ref name = "defaultStack"> </interceptor-ref> </interceptors> </interpectors> <default-interceptor-ref name = "defaultinter"> </default-interceptor-ref> <action name = "demo"> <result name = "error" type = "redirect">/error.jsp </result name> <result name = "success">/success.jsp </result> <result name = "checkerror" <Interceptor-ref name = "defaultStack"> </interceptor-ref> </action> </package>
6.インターセプトメソッド
6.1使用
上記のインターセプターは、インターセプターインターセプトアクションのみを実装します。実際、インターセプターには非常に強力な機能があり、対応するアクション法を傍受することもできます。インターセプトアクションの違いは、メソッドを傍受する場合、クラスMethodFilterInterceptorを継承する必要があることです。このクラスはxwork-core.jarに囲まれており、ウェブワークがstruts2の中核であることを再び証明しています。さらに、インターセプトメソッドと非インターセプトメソッドを決定するために、対応する属性を構成ファイルに追加する必要もあります。特定の構成方法は次のとおりです。
<パッケージname = "testlogin" namespace = "/" extends = "struts-default"> <! - interceptor-> <interceptor name = "myintector"> </interceptor> <! - パブリックインターセプターチェーンを定義します。アクションタグでは、インターセプターチェーンのみを参照する必要があります - > <インターセプタースタック名= "defaultInter"> <interceptor-ref name = "my interceptor"> </interceptor-ref> <interceptor-ref name = "defaultStack"> </interceptor-ref> </interpector-stack> </interpectors> <action> <action> <active namo "> type = "redirect">/error.jsp </result> <result name = "success">/success.jsp </result name = "checkerror">/checkssession.jsp </result name = "checkerror">/checks./checkks.pheckks.jsp </result> <! - defated neectack neectstack in in compute in neectstack in in compute in neected neeptack in sute intected neeptack excludemethodsで傍受する - > <interceptor-ref name = "defaultstack"> <param name = "includemethods">傍受するメソッド名</param> <! - 傍受方法 - > <param name = "excludemethods"
MethodFilterInterceptorクラスの対応するインターセプターメソッドを継承するクラスのコード:
パッケージcom.interceptor; java.util.mapをインポートします。 com.opensymphony.xwork2.actioncontextをインポートします。 com.opensymphony.xwork2.actionInvocationをインポートします。 com.opensymphony.xwork2.interceptor.methodfilterinterceptorをインポートします。 public class inter extends methodFilterInterceptor {@Override public string doIntercept(actionInvocation novocation)throws exception {system.out.println( " - intercept() - "); //対応するセッションマップ<string、object> session = rivocation.getInvocationContext()。getSession()を取得します。 Map request =(map)ActionContext.getContext()。get( "request"); string username =(string)request.get( "user.username"); if(session.get( "username")!= null){string result = invocation.invoke(); system.out.println( " - end() - ");返品結果; }}}} 6.2デモ
傍受方法の例を見て、結果を分析しましょう。次の例は、インターセプト法の出力結果を示しています。例では、アクションによって実行されるメソッドを追加するために、ログニクションクラスが個別に作成されます。インタークラスはインターセプターメソッドでオーバーライドされており、コンソールで特定のメソッドを傍受するかどうかを出力します。 login.jspファイルが追加されて、それぞれ3つの方法の実行を実証します。
(1)struts.xmlのメソッドインターセプターの定義は、パッケージ内のinterという名前のインターセプターを定義し、インターセプターにパラメーターを指定します。 includemethodsは、方法を傍受するために使用されます1。 excludeMethodsの方法2は、Method2メソッドが傍受されないことを意味します。特定の構成は次のとおりです。
<!Doctype Struts public " - // Apache Software Foundation // DTD Struts Configuration 2.0 // En" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <consting name = "struts.action.extension" "value =" Value = " <インターセプター名= "inter"> <param name = "includemethods"> method1 </param> <! - intercept method1 method-> <param name = "excludemethods"> method2 </param> </interceptor> <interceptor name = "my interceptor"> <interceptor-ref name = " name = "defaultStack"> </interceptor-ref> </interceptor-stack> </interceptor-stack> </interceptors> <action name = "loginaction"> <result name = "success"> success.jsp </result name = "error.jsp </result> <result name"> error.jsp </result name = <> <> <> <<> <<> <<<> << type = "redirectaction"> welcome </result> <interceptor-ref name = "inter"> </interceptor-ref> <interceptor-ref name = "defaultStack"> </interceptor-ref> </action> </package> </struts>
(2)loginaction class、login.jspでアクションを構成し、3つの方法をこのクラスにそれぞれ追加する3つの方法を追加します。Method1が傍受され、Method2とMethod3は傍受されず、最後に出力結果を確認します。
パッケージcom.action; com.opensymphony.xwork2.actionsupportをインポートします。 public class loginactionはactionsupportを拡張します{@override public string execute()throws Exception {if(this.username.equals( "admin")&& this.password.equals( "admin")){return "success"; } else if(this.username.equals( "cancel")&& this.password.equals( "cancel")){return "cancel"; } else {return "error"; }} public void method1(){system.out.println( "実行方法:method1"); } public void method2(){system.out.println( "実行方法:Method2"); } public void method3(){system.out.println( "実行方法:method3"); }プライベート文字列ユーザー名;プライベート文字列パスワード。 public string getUsername(){return this.username; } public void setUsername(string username){this.username = username; } public string getPassword(){return this.password; } public void setPassword(string password){this.password = password; }}(3)メソッドフィルターインターセプタークラスを継承し、インターセプトメソッドを実装するために使用されます。インターセプトメソッドを書き直し、対応する情報をメソッドに追加します。
パッケージcom.interceptor; Import Java.util.date; java.util.mapをインポートします。 com.action.loginactionをインポートします。 com.opensymphony.xwork2.actioncontextをインポートします。 com.opensymphony.xwork2.actionInvocationをインポートします。 com.opensymphony.xwork2.interceptor.methodfilterinterceptorをインポートします。パブリッククラスInter拡張MethodFilterInterceptor {@Override Protected String doIntercept(actionInvocation Invocation)Throws Exception {// Todo auto-enerated method stub.out.println( "インターセプターインターセプトはアクション実行前"+new date();文字列result =招待状.invoke(); //アクションメソッドSystem.out.println( "Interceptor Intercepts after Action execution"+new date())を実行します。返品結果; }}(4)login.jsp、JSPページに3つのボタンを追加し、それぞれ3つのメソッドを実証し、メソッドのインターセプターの傍受を判断します。クリック後に3つのボタンによって投稿されたアクションは、JavaScriptで動的に追加されます。これにより、形式で異なるアクションを実行する方法が実現されます。もちろん、次の記事で説明する他の方法があります。
<%@ page Language = "Java" contentType = "text/html; charset = utf-8" pageencoding = "utf-8"%> <! <html> <head> <メタhttp-equiv = "content-type" content = "text/html; charset = utf-8"> <title>挿入タイトルform.action = "loginaction!method1"; form.submit(); } //方法2、ボタン2のインターセプトしないメソッドを追加します。{var form = document.forms [0]; form.action = "loginaction!method2"; form.submit(); } //方法3、ボタン3関数のインターセプトでないメソッドを追加します。 form.action = "loginaction!method3"; form.submit(); } </script> </head> <body> <form> username:<入力タイプ= "テキスト" name "name =" username "> <br>パスワード:<入力タイプ=" Text "name"> <br> <input type = "submit" name = "ok" button1 "onclick =" method1() ">" "ok1" ok1 "ok1" ok1 " type = "submit" name = "ok2" value = "button3" onclick = "method3()"> </form> </body> </html>実行が完了した後のページビュー:
(5)実行結果を分析し、それぞれボタン1、2、および3をクリックし、コンソールに結果を出力します。ボタン1はバインドされた方法です1。この方法は、struts.xmlで傍受します。結果が正しい場合、インターセプトされた結果が表示されます。対応するボタン2と3は、傍受されないため、実行結果のみを出力します。次に、以下の結果図を見てください。
結果図は、まさに分析の結果です。ボタン1がインターセプトされ、インタークラスのdo -interceptメソッドが実行されました。対応するボタン2と3のうち3つは傍受されませんでした。つまり、Method1はメソッドインターセプターのホワイトリストに配置され、実行時にメソッドを傍受する必要があります。方法2はインターセプターのブラックリストに配置されており、メソッドを傍受する必要はありません。 Method3は何もしません。
7。結論
インターセプターの内容はここにまとめられています。インターセプターは非常に強力な機能を提供し、開発者が実行時に出力結果を制御できるようになり、プログラミングの柔軟性が向上します。さらに、理論的なことを覚えてはいけません。それらを合理的に分析し、さらに練習し、いくつかの例を作成して、分析結果をより深く理解する必要があります。
PS:struts2(xwork)が提供するインターセプターの機能的説明
インターセプター | 名前 | 説明します |
エイリアスインターセプター | エイリアス | リクエストパラメーターは、異なる要求間で異なる名前ファイルに変換され、リクエストコンテンツは変更されません |
チェーンインターセプター | 鎖 | 以前のアクションのプロパティに次のアクションによってアクセスされ、チェーンタイプ(<result type = "Chain">)の結果と組み合わせて使用されます。 |
チェックボックスインターセプター | チェックボックス | HTMLはデフォルトでUNCheckboxを送信しないのに対し、Uncheckboxのコンテンツをfalseに設定し、自動処理コードを追加しました。 |
Cookieインターセプター | クッキー | 構成された名前と値を使用して、Cookieを参照してください |
変換エラーインターセプター | 変換エラー | ActionContextからActionのプロパティフィールドにエラーを追加します。 |
セッションインターセプターを作成します | 創造 | HTTPSESSIONを必要とするインターセプターサービスに使用するHTTPSESSIONを自動的に作成します。 |
デバッグインターセプター | デバッグ | さまざまなデバッグページを提供して、内部データステータスを表示します。 |
インターセプターを実行して待機します | execandwait | ユーザーを中級待機ページに連れて行っている間、バックグラウンドでアクションを実行します。 |
例外インターセプター | 例外 | 画面に例外を配置します |
ファイルアップロードインターセプター | fileupload | ファイルアップロード機能を提供します |
I18Nインターセプター | i18n | ユーザーが選択したロケールを記録します |
ロガーインターセプター | ロガー | 出力アクションの名前 |
メッセージストアインターセプター | 店 | 検証AWAREインターフェイスを実装するアクションクラスに表示されるメッセージ、エラー、フィールドエラーなどを保存またはアクセスします。 |
モデル駆動型インターセプター | モデル駆動型 | クラスがモデル駆動型を実装する場合、GetModelによって取得された結果を値スタックに配置します。 |
スコープモデル駆動型 | スコープモデル駆動型 | アクションがScopedModeldrivenを実装する場合、インターセプターは対応する範囲からモデルを取り出し、アクションのSetModelメソッドを呼び出してアクション内に配置します。 |
パラメーターインターセプター | パラメージ | リクエストのパラメーターをアクションに設定します。 |
インターセプターを準備します | 準備してください | Actonが準備可能な場合、インターセプターはアクションクラスの準備方法を呼び出します。 |
スコープインターセプター | 範囲 | アクション状態をセッションとアプリケーションに保存する簡単な方法。 |
サーブレット構成インターセプター | ServletConfig | HTTPSERVLETREQUESTおよびHTTPSERVLETRESPONSEにアクセスして、マップの形式でアクセスする方法を提供します。 |
静的パラメーターインターセプター | staticparams | struts.xmlファイルから対応するアクションに<param> in <param> in <param> in <param> in <param> in <param> in <param>に設定します。 |
ロールインターセプター | 役割 | ユーザーがJAAS指定された役割を持っているかどうかを判断します。それ以外の場合は実行されません。 |
タイマーインターセプター | タイマー | 出力アクション実行時間 |
トークンインターセプター | トークン | トークンをダブルクリックしないでください |
トークンセッションインターセプター | トークンセッション | ただし、トークンインターセプターのように、ダブルクリックすると、要求されたデータがセッションに保存されます |
検証インターセプター | 検証 | Action-Validation.xmlファイルで定義されているコンテンツを使用して、送信データを確認します。 |
ワークフローインターセプター | ワークフロー | Call Actionの検証メソッドを呼び出し、エラーが発生したら、入力画面に再配置されます。 |
パラメーターフィルターインターセプター | n/a | パラメーターリストから不要なパラメーターを削除します |
プロファイリングインターセプター | プロファイリング | パラメーターを介してプロファイルをアクティブ化します |