サーブレットデータモードを保存します
取得| | removeAttribute()データを操作するWebAppの間でデータを格納するために使用されるサーブレットServletContextオブジェクトでは、のServletContext WebAppのは、直接設定を使用して、全体の公共のデータを格納します。
またのServletContext多くの小さなオブジェクトの3つのタイプがあります。
- ストレージのServletConfigのServletConfigサーブレット初期設定パラメータ
- ユーザーのリクエストパラメータ記憶要求を要求
- セッションのユーザーセッション情報のセッションを保存します
removeAttribute()メソッドを|取得|このクラスのオブジェクト3はまた、対応するセットを持って、データを格納するために使用されます。
地図を使ってデータを格納するオブジェクトの四つのカテゴリーであるオブジェクトの4種類、合計は、地図をドメインと呼ばれています。
運転データのアクションモード
アクションは、サーブレットのServletContextは、データを保存するために、データを保存するためにするactionContextによってアクションを使用して、代わりにサーブレットの使用されています。
コンテキスト=するactionContext ActionContext.getContext(); // 設定、変更、パラメータ取得 context.put( "年齢"、18である); int型年齢=(INT)context.get( "年齢"); // 戻り値はオブジェクトであり、強力なターンを必要と
自身するactionContextデータを保存することができ、また、他のするactionContextドメインオブジェクトを持っています。
コンテキスト=するactionContext ActionContext.getContext();
地図<文字列、オブジェクト> = context.getApplicationアプリケーション(); //マップオブジェクトのServletContextを取得し、すなわちアプリケーションドメイン
地図<文字列、オブジェクト>セッション= context.getSession(); // Mapオブジェクトのセッションオブジェクト、すなわちドメインセッション取得
)HttpParametersパラメータ= context.getParametersを(; //すべてのリクエストパラメータを取得し、このオブジェクトは組み込みのEL PARAMに相当し、オブジェクトをparamsは
Mapオブジェクト、HttpParametersオブジェクトが置かれ()、取得()、()メソッドを削除し、データは、これらの方法で動作させることができます。
サーブレットネイティブオブジェクト、ネイティブデータサーブレットが運営するオブジェクトを取得します。
Struts2のは、サーブレットがネイティブオブジェクトを取得するには3つの方法を提供します。
1、するactionContext自体は、それがのServletContext、要求、応答サーブレットネイティブ3つのオブジェクトを取得することができる、データを格納することができます。
するactionContextコンテキスト= ActionContext.getContext()。 // 。获取原生的サーブレット对象因为取得()返回值是オブジェクト、所以均需强转 のServletContextのServletContext =(のServletContext)context.get( "com.opensymphony.xwork2.dispatcher.ServletContext" ); HttpServletRequestのリクエスト =(HttpServletRequestの)context.get( "com.opensymphony.xwork2.dispatcher.HttpServletRequest" )。 HttpServletResponseの応答 =(HttpServletResponseの)context.get( "com.opensymphony.xwork2.dispatcher.HttpServletResponse")。
2、キー複雑すぎる、Struts2のは、ツールを提供していますので、覚えておいてくださいServletActionContext:
// 均为ServletActionContext类的静态方法 のServletContextのServletContext = ServletActionContext.getServletContext()。 HttpServletRequestのリクエスト = ServletActionContext.getRequest()。 HttpServletResponseの応答 = ServletActionContext.getResponse()。
図3は、インターフェースを実装することにより取得します
パブリック クラス LoginActionのは延び ActionSupportが実装ServletContextAwareが { @Override パブリック文字列(実行)スロー{例外を 返す スーパー)(.execute。 } @Override 公共ボイドsetServletContext(のServletContextのServletContext){ } }
インターフェイスを実装ServletContextAware、唯一のメソッドを実装する必要があります。取得し、ServletContextオブジェクトを渡しますTomcatは、私たちがしなければならないタイプのServletContext、それに割り当てられ渡された値のメンバ変数を記述することですので、このアクションは、ServletContextオブジェクト(メンバ変数)で直接使用することができます。
パブリック クラス LoginActionのは、拡張 ActionSupportが実装ServletContextAware { プライベートのServletContextのServletContext。 @Override パブリック文字列)(実行スロー{例外を 返す スーパー)(.execute。 } @Override 公共 ボイドsetServletContext(のServletContextのServletContext){ this.servletContext = のServletContext。 } }
ServletContextオブジェクトを使用するには、ServletContextAwareインタフェースを実現します。
HttpServletRequestオブジェクトを使用するには、ServletRequestAwareインタフェースを実現します。
HttpServletResponsetオブジェクトを使用するには、ServletResponseAwareインタフェースを実現します。
これらのインタフェースを同時に達成することができます。
実際には第2、第3の方法の底は、次のとおりです。最初の呼び出しサーブレットを取得する方法は返され、ネイティブオブジェクト。
するactionContextオブジェクトのライフサイクル
-
サーブレットはスレッドセーフではありません。WebAppの間、サーブレットのインスタンスを1つだけ実行するために、すべての要求(ユーザーが)このインスタンスのメンバ変数を共有するために、それが問題を引き起こすのは簡単です、それは複数のユーザーによって変更することができる変数への一般的な方法は、メソッドの本体で書いている(ローカル変数) 。危険なサーブレットベースStruts1。
-
Struts2のは、スレッドセーフです。WebAppの実行時には、Struts2のアクションインスタンスが破壊に対応し、この要求を処理し、各要求新しいアクションのインスタンスのために作成されます。
-
Actionオブジェクトを使用して作成するactionContextオブジェクトが破壊されたActionオブジェクトを、作成および破棄されます。すなわち、ネイティブ要求オブジェクトとサーブレットするactionContextのライフサイクルと一致して、サーブレットを要求する代わりするactionContextのデータを格納するために使用することができます。するactionContext)は、データを通信することができるが、データ領域するactionContextないActionContext.getContext(のパラメータを要求しない。(「XXX」)を取得パラメータを得るためにこの要求を。
方法で、アクションパラメータ取得要求
リクエストオブジェクトパラメータを介して取得要求に1、アクセス要求オブジェクトネイティブ
HttpServletRequestのリクエスト= ServletActionContext.getRequest()。
文字列名 = request.getParameter( "名前");
図2に示すように、オブジェクトパラメータにするactionContext HttpParameters、次に取得要求で取得した被写体HttpParameters
するactionContextコンテキスト= ActionContext.getContext()。 HttpParametersパラメータ = context.getParameters()。 パラメータ名 = parameters.get( "名前");
パラメータパラメータタイプが得られます。地図に相当HttpParameters。
3、ドライブ属性
パブリック クラス LoginActionの拡張ActionSupport { プライベート文字列名; プライベート整数年齢; // 自動開梱は、包装、梱包の種類を使用しようとするかが 公共の文字列のgetName(){ リターン名; } パブリック 無効のsetName(文字列名){ これを。 =名名; } パブリック整数getAge(){ 戻り年齢; } 公共 ボイドsetAge(整数年齢){ この .age = 年齢; } @Override 公衆文字列)(実行スロー例外{ 戻り ヌル。 } }
リクエストパラメータが書き込まれたアクションのメンバ変数を使用し、セッター、ゲッターメソッドを提供し、参照空のアクションを提供するように構成することができます。
String型のリクエストパラメータは、最初の対応するメンバ変数を割り当てるためにセッターメソッドを呼び出し、その後、メンバ変数の種類に対応する変換パラメータを要求します。
これは、日付文字列フォーマットの種類は、このような2019年9月1日として、必要とされる、基本的なタイプの8種類、日付型に適用されます。
必要な要求パラメータ名(フォームフィールド名)と変数名は、メンバ変数と同じです。
名前:の<input type = "text" NAME = "名前"> <br />
年齢:の<input type = "text"の名= "年齢"> <br />
属性主導の短所:非常に頻繁に使用されるリクエストパラメータ、アクションは、非常に複雑なメンバ変数、ゲッター、セッターメソッドの多くがあるでしょう。
図4に示すように、ターゲットドライブ
対応するアクションゲッター、セッターと空の引数コンストラクタメソッドを提供するために、アクションのメンバ変数として、JavaBeanの(エンティティ・クラス)を包装するために使用される要求パラメータ:
パブリック クラス LoginActionのは、拡張ActionSupport { プライベートユーザーのユーザーを、 パブリックユーザーのgetUser(){ 戻りユーザ。 } 公共 ボイドSETUSER(ユーザユーザ){ この .user = ユーザー。 } @Override パブリック文字列(実行)スロー例外{ のSystem.out.println(user.getName())。 リターン ヌル。 } }
ゲッター、セッターメソッドは、空の引数のコンストラクタを有するようにJavaBeanの(ベースのエンティティ)、エンティティ・クラスを提供することが望ましいです。
パブリック クラスユーザー{ プライベート文字列名; プライベート文字列の年齢; パブリック文字列のgetName(){ 戻り名。 } 公共 ボイドのsetName(文字列名){ この .nameの= 名前。 } パブリック文字列getAge(){ 戻り年齢; } 公共 ボイドsetAge(文字列の年齢){ この .age = 年齢。 } }
オブジェクトの名前を追加するためのフォームフィールドのname属性:
名前:の<input type = "text" NAME = " user.name "> <br /> 年齢:の<input type =" text"の名= " user.age "> <br />
名前は前から別の属性に書かれ、それが使用することはできません。
図5は、モデル駆動型
パブリック クラス LoginActionのは、拡張 ActionSupport 実装ModelDriven <ユーザー> { //それ以外の場合はnullで、明示的に(アップ新しい)を作成する必要があります。 =ユーザー新規新しいユーザープライベートユーザー(); @Overrideの パブリックユーザgetModelは(){ //戻りオブジェクトは、要求パラメータが受け入れ返すユーザー; } @Override パブリック文字列(実行)スロー例外{ 戻りNULL ; } }
単にgetModel()メソッドを実装する<T>インターフェイスModelDriverを達成するために必要なのオブジェクトがリクエストパラメータを受け付ける返します。
明示的にオブジェクト・リクエスト・パラメータを作成する必要性を受け入れ、そうでない場合は、オブジェクトがnullの場合、このオブジェクトを使用すると、nullポインタ例外をスローします。しかし、このオブジェクトはセッター、ゲッターメソッドを提供して与えることはありません。
それでも我々はJavaBeanの(エンティティクラス)を提供する必要があります。
オリジナルの文言を使用して、フォームフィールドのname属性:
名前:の<input type = "text" NAME = "名前"> <br />
年齢:の<input type = "text"の名= "年齢"> <br />
モデル駆動型短所:唯一のモデル、パッケージのエンティティクラスにのみリクエストパラメータ。ターゲット・ドライブが複数のオブジェクトであってもよく、パラメータは、複数のオブジェクトにパッケージしてもよいです。
図6に示すように、パラメータセットカプセル化された要求を使用して
サーブレットは、リクエストパラメータパッケージの要求にネイティブで、パッケージはHttpParametersリクエストパラメータにHttpParametersで、リクエスト属性は、複数のアクションのメンバ変数にパッケージ化駆動パラメータであり、ターゲットドライブは、ドライブのモデルは、すべてのリクエストパラメータをカプセル化JavaBeanの。
さらに使用も(一覧またはマップ)カプセル化されたリクエスト・パラメータを設定することができます。
-
使用したパッケージリストのリクエストパラメータ
パブリック クラス LoginActionのは、拡張ActionSupport { プライベートリスト<文字列>リストを。 公共の一覧<文字列> GETLIST(){ 戻り値のリスト。 } 公共ボイドセットリスト(リストの<string>リスト){ this.list = リスト。 } @Override パブリック文字列(実行)スロー例外{ 戻り ヌル。 } }
ゲッター、セッターメソッドを提供する必要があります。
フォームフィールドのname属性は、Listオブジェクトを指定します。
名前:の<input type = "text" NAME = "リスト"> <br />
年齢:の<input type = "text"の名= "リスト"> <br />
要求がリストフィールドに格納され、最初のフィールドがリストの最初の要素として格納され、第2のフィールドはように第二の要素......として記憶されます。
あなたは、保存場所を指定することができます。
名前:の<input type = "text" NAME = "リスト"> <br /> 年齢:の<input type = "text"の名= " リスト[3] "> <brの/>の TEL:の<input type =" TEL"名前= "リスト"> <br />
[Value]フィールド名、TEL値フィールド、ヌル、年齢フィールド]
添字は、ストレージ上の指定した場所に、指定され;ていない指定されたインデックスで、前面から背面に、アイドル位置(ヌル)に格納されています。
-
カプセル化を使用して地図のリクエストパラメータ
パブリック クラス LoginActionのは、拡張ActionSupport { プライベート地図<文字列、文字列>のマップを、 公共の地図<文字列、文字列> GetMapリクエスト(){ リターンマップ。 } 公共ボイドてsetMap(MAP <文字列、文字列>マップ){ this.map = 地図。 } @Override パブリック文字列(実行)スロー例外{ 戻り ヌル。 } }
ゲッター、セッターメソッドを提供する必要があります。
フォームフィールド:
名前:<入力タイプは、= "テキスト"名前= " マップ[ '名前'] "> <br /> 年齢: <入力タイプは、=" text"は名前= " マップ[ '年齢'] "> /> <br
地図は、キーと値のペアのフィールドを格納するために使用されるので、キーを指定する必要があることです。マップオブジェクト[「キー」]。
サーブレットオブジェクトは、データを利用するために方法で動作するようにStruts2のアクションを使用してサーブレットに自生しています。
しかし、操作はサーブレットクッキーがネイティブ利便オブジェクトはまだです。