1.アクション設定の各種デフォルト値
<package name="csdn" namespace="/test" extends="struts-default">
<アクション名="helloworld" メソッド="実行" >
<result name="success">/WEB-INF/page/hello.jsp</result>
</アクション>
</パッケージ>
1>アクションにクラスが指定されていない場合、デフォルトは ActionSupport です。
2>アクションにメソッドが指定されていない場合、デフォルトでアクション内のexecute()メソッドが実行されます。
3>結果の name 属性が指定されていない場合、デフォルト値は成功です。
2. アクションにおけるさまざまな転送タイプの結果
<アクション名="helloworld">
<result name="success">/WEB-INF/page/hello.jsp</result>
</アクション>
結果の構成は struts1 の forward と似ていますが、struts2 では、ディスパッチャ (デフォルト値)、リダイレクト、redirectAction、plainText などの複数の結果タイプが提供されます。
以下は、リダイレクトされたアクションが同じパッケージ内にある場合の redirectAction 結果タイプの例です。
<result type="redirectAction">helloworld</result>
リダイレクトされたアクションが別の名前空間にある場合:
<result type="redirectAction">
<param name="actionName">helloworld</param>
<param name="namespace">/test</param>
</結果>
plaintext: 元のファイルの内容を表示します。たとえば、jsp ファイルのソース コードをそのまま表示する必要がある場合にこのタイプを使用できます。
<result name="source" type="plainText ">
<param name="location">/xxx.jsp</param>
<param name="charSet">UTF-8</param><!-- ファイル読み取り時のエンコードを指定します -->
</結果>
結果では、${attribute name} 式を使用して、アクション内の属性にアクセスすることもできます。式内の属性名は、アクション内の属性に対応します。次のように:
<result type="redirect">view.jsp?id=${id}</result>
3. 複数のアクションが 1 つのビューを共有 - グローバルな結果構成
同じビューが複数のアクションで使用される場合、結果をグローバル ビューとして定義する必要があります。グローバル フォワードは struts1 で提供され、同様の関数が struts2 でも提供されます。
<パッケージ....>
<グローバル結果>
<result name="message">/message.jsp</result>
</global-results>
</パッケージ>
4.アクションプロパティに値を注入する
Struts2 は、Action のプロパティに対する依存関係注入機能を提供します。struts2 設定ファイルでは、Action のプロパティに簡単に値を注入できます。注: プロパティはセッター メソッドを提供する必要があります。
パブリック クラス HelloWorldAction{
プライベート文字列の保存パス。
public String getSavePath() {
保存パスを返します。
}
public void setSavePath(String savePath) {
this.savePath = 保存パス;
}
...
}
<package name="csdn" namespace="/test" extends="struts-default">
<アクション名="helloworld" >
<param name="savePath">/images</param>
<result name="success">/WEB-INF/page/hello.jsp</result>
</アクション>
</パッケージ>
上記は、<param> ノードを介してアクションの savePath 属性に「/images」を挿入します。
5. Struts 2 で処理する必要があるリクエストのサフィックスを指定します。
以前は、アクションにアクセスするためにデフォルトで .action サフィックスを使用していました。実際、デフォルトのサフィックスは定数「struts.action.extension」を使用して変更できます。たとえば、サフィックスとして .do を持つリクエスト パスのみを処理するように Struts 2 を設定できます。
<?xml バージョン="1.0" エンコーディング="UTF-8"?>
<!DOCTYPE ストラット PUBLIC
"-//Apache Software Foundation//DTD Struts 構成 2.0//EN"
「http://struts.apache.org/dtds/struts-2.0.dtd」
<支柱>
<constant name="struts.action.extension" value="do"/>
</ストラット>
ユーザーが複数のリクエストサフィックスを指定する必要がある場合は、複数のサフィックスをカンマ (,) で区切ります。のように:
<constant name="struts.action.extension" value="do,go"/>
6. 定数の定義を詳しく説明する
定数は struts.xml または struts.properties で構成できます。 2 つの構成方法は次のとおりです。
struts.xml ファイルで定数を構成する
<支柱>
<constant name="struts.action.extension" value="do"/>
</ストラット>
struts.properties で定数を構成する
struts.action.extension=do
定数は以下の複数の構成ファイルで定義できるため、struts2 が定数をロードする検索順序を理解する必要があります。
struts-default.xml
struts-plugin.xml
struts.xml
struts.プロパティ
web.xml
複数のファイルで同じ定数を設定した場合、前のファイルで設定した定数値は、後のファイルで設定した定数値で上書きされます。
7. よく使用される定数の概要
<!-- HttpServletRequest の setCharacterEncoding メソッドと freemarker および Velocity の出力に作用するデフォルトのエンコーディング セットを指定します -->
<constant name="struts.i18n.encoding" value="UTF-8"/>
<!-- この属性は、Struts 2 によって処理される必要がある要求サフィックスを指定します。この属性のデフォルト値は action です。つまり、*.action に一致するすべての要求は Struts2 によって処理されます。
ユーザーが複数のリクエストサフィックスを指定する必要がある場合は、複数のサフィックスをカンマ (,) で区切ります。 -->
<constant name="struts.action.extension" value="do"/>
<!-- ブラウザが静的コンテンツをキャッシュするかどうかを設定します。デフォルト値は true (運用環境で使用) であり、開発段階ではオフにすることをお勧めします。 -->
<constant name="struts.serve.static.browserCache" value="false"/>
<!-- Struts 構成ファイルが変更された場合、システムがファイルを自動的に再ロードするかどうか、デフォルト値は false (運用環境で使用)、開発段階で有効にすることをお勧めします -->
<constant name="struts.configuration.xml.reload" value="true"/>
<!-- 開発モードで使用すると、より詳細なエラー メッセージを出力できます -->
<constant name="struts.devMode" value="true" />
<!--デフォルトのビューテーマ-->
<constant name="struts.ui.theme" value="simple" />
<! Spring と統合する場合、Spring がアクション オブジェクトの作成を担当することを指定します -->
<constant name="struts.objectFactory" value="spring" />
<!このプロパティは、Struts 2 が動的メソッド呼び出しをサポートするかどうかを設定します。このプロパティのデフォルト値は true です。動的メソッド呼び出しをオフにする必要がある場合は、このプロパティを false に設定できます。 -->
<constant name="struts.enable.DynamicMethodInvocation" value="false"/>
<!--アップロードされるファイルのサイズ制限-->
<constant name="struts.multipart.maxSize" value="10701096"/>
8. アプリケーションに複数の Struts 構成ファイルを指定する
ほとんどのアプリケーションでは、アプリケーションの規模が増加するにつれて、システム内のアクションの数も大幅に増加し、struts.xml 構成ファイルが非常に肥大化します。 struts.xml ファイルが大きくなりすぎて肥大化するのを避け、struts.xml ファイルの読みやすさを向上させるために、struts.xml 構成ファイルを複数の構成ファイルに分解し、他の構成ファイルを struts.xml に含めることができます。ファイル。次の struts.xml では、<include> 要素を通じて複数の構成ファイルを指定します。
<?xml バージョン="1.0" エンコーディング="UTF-8"?>
<!DOCTYPE ストラット PUBLIC
"-//Apache Software Foundation//DTD Struts 構成 2.0//EN"
「http://struts.apache.org/dtds/struts-2.0.dtd」
<支柱>
<include file="struts-user.xml"/>
<include file="struts-order.xml"/>
</ストラット>
このようにして、Struts 2 アクションをモジュールごとに複数の構成ファイルに追加できます。
9. 動的メソッド呼び出し
アクションに複数のメソッドがある場合は、!+メソッド名を使用して、指定されたメソッドを呼び出すことができます。次のように:
パブリック クラス HelloWorldAction{
プライベート文字列メッセージ。
....
public Stringexecute() は例外をスローします{
this.message = "私の最初の struts2 アプリケーション";
「成功」を返します。
}
public String other() が例外をスローする{
this.message = "2 番目の方法";
「成功」を返します。
}
}
上記のアクションにアクセスするための URL パスが /struts/test/helloworld.action であると仮定します。
アクションの other() メソッドにアクセスするには、次のように呼び出すことができます。
/struts/test/helloworld!other.action
動的メソッド呼び出しを使用したくない場合は、定数 struts.enable.DynamicMethodInvocation を使用して動的メソッド呼び出しをオフにすることができます。
<constant name="struts.enable.DynamicMethodInvocation" value="false"/>
10. ワイルドカードを使用してアクションを定義する
<package name="csdn" namespace="/test" extends="struts-default">
<アクション名="helloworld_*" メソッド="{1}">
<result name="success">/WEB-INF/page/hello.jsp</result>
</アクション>
</パッケージ>
パブリック クラス HelloWorldAction{
プライベート文字列メッセージ。
....
public Stringexecute() は例外をスローします{
this.message = "私の最初の struts2 アプリケーション";
「成功」を返します。
}
public String other() が例外をスローする{
this.message = "2 番目の方法";
「成功」を返します。
}
}
other() メソッドにアクセスするには、次のような URL を通じてアクセスできます: /test/helloworld_other.action
11. リクエストパラメータの受信
基本型を使用してリクエストパラメータを受信します(get/post)
Actionクラスにリクエストパラメータと同名の属性を定義すると、struts2が自動的にリクエストパラメータを受け取り、同名の属性に割り当てることができます。
リクエストパス: http://localhost:8080/test/view.action?id=78
パブリック クラス ProductAction {
プライベート整数 ID。
public void setId(Integer id) {//struts2 は、リフレクション技術を使用して、リクエスト パラメータと同じ名前のプロパティの setter メソッドを呼び出し、リクエスト パラメータ値を取得します。
this.id = ID;
}
public Integer getId() {ID を返す;}
}
複合タイプを使用してリクエスト パラメーターを受信します。 リクエスト パス: http://localhost:8080/test/view.action?product.id=78
パブリック クラス ProductAction {
プライベートプロダクト製品。
public void setProduct(Product product) { this.product = product }
public Product getProduct() {製品を返す;}
}
Struts2 は、まずリフレクション技術を通じて Product のデフォルトのコンストラクターを呼び出してプロダクト オブジェクトを作成し、次にリフレクション技術を通じてプロダクト内のリクエスト パラメーターと同じ名前のプロパティの setter メソッドを呼び出してリクエスト パラメーターの値を取得します。
12. 型変換の意味
スマート MVC フレームワークの場合、B/S (ブラウザ/サーバー) 構造アプリケーションのリクエスト パラメーターはブラウザーを介してサーバーに送信されるため、これらのパラメーターは豊富なデータ型を持つことができません。変換はサーバー側で完了する必要があります
MVC フレームワークはプレゼンテーション層ソリューションであり、型変換サポートを提供する必要があります。Struts2 は非常に強力な型変換サポートを提供します。
13. プレゼンテーション層データの処理
Web アプリケーションの場合、プレゼンテーション層は主に、ユーザー入力データの収集やユーザーへのサーバーのステータスの提示など、ユーザーとの対話に使用されます。したがって、プレゼンテーション層のデータの流れは主に入力データと出力データの 2 方向になります。
入力データの場合: 文字列データから複数の種類のデータへの変換を完了する必要があります。通常、プログラムは自動的に完了することができないため、コード内で手動で変換する必要があります。
出力データの場合: java と jsp は両方とも、複数のデータ型の直接出力をサポートしています。
プレゼンテーション層のもう 1 つのデータ処理は、データ検証です。これは、クライアント検証とサーバー側検証に分けられます。これについては、後で詳しく説明します。
14. 型変換
HTTP パラメータはすべて文字列型です。 保存されるデータは、文字列、数値、ブール値、日付と時刻など、または JavaBean タイプです。 文字列を日付に変換するなどの手動型変換: request.getParameter メソッドを使用して文字列を取得し、DateFormat.parse メソッドを使用して文字列を Date オブジェクトに変換します。
15. Struts2の型変換
Struts2の組み込み型変換
文字列とブール値により、文字列値とブール値の間の変換が完了します。
通常の文字列と文字の間の文字列と文字の変換
String、int、および Integer は、文字列と整数の間の変換を完了します。
String と Long は、文字列と Long 整数値の間の変換を完了します。
String、double、Double は、文字列と倍精度浮動小数点値の変換を完了します。
String と Float は、文字列と単精度浮動小数点の間の変換を完了します。
文字列と日付は、文字列型と日付型の間の変換を完了します。日付形式は、ユーザーが形式を要求したロケールの SHORT 形式を使用します。
文字列と配列 デフォルトの場合、配列要素は文字列です。ユーザーが型コンバーターを定義する場合は、他の複合データ型にすることもできます。
文字列とマップとリスト
16. Struts型変換API
Struts2 の型コンバータは実際には OGNL に基づいて実装されています。OGNL プロジェクトには ognl.TypeConverter インターフェイスがあり、このインターフェイスは型コンバータを実装するために実装する必要があります。インターフェースは次のように定義されます。
パブリック インターフェイス TypeConverter {
public Object ConvertValue(マップ arg0, オブジェクト arg1, メンバー arg2, 文字列 arg3,
オブジェクト arg4、クラス arg5) {
null を返します。
}
型コンバータを実装するには、上記の TypeConverter を実装する必要があります。ただし、上記のインターフェイスのメソッドは複雑すぎるため、OGNL プロジェクトでは、このインターフェイスの実装クラス ognl.DefaultTypeConverter も提供しています。これにより、独自の型コンバータを実装できます。このクラスを継承するクラスは次のように定義されます。
public class DefaultTypeConverter extends Objectimplements TypeConverter{
public Object ConvertValue(Map<String,Object> context, Object value, Class toType) {
}
……//その他の方法
}
ConvertValue メソッドの役割は型変換を完了することですが、この型変換は双方向です。文字列をオブジェクト インスタンスに変換する必要がある場合、このメソッドはオブジェクト インスタンスを文字列に変換するときにも使用されます。使用済み。この変換は、変換する必要があるターゲットの型である toType パラメーターの型を通じて行われます。したがって、変換方向は toType パラメータに基づいて決定できます。
ConvertValue メソッドのパラメータと戻り値の意味 最初のパラメータ: context は型変換環境のコンテキストです。2 番目のパラメータ: value は変換する必要があるパラメータです。 value パラメータの値も変換方向によって異なります。
3 番目のパラメータ: toType は変換後のターゲットの型です。このメソッドの戻り値は型変換後の値です。値の型も変換の方向によって変わります。変換された ConvertValue メソッドは、変換する必要がある値を受け入れ、変換する必要があるターゲットの型はパラメーターであり、変換されたターゲット値を返すことがわかります。
Value が文字列配列なのはなぜですか?
DefaultTypeConverter コンバーターの場合、最も一般的な状況を考慮する必要があるため、すべてのリクエスト パラメーターを文字列ではなく文字列配列として扱います。 getParameterValues()で取得したパラメータ値に相当