1. 国際化
リソースファイルを用意します。リソースファイルの命名形式は以下のとおりです。
BaseName_言語_国.properties
BaseName_言語.properties
BaseName.properties
このうち、baseNameはリソースファイルのベース名です。カスタマイズ可能ですが、言語と国はJavaでサポートされている言語と国でなければなりません。のように:
中国本土:baseName_zh_CN.properties
米国:baseName_en_US.properties
次に、2 つのリソース ファイルをアプリケーションに追加します。
最初のものは中国語を格納します: csdn_zh_CN.properties
コンテンツは次のとおりです: welcome=Chuanzhi Podcast へようこそ 2 番目のデポジトリは英語 (米国): csdn_en_US.properties
内容は次のとおりです: welcome=csdn へようこそ
中国語のプロパティ ファイルの場合は、ファイルを作成した後、jdk が提供するnative2ascii コマンドを使用して、ファイルを Unicode でエンコードされたファイルに変換する必要があります。コマンドは次のように使用されます。
Native2ascii ソース ファイル.プロパティ ターゲット ファイル.プロパティ
2. グローバルリソースの設定と国際情報の出力
リソース ファイルを準備した後、次のように struts.xml の struts.custom.i18n.resources 定数を使用してリソース ファイルをグローバル リソース ファイルとして定義できます。
<constant name="struts.custom.i18n.resources" value="csdn" />
csdn はリソース ファイルのベース名です。
後で、ページまたはアクションで国際化情報にアクセスできます。
JSP ページで <s:text name=""/> タグを使用して、国際化情報を出力します。
<s:text name="user"/>、名前はリソース ファイルのキーです
Action クラスでは、ActionSupport を継承し、getText() メソッドを使用して国際化情報を取得できます。このメソッドの最初のパラメーターは、リソース ファイル内のキーを指定するために使用されます。
form タグでは、次のように key 属性を通じてリソース ファイル内のキーを指定します。
<s:textfield name="realname" key="user"/>
3. 国際化 - 国際化情報をプレースホルダーとともに出力します
リソースファイルの内容は以下のとおりです。
ようこそ = {0}、Chuanzhi ポッドキャスト {1} へようこそ
JSPページのプレースホルダを使用して国際化情報を出力します
<s:text name="ようこそ">
<s:param><s:property value="realname"/></s:param>
<s:param>学習</s:param>
</s:テキスト>
Action クラスのプレースホルダーを使用して国際化情報を取得するには、getText(String key, String[] args) メソッドまたは getText(String aTextName, List args) メソッドを使用できます。
4. 国際化 - スコープリソースファイル
大規模なアプリケーションでは、アプリケーション全体に国際化する必要がある大量のコンテンツが含まれており、すべての国際化コンテンツをグローバル リソース属性ファイルに配置すると、明らかにリソース ファイルが大きくなりすぎ、不便になります。これを維持するには、パッケージ スコープを使用して、さまざまなモジュールの国際化ファイルを整理することができます。
その方法は次のとおりです。
package_ language_country.properties リソース ファイルを Java パッケージの下に配置します。パッケージは、このパッケージの下にあるアクションの固定メソッドであり、サブパッケージはこのリソースにアクセスできます。指定されたキーを持つメッセージを検索する場合、システムはまずパッケージのリソース ファイルから検索します。対応するキーが見つからない場合は、定数 struts.custom.i18n.resources で指定されたリソース ファイルから検索します。
5. 国際化アクションスコープリソースファイル
次のように、アクションに対してリソース ファイルを個別に指定することもできます。
Action クラスが配置されているパスに、ActionClassName_ language_country.properties リソース ファイルを配置します。ActionClassName は、アクション クラスの単純な名前です。
指定されたキーを持つメッセージを検索する場合、システムはまず ActionClassName_ language_country.properties リソース ファイルから検索します。対応するキーが見つからない場合は、現在のパッケージに沿って基本名パッケージのリソース ファイルを検索します。最上位のパッケージ。対応するキーが見つからない場合は、最終的に定数 struts.custom.i18n.resources で指定されたリソース ファイルから検索されます。
6. 国際化 - JSP 内のリソース ファイルへの直接アクセス
Struts2 は <s:i18n> タグを提供します。 <s:i18n> タグを使用すると、構成を行わずにクラスパス上のリソース ファイルから国際化されたデータを直接取得できます。
<s:i18n name="csdn">
<s:text name="ようこそ"/>
</s:i18n>
csdn は、クラスパス内のリソース ファイルのベース名です。
アクセスしたいリソース ファイルがクラスパス上の特定のパッケージの下にある場合は、次のようにしてアクセスできます。
<s:i18n name="cn/csdn/action/package">
<s:text name="ようこそ">
<s:param>シャオ・ジャン</s:param>
</s:テキスト>
</s:i18n>
上記は、基本的に cn.csdn.action パッケージの下の package という名前のリソース ファイルにアクセスします。
7. OGNL 式言語
OGNL は Object Graphic Navigation Language の略称で、オープンソース プロジェクトです。 Struts 2 フレームワークは、デフォルトの式言語として OGNL を使用します。
EL 式と比較すると、通常必要となる次のような関数がいくつか提供されます。
xxx.sayHello() などのオブジェクト メソッド呼び出しをサポートします。
クラスの静的メソッドの呼び出しと値へのアクセスをサポートします。式の形式は @[完全なクラス名 (パッケージ パスを含む)]@[メソッド名] です。例: @java.lang.String@format('foo %s' 、'bar') または @cn.csdn.Constant@APP_NAME;
コレクションオブジェクトを操作します。
Ognl にはコンテキストの概念があり、コンテキストは java.utils.Map インターフェイスを実装する MAP 構造です。Struts2 では、コンテキストの実装は ActionContext です。
コンテキスト内のオブジェクトにアクセスするには、# 記号を使用して、#application、#session などの名前空間をマークする必要があります。
また、OGNLはルートオブジェクト(root object)を設定します。Struts2ではルートオブジェクトはValueStack(バリュースタック)となります。ルート オブジェクト (つまり、ValueStack) 内のオブジェクトのプロパティにアクセスする場合は、 # 名前空間を省略して、オブジェクトのプロパティに直接アクセスできます。
struts2 では、ルート オブジェクト ValueStack の実装クラスは OgnlValueStack です。このオブジェクトは、想像したように単一の値を格納するだけではなく、オブジェクトのグループを格納します。 OgnlValueStack クラスにはリスト型のルート変数があり、オブジェクトのグループを格納するために使用されます。
|--リクエスト
|--アプリケーション
コンテキスト -------|--OgnlValueStack ルート変数 [アクション、OgnlUtil、...]
|--セッション
|--属性
|--パラメータ
ルート変数の最初のオブジェクトは、スタックの最上位オブジェクトと呼ばれます。通常、ルート変数内のオブジェクトのプロパティにアクセスするには、プロパティがスタック上のオブジェクトに存在しない場合、検索シーケンスがスタックの最上位のオブジェクトから始まります。スタックの一番上にある場合は 2 番目のオブジェクトから検索され、見つからない場合は 3 番目のオブジェクトから検索され、見つかるまで順番にアクセスされます。
注意: Struts2 では、OGNL 式を Struts タグとともに使用する必要があります。例: <s:property value="name"/>
ValueStack は Struts 2 の OGNL のルート オブジェクトであるため、ユーザーが値スタック内のオブジェクトにアクセスする必要がある場合、JSP ページは次の EL 式を通じて ValueStack 内のオブジェクトのプロパティに直接アクセスできます。
${foo} //値スタック内のオブジェクトの foo 属性を取得します
他の Context 内のオブジェクトにアクセスする場合、それらはルート オブジェクトではないため、アクセスするときに # プレフィックスを追加する必要があります。
application オブジェクト: #application.userName や #application['userName'] など、ServletContext にアクセスするために使用されます。これは、ServletContext の getAttribute("username") を呼び出すことと同等です。
session オブジェクト: #session.userName や #session['userName'] など、HttpSession にアクセスするために使用されます。これは session.getAttribute("userName") を呼び出すことと同等です。
request オブジェクト: #request.userName や #request['userName'] などの HttpServletRequest 属性にアクセスするために使用されるマップ。これは request.getAttribute("userName") を呼び出すのと同等です。
パラメータ オブジェクト: #parameters.userName や #parameters['userName'] などの HTTP リクエスト パラメータにアクセスするために使用されます。これは request.getParameter("username") を呼び出すのと同等です。
attr オブジェクト: ページ -> リクエスト -> セッション -> アプリケーションの順序で属性にアクセスするために使用されます。
8. EL 式を使用して valueStack 内のオブジェクトのプロパティにアクセスできるのはなぜですか?
その理由は、Struts2 が HttpServletRequest をさらにカプセル化するためです。簡略化されたコードは次のとおりです。
public class StrutsRequestWrapper extends HttpServletRequestWrapper {
public StrutsRequestWrapper(HttpServletRequest req) {
スーパー(要求);
}
public Object getAttribute(String s) {
...
ActionContext ctx = ActionContext.getContext();
Objectattribute = super.getAttribute(s);//まずリクエストスコープから属性値を取得します
if (ctx != null) {
if (attribute == null) {//リクエスト範囲から属性値が見つからない場合は、ValueStack からオブジェクトの属性値を検索します
...
ValueStack スタック = ctx.getValueStack();
属性 = stack.findValue(s);
...
}
}
属性を返す;
}
}
9. OGNL 式を使用してリスト/マップ コレクション オブジェクトを作成する
コレクション要素 (List オブジェクトや Map オブジェクトなど) が必要な場合は、OGNL でコレクション関連の式を使用できます。
List オブジェクトを直接生成するには、次のコードを使用します。
<s:set name="list" value="{'zhangming','xiaoi','liming'}" />
<s:iterator value="#list" id="n">
<s:property value="n"/><br>
</s:イテレータ>
Map オブジェクトを生成します。
<s:set name="foobar" value="#{'foo1':'bar1', 'foo2':'bar2'}" />
<s:iterator value="#foobar" >
<s:property value="key"/>=<s:property value="value"/><br>
</s:イテレータ>
Set タグは、指定された範囲に値を配置するために使用されます。
スコープ: この属性は、アプリケーション、セッション、リクエスト、ページ、またはアクションを受け入れることができる変数を配置するスコープを指定します。この属性が設定されていない場合、デフォルトで OGNL コンテキストに配置されます。
value: 変数に割り当てられる値。この属性が設定されていない場合、ValueStack スタックの最上位の値が変数に割り当てられます。