ActionContext
ActionContextはアクションのコンテキストであり、Struts2は、セッション、パラメーター、ロケールなど、アクション実行中に必要なオブジェクトを自動的に保存します。Struts2は、HTTPリクエストを実行する各スレッドに基づいて対応するActionContextを作成します。つまり、スレッドには一意のActionContextがあります。したがって、ユーザーは静的メソッドActionContext.getContext()を使用して、現在のスレッドのActionContextを取得できます。このため、ユーザーはアクションスレッドセーフを行うことを心配する必要はありません。
いずれにせよ、ActionContextはデータを保存するために使用されます。 Struts2自体は多くのデータを入力し、ユーザーは必要なデータを配置することもできます。 ActionContext自体のデータ構造は、マッピング構造、つまりマップであるマップであり、キーを使用して値をマップします。そのため、ユーザーはMapの使用などを使用したり、Action.GetContextMap()メソッドを使用してマップで動作させることができます。
Struts2に配置されたデータには、ActionInvocation、Application(すなわち、サーブレットコンテキスト)、変換、ロケール、アクション名、リクエストパラメーター、HTTPセッション、値スタックなどが含まれます。完全なリストについては、そのJavadocを参照してください(この記事の付録には、含まれる内容について説明します)。
ActionContextのスレッドのみで静的な方法によって取得できる特性により、アクションが渡されたり注入されるのを待つことなく、非アクションクラスで直接取得できます。リクエストのために作成されたスレッドでのみ有効であることに注意してください(対応するActionContextはリクエスト時に作成されるため)が、サーバーによって開始されたスレッド(Fliterのinitメソッドなど)で無効です。非アクションクラスでアクセスするのに便利なため、ActionContextを使用して、非アクションクラスでJSPにデータを渡すこともできます(JSPも簡単にアクセスできるため)。
ValueStackとActionContextの接続と違い:
類似点:それらはすべてHTTP要求の範囲内で使用されます。つまり、その生涯は1つのリクエストです。
違い:値スタックはスタックの構造であり、ActionContextはマップの構造です(マップ)。
連絡先:Valuestack.getContext()メソッドによって取得されたマップは、実際にはActionContextのマップです。 Struts2のソースコードを見ると、struts2.3.1.2のcreateacutionContextメソッドのorg.apache.struts2.dispatcher.ng.prepareoperationsの79行目)がわかります。 ActionContextを作成するとき、ValueStack.GetContext()は、ActionContextのコンストラクターのパラメーターとして使用されます。したがって、ValuestackとActionContextは基本的に互いに取得できます。
注:一部のドキュメントでは、「スタックのコンテキスト」という単語が表示されます。これは、実際にはActionContextに保存されている値です。したがって、これらのドキュメントを読むときは、スタック構造(つまり、値スタック)が配置されているか、マッピング構造(値スタックのコンテキスト、つまりActionContext)が配置されているかどうかを明確に確認する必要があります。
ActionContextを取得する方法:
カスタムインターセプター:ActionInvocation.getInvocationContext()を使用するか、actionContext.getContext()を使用します。
アクションクラス:インターセプターを挿入または使用するか、actioncontext.getContext()を使用します。
非アクションクラスでは、アクションクラスにパラメーターを渡すか、注入メカニズムを使用して注入するか、ActionContext.getContext()を使用します。注:ActionContext.getContext()は、リクエストスレッドで実行されているコードでのみ呼び出されます。
JSP:一般的に、ActionContext自体を取得する必要はありません。
値をActionContextに保存する方法:
インターセプター、アクションクラス、非アクションクラスなどのJavaクラスで:ActionContext.put(オブジェクトキー、オブジェクト値)メソッドを使用します。
jsp:tag <s:set value = "..."/>は、デフォルトでactioncontextに値を保存します(もちろん、<s:set>タグも他の場所に値を保存できます)。さらに、多くのタグにはvar属性があります(ID属性は以前に使用されていましたが、現在はID属性が非推奨になっています)。この属性は、actioncontextに値を保存でき、キーはvar属性の値、値はタグの値属性の値です。 (一部のドキュメントは、値をValuestackのコンテキストに保存することについて書いていますが、実際には同じです)
ActionContextから値を読み取る方法:
インターセプター、アクションクラス、非アクションクラスなどのJavaクラスで:ActionContext.get(オブジェクトキー)メソッドを使用します。
JSP:#で始まるOGNL式を使用します。たとえば、ActionContext.get( "name")メソッドが呼び出されます。注:特定のタグの属性がデフォルトでOGNL式として解析されない場合、式を囲むために%{}を使用する必要があり、「%{#name}」に類似した式が表示されます。 (「#」についてはこちらをご覧ください)
要するに、JSPでActionContextを使用することは、マッピング構造であり、一方でアクションの構成を読むことができるためです。多くのアクションに共通の値を提供する必要がある場合、各アクションにgetxxx()メソッドを提供することができますが、より良い方法は、インターセプターまたはJSPテンプレートのActionContextにこれらの共通値を保存することです(インターセプターまたはJSPテンプレートが複数のアクションに使用されることが多いため)。
いくつかの例:
Javaコード
//このクラスでは、インターセプターパブリッククラスのActionContextの操作を実証しますMyInterceptor extends AbstractInterceptor {public String Intercept(actionInvocation vocution)スロー例外{// actioncontext actioncontext actioncontext = rocation.getInvocationContext(); // value人を保存する人= new person(); ActionContext.put( "person"、person); // valueオブジェクト値を取得= actioncontext.get( "person"); // get httpservletrequest httpservletrequest request =(httpservletrequest)actioncontext.get(strutsstatics.http_request); //リクエストのマップ、つまり、httpservletrequest.getAttribute(...)およびhttpservletrequest.setattribute(...)Map requestMap =(Map)ActionContext.get( "request"); //その他のコード// ...... returnInvocation.invoke(); }} Javaコード
//このクラスは、アクションのアクションコントテキストの操作を実証しますpublicClass myAction extends actionsupport {@override public string execute()throws excements {// value stack actioncontext actioncontext = actioncontext.getContext(); // value人を保存する人= new person(); //これは、前の例で定義されているクラスですactionContext.put( "person"、person); // valueオブジェクトを取得= actioncontext.get( "person"); //その他のコード// ......成功を返す; }} HTMLコード
<!doctype html> <html> <head> <head> <metahttp-equiv = "content-type" content = "text/html; charset = utf-8"> <title> jspページ</head> <body> <body> <! - このjspはアクションコントの使用を実証します。 ActionContextはActionContextに保存されています。「#Person」を使用して次のように取得できます。 <s:propertyValue = "#request"/> <! - actioncontextにstruts2によって保存されている値を取得します。これはセッションのマップなど、次のように - > <s:propertyvalue = "#session"/> <! - アクションコントにstruts2によって保存されます。 jspのアクションコントテキストの値を保存 - > <! - 文字列「myname」を保存します。キーは「mykey」です。 <s:beanname = "com.example.person" var = "myobject"/> <! - その後、「# "を使用して次のように読み取ることができます - > <s:propertyValue ="#mykey "/> <s:propertyValue ="#myobject "/> </body> </html>
3。HTTPSERVLETREQUESTクラスまたはリクエストマップ
struts2は、リクエストに応じて2つの操作を提供します。1つは、従来のJava Webプロジェクトでのリクエストの操作と同じWebサーバーが提供するHTTPServletrequestクラスです。もう1つは「リクエストマップ」です。これは、HTTPSERVLETREQUESTの属性をカプセル化するマッピングクラスです。マップの操作は、HTTPSERVLETREQUESTの属性の操作と同等です。 MAPが提供される理由は、操作が便利であり、もう1つはOGNLを使用してJSPタグでリクエストを読み取ることができるためです。いずれにせよ、これらの2つの要求は相互運用可能です。リクエストのライフサイクルなどの概念については、他のJava Webプロジェクトと違いはありません。この記事については詳細に説明しません。
httpservletrequestクラスまたはリクエストマップを使用します
2つは相互運用可能ですが、リクエスト属性を読み取るという点では、リクエストマップを使用することははるかに便利で、不要なインターフェイスを公開しません。もちろん、httpservletrequestには、リクエストマップにはないいくつかの方法があります。もちろん、これらの方法を使用する場合は、前者を使用する必要があります。
RequestのマップまたはActionContextを使用してください:
どちらもマップであり、両方のライフサイクルがリクエストです。
従来のJava Webプロジェクトでは、この値は、リクエストの属性を介してJSPに渡されることがよくあります:SERTATTRIBUTE()SERTATTRIBUTE()、次にJSPでgetAttribute()。もちろん、Struts2プロジェクトでは、この方法を使用することもできますが、Struts2が提供する配信機能を放棄することは努力する価値はありません。著者は、リクエストのマップをActionContextに置き換える必要があると言っている公式文書を見つけませんでしたが、ActionContextを取得できるがリクエストを取得できないプログラムには、Struts2フレームワークの下でリクエストを取得できないことがわかりませんでした。したがって、著者は次のように推奨しています。リクエストのマップの代わりにActionContextを使用して値を渡すようにしてください。
リクエストのマップには、Springフレームワークなど、他のフレームワークによって設定された値が含まれる場合があります。これらの値を取得するときは、ActionContextには存在しないため、リクエストマップを使用する必要があります。
ActionContextを介して、httpservletrequestクラスを取得できます。
ActionContext: "Map requestMap =(Map)ActionContext.get(" request ");"を使用して、リクエストのマップを取得することもできます。したがって、JSPタグでは、「#request」という式を使用して、リクエストのマップのデータを取得できます。
httpservletrequestの取得方法:
ActionContextが既にある場合は、 "ActionContext.get(strutsstatics.http_request)を使用してhttpservletrequestを取得します。
カスタムインターセプターで、最初にActionContextを取得し、次にActionContextを介して取得します。
アクションでは、最初にActionContextを取得し、ActionContextを介して取得します。または、ActionがServletRequestAwareインターフェイスを実装し、ServletConfigInterceptorインターセプターを使用して、インターセプターがHTTPSERVLETREQUESTを注入するようにします。
JSPでは、通常、httpservletrequestを取得する必要はありません。
リクエストのマップを取得する方法:
ActionContextが既にある場合は、 "ActionContext.get(" request ")"を使用して取得します。
カスタムインターセプターで、最初にActionContextを取得し、次にActionContextを介して取得します。
アクションでは、最初にActionContextを取得し、ActionContextを介して取得します。または、ActionがRequestAwareインターフェイスを実装し、ServletConfigInterceptorインターセプターを使用して、インターセプターがMAPリクエストを挿入するようにします。
JSPでは、「#request」を使用してリクエストのマップを取得し、「#request.key」または「#request ['key']」を使用して、マップの値を読み取ります。
要するに、リクエストはJava Webサイトの一般的なルールに依然として適合しています。ただし、著者は、ユーザーが値を渡すためにリクエストを使用しないようにすることを推奨しています。
いくつかの例:
//このクラスは、インターセプターのhttpservletRequestのマップの操作とリクエストを実証しますpublicclass my interceptor extends abstract interceptor {public string intercept(actioninvocation vocation)throws {// actioncontext actioncontext actioncontext = invocation.getInvocationContext(); // httpservletrequest httpservletrequest httpservletrequest =(httpservletrequest)actioncontext.get(strutsstatics.http_request); //マップマップrequestMap =(マップ)ActionContext.get( "request"); //インスタンスとしてクラスを作成する人= new Person(); //次の2行のステートメントには同じ関数がありますhttpservletrequest.setattribute( "person"、person); requestmap.put( "person"、person); //その他のコード// ...... returnInvocation.invoke(); }} //このクラスは、httpservletrequestのマップの操作とアクションの要求(staticメソッドがアクションコントテキストを取得)を実証しますpublicclass myaction extends actionsupport {@override public string execute()throws {// ActionContext ActionContext ActionContext = actionContext.getContext(); // httpservletrequest httpservletrequest httpservletrequest =(httpservletrequest)actionContext.get(strutsstatics.http_request); //マップマップrequestMap =(マップ)ActionContext.get( "request"); //インスタンスとしてクラスを作成する人= new Person(); //次の2行のステートメントには同じ関数がありますhttpservletrequest.setattribute( "person"、person); requestmap.put( "person"、person); //その他のコード// ......成功を返す; }} //このクラスは、servletRequestawareを使用してアクションを使用してhttpservletrequestを取得します(注:servletconfiginterceptorインターセプターを使用する必要があります)publicClass Myaction extends ActionSupport ServletRequestaware {private httpservletrequestリクエスト; //このメソッドは、インターフェイスServletRequestaware PublicVoid setServletRequest(httpservletrequest request){this.request = request; } @Override public String execute()スロー例外{// httpservletrequestはこのクラスのフィールドで準備ができており、直接使用できます// ...... return success; }} //このクラスは、servletRequestawareを使用してアクションを使用してリクエストのマップを取得します(注:servletconfiginterceptorインターセプターを使用する必要があります)publicClass MyactionはActionSupport emptort requestaware {map <string、object> request; //このメソッドは、インターフェイスのメソッドですRequestAware publicVoid setRequest(Map <String、Object> request){this.request = request; } @Override public String execute()スロー例外{//リクエストのマップはクラスのフィールドで準備ができており、直接使用できます// ...... return success; }}< struts2(キーはリクエスト)によってActionContextに自動的に保存されている値(キーはリクエスト)であるため、 "#"を使用してアクションコントにアクセスし、それからリクエストを読み取ります - > <s:プロパティvalue = "#request"/> <! - 次の2つの行は、リクエストにアクセスするマップのキー "name"です。 </html>
3。パラメーター、つまり、Get RequestまたはPost Requestのパラメーター
パラメーターは、GetまたはPostを要求するときに、ブラウザによってサーバーに渡されるパラメーターです。従来のJava Webプロジェクトでは、httpservletrequest.getParameter()などの方法を使用してパラメーターを取得し、httpservletrequest.getParametermap()を使用して、カプセル化されたパラメーターを持つマップを取得できます。 struts2では、struts2は、quy "パラメーター」を使用して、上記のマップをActionContextに直接保存します。さらに、ActionContextは、このマップを取得するためのActionContext.getParameters()メソッドも直接提供します。したがって、Struts2の各コンポーネントのパラメーターを操作する方法は、リクエストのマップを操作する方法と非常に似ており、この段落については詳細に説明しません。
4。httpservletsessionクラスとセッションのマップ
従来のJava Webプロジェクトのセッションはすべてよくよく知られており、ユーザーのセッションステータスを記録するために使用します。 struts2は、httpservletsessionをマップ、つまり「セッションマップ」にカプセル化します。これは、リクエストの処理に似ています。ただし、システムリソースを保存するために、セッションが必要ない場合はセッションを作成しません。このため、httpservletessessionはstruts2のactioncontextに入れられません。プログラムがhttpservletsessionを使用する必要がある場合は、最初にhttpservletrequestを取得し、次にgetsession()またはgetsession(boolean b)を使用して取得する必要があります。セッションを作成する必要があるかどうかを決定します。セッションマップの場合、Struts2はActionContext(キーは「セッション」です)に掲載されていますが、心配しないでください。このマップのメカニズムは、新しい値が作成された場合にのみセッションを行います。要するに、Struts2のhttpservletsessionの操作は、最初にhttpservletrequestを介してそれを取得する必要があり、セッションマップの動作はリクエストマップの操作とまったく同じであり、この段落で詳細に説明されていません。
5。ServletContextとアプリケーションのマップ
従来のJava Webプロジェクトでは、ServletContextがグローバル変数を保存するために使用され、各Java仮想マシンにはWebプロジェクトごとにServletContextが1つしかありません。このServletContextは、その一意性を確保するためにWebサーバーによって作成されます。 ServletContextには属性を操作できるいくつかのメソッドがあり、これらの操作はマップの操作に似ています。したがって、Struts2は再びカプセル化されます。ServletContextの属性をマップ、つまり「アプリケーションマップ」にカプセル化し、ActionContext(key is application)にも配置します。したがって、アプリケーションマップの操作がリクエストのマップにある場合、この段落については詳細に説明しません。
ServletContextでの操作に関しては、httpservletRequest:struts2の操作に似ています:servletcontextをactioncontextに配置し、servletconfigInterceptorはservletcontext用のインターフェイスservletcontextawareを提供します。したがって、この段落については詳細に説明しません。
注:OGNL式で「#Application」を使用すると、ServletContextではなくアプリケーションのマップを取得できます。ただし、JSPに埋め込まれたJavaコード( "<%application.getAttribute(" ");%>"など)では、アプリケーションはマップではなくサーブレットコンテキストです。