1. 型変換の意味
スマート MVC フレームワークの場合、B/S (ブラウザ/サーバー) 構造アプリケーションのリクエスト パラメーターはブラウザーを介してサーバーに送信されるため、これらのパラメーターは豊富なデータ型を持つことができません。変換はサーバー側で完了する必要があります
MVC フレームワークはプレゼンテーション層ソリューションであり、型変換サポートを提供する必要があります。Struts2 は非常に強力な型変換サポートを提供します。
2. プレゼンテーション層データの処理
1. Web アプリケーションの場合、プレゼンテーション層は主に、ユーザー入力データの収集やユーザーへのサーバーのステータスの提示など、ユーザーとの対話に使用されます。したがって、プレゼンテーション層のデータの流れは主に入力データと出力データの 2 方向になります。
2. 入力データの場合:文字列データから複数種類のデータへの変換が完了している必要があります。通常、プログラムは自動的に完了することができないため、コード内で手動で変換する必要があります。
3. 出力データの場合: java と jsp は両方とも、複数のデータ型の直接出力をサポートしています。
4. プレゼンテーション層のもう 1 つのデータ処理は、データ検証です。これは、クライアント検証とサーバー側検証に分けられます。これについては、後で詳しく説明します。
3. 型変換
1. HTTP パラメータはすべて文字列型です。 保存されるデータは、文字列、数値、ブール値、日付と時刻など、または JavaBean タイプです。 文字列を日付に変換するなどの手動型変換: request.getParameter メソッドを使用して文字列を取得し、DateFormat.parse メソッドを使用して文字列を Date オブジェクトに変換します。
2. Struts2の型変換
Struts2の組み込み型変換
文字列とブール値により、文字列値とブール値の間の変換が完了します。
通常の文字列と文字の間の文字列と文字の変換
String、int、および Integer は、文字列と整数の間の変換を完了します。
String と Long は、文字列と Long 整数値の間の変換を完了します。
String、double、Double は、文字列と倍精度浮動小数点値の変換を完了します。
String と Float は、文字列と単精度浮動小数点の間の変換を完了します。
文字列と日付は、文字列型と日付型の間の変換を完了します。日付形式は、ユーザーが形式を要求したロケールの SHORT 形式を使用します。
文字列と配列 デフォルトの場合、配列要素は文字列です。ユーザーが型コンバーターを定義する場合は、他の複合データ型にすることもできます。
文字列とマップとリスト
Struts2の組み込み型変換
文字列とブール値により、文字列値とブール値の間の変換が完了します。
通常の文字列と文字の間の文字列と文字の変換
String、int、および Integer は、文字列と整数の間の変換を完了します。
String と Long は、文字列と Long 整数値の間の変換を完了します。
String、double、Double は、文字列と倍精度浮動小数点値の変換を完了します。
String と Float は、文字列と単精度浮動小数点の間の変換を完了します。
文字列と日付は、文字列型と日付型の間の変換を完了します。日付形式は、ユーザーが形式を要求したロケールの SHORT 形式を使用します。
文字列と配列 デフォルトの場合、配列要素は文字列です。ユーザーが型コンバーターを定義する場合は、他の複合データ型にすることもできます。
文字列とマップとリスト
3. 組み込みの型変換
4. 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, Objectvalue, ClasstoType) {
}
……//その他の方法
}
ConvertValue メソッドの役割は型変換を完了することですが、この型変換は双方向です。文字列をオブジェクト インスタンスに変換する必要がある場合、このメソッドはオブジェクト インスタンスを文字列に変換するときにも使用されます。使用済み。この変換は、変換する必要があるターゲットの型である toType パラメーターの型を通じて行われます。したがって、変換方向は toType パラメータに基づいて決定できます。
ConvertValue メソッドのパラメータと戻り値の意味 最初のパラメータ: context は型変換環境のコンテキストです。2 番目のパラメータ: value は変換する必要があるパラメータです。 value パラメータの値も変換方向によって異なります。
3 番目のパラメータ: toType は変換後のターゲットの型です。このメソッドの戻り値は型変換後の値です。値の型は変換の方向によっても変わります。変換された ConvertValue メソッドは、変換する必要がある値を受け入れ、変換する必要があるターゲットの型はパラメーターであり、変換されたターゲット値を返すことがわかります。
Value が文字列配列なのはなぜですか?
DefaultTypeConverter コンバーターの場合、最も一般的な状況を考慮する必要があるため、すべてのリクエスト パラメーターを文字列ではなく文字列配列として扱います。 getParameterValues()で取得したパラメータ値に相当
4. 型コンバータの実装
1. ファーストステップ登録ページ
2. 2 番目のステップ: ユーザーカプセル化クラスの実装
3. 3 番目のステップ: Action クラスの実装
5. ステップ 5: 型コンバーターを登録する 登録方法は 3 つあります。
1. ローカル型コンバーターを登録します。ローカル型コンバーターは、特定のアクションのプロパティでのみ機能します。
2. グローバル型コンバーターを登録します。グローバル型コンバーターは、アクションのすべての特定の属性に影響します。
3. JDK1.5 アノテーションを使用して型コンバータを登録します。登録を通じて型コンバータを生成します。
6. 部分型コンバーター登録登録ファイル名の形式: ActionName-conversion.properties: ActionName は、コンバーターを有効にするために必要なアクションのクラス名であり、以下の -conversion.properties 文字列は、部分または部分を修正する場合の一般的なプロパティー・ファイルです。ファイルの内容は、次のとおりです。 userAction-conversion.properties ファイルの内容は次のとおりです。
#型変換を完了するには、UserAction のユーザー属性で redarmy.user.UserConverter クラスを使用する必要があることを指定します
user=redarmy.user.UserConverter
注: 上記のプロパティ ファイルは、UserAction と同じパッケージ内にある必要があります。つまり、上記の場合、上記のメソッドを使用してローカル型変換を実現できます。
7. グローバル型コンバータ登録名のファイル形式:xwork-conversion.properties ファイル このファイルもプロパティファイルであり、その内容も「複合型=対応型コンバータクラス」の項目で構成されます。
xwork-conversion.properties ファイルの内容は次のとおりです。
#すべての redarmy.user.User クラスの型コンバータを redarmy.user.UserConverter として指定します
redarmy.user.User=redarmy.user.UserConverter
注: xwork-conversion.properties ファイルは、クラス フォルダー、つまり src の下に作成する必要があります。
5. Struts2のカスタム型変換
StrutsTypeConverter クラスは、カスタム型変換の設計を簡素化するために Struts2 で提供されています。このクラスには、実装する必要がある 2 つの抽象メソッドがあります。
(1) public Object ConvertFromString(Map context, String[] value, Class toClass);
文字列型データをカスタム型に変換するために使用される処理メソッド パラメーター:
context --- アクションに関連するコンテキスト情報
値 --- リクエストから取得したパラメータ値
toClass --- 変換されるターゲットの型
(2) public String ConvertToString(Map context, Object obj);
カスタム型を文字列に変換するために使用されます
パラメータ:
context --- アクションに関連するコンテキスト情報
obj --- カスタム タイプのオブジェクト
分析例: 日付型変換の設計と構成
(1) MyDateTypeConverter を設計し、StrutsTypeConverter を継承し、その 2 つのメソッドをカバーします。 参考コードは次のとおりです。
public Object ConvertFromString(Map context, String[] value, Class toClass) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
試す{
日付 v = sdf.parse(values[0]);
v を返します。
}catch(例外 e){
e.printStackTrace();
新しい Date() を返します。
}
}
続き
public String ConvertToString(Map context, Object obj) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日");
日付 v = (日付)obj;
sdf.format(v) を返します。
}
Struts2 はデフォルトで文字列と日付の変換をサポートしていますが、短い形式とローカライズされた日付形式の変換のみをサポートしているため、独自の型変換を実装する必要がある場合があります。
(2) UserInfoクラスに誕生日属性を追加します。その型はjava.util.Dateです。
パブリック クラス UserInfo {
プライベート整数 ID。
プライベート文字列名。
プライベート文字列パスワード。
プライベート 日付 誕生日;
...
}
(3) UserInfo コンポーネントの型コンバータを設定します。まず、UserInfo コンポーネントのクラス名に基づいてプロパティ ファイルを作成します。ファイルの命名形式はクラス名-conversion.properties です。
たとえば、UserInfo-conversion.properties
このファイルは、UserInfo コンポーネントと同じパッケージ内に存在する必要があります。
この機能ファイルのコンテンツ形式は次のとおりです。
誕生日=デモ.コンバータ.MyDateTypeConverter
例証します:
誕生日は、UserInfo コンポーネントの java.util.Date 型の属性名です。
demo.converter.MyDateTypeConverter はカスタム変換実装クラスです。
Strus2 フレームワークはこれを考慮し、これを処理する簡単な方法を提供します。
グローバル レベルで型コンバータを構成するには、次の内容を含む xwork-conversion.properties という名前のプロパティ ファイルを /WEB-INF/classes ディレクトリに配置する必要があります。
java.util.Date=demo.converter.MyDateTypeConverter
6. カスタム型コンバーター
java.util.Date 型のプロパティは、2009-07-20 の形式でリクエスト パラメータ値を受け取ることができます。ただし、リクエスト パラメーターを 20091221 の形式で受け取る必要がある場合は、型コンバーターを定義する必要があります。そうしないと、struts2 は型変換を自動的に完了できません。
java.util.Dateをインポートします。
パブリック クラス HelloWorldAction {
プライベート日付作成時刻;
public Date getCreatetime() {
作成時間を返します。
}
public void setCreatetime(Date createtime) {
this.createtime = 作成時間;
}
}
public class DateConverter extends DefaultTypeConverter {
@Override public Object ConvertValue(Map context, Object value, Class toType) {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");
試す {
if(toType == Date.class){//文字列をDate型に変換する場合
String[] params = (String[]) 値;// Request.getParameterValues()
return dateFormat.parse(params[0]);
}else if(toType == String.class){//日付を文字列に変換する場合
日付 date = (日付) 値;
dateFormat.format(日付)を返します。
}
} キャッチ (ParseException e) {}
null を返します。
}
}
上記の型コンバーターをローカル型コンバーターとして登録します。
ActionClassName-conversion.properties ファイルを、Action クラスが配置されているパッケージの下に配置します。ActionClassName は Action のクラス名であり、次の -conversion.properties は固定の書き込みメソッドです。この例では、ファイルの名前は次のようになります。 HelloWorldAction-conversion.properties。プロパティ ファイルの内容は次のとおりです。
プロパティ名 = 型コンバーターの完全なクラス名 この例では、HelloWorldAction-conversion.properties ファイルの内容は次のとおりです。
createtime= cn.csdn.conversion.DateConverter
上記の型コンバーターをグローバル型コンバーターとして登録します。
xwork-conversion.properties ファイルを WEB-INF/classes の下に配置します。プロパティ ファイルの内容は次のとおりです。
変換される型 = 型コンバーターの完全修飾クラス名 この例では、xwork-conversion.properties ファイルの内容は次のとおりです。
java.util.Date= cn.csdn.conversion.DateConverter
java.util.Date 型のプロパティは、2009-07-20 の形式でリクエスト パラメータ値を受け取ることができます。ただし、リクエスト パラメーターを 20091221 の形式で受け取る必要がある場合は、型コンバーターを定義する必要があります。そうしないと、struts2 は型変換を自動的に完了できません。
java.util.Dateをインポートします。
パブリック クラス HelloWorldAction {
プライベート日付作成時刻;
public Date getCreatetime() {
作成時間を返します。
}
public void setCreatetime(Date createtime) {
this.createtime = 作成時間;
}
}
public class DateConverter extends DefaultTypeConverter {
@Override public Object ConvertValue(Map context, Object value, Class toType) {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");
試す {
if(toType == Date.class){//文字列をDate型に変換する場合
String[] params = (String[]) 値;// Request.getParameterValues()
return dateFormat.parse(params[0]);
}else if(toType == String.class){//日付を文字列に変換する場合
日付 date = (日付) 値;
dateFormat.format(日付)を返します。
}
} キャッチ (ParseException e) {}
null を返します。
}
}
上記の型コンバーターをローカル型コンバーターとして登録します。
ActionClassName-conversion.properties ファイルを、Action クラスが配置されているパッケージの下に配置します。ActionClassName は Action のクラス名であり、次の -conversion.properties は固定の書き込みメソッドです。この例では、ファイルの名前は次のようになります。 HelloWorldAction-conversion.properties。プロパティ ファイルの内容は次のとおりです。
プロパティ名 = 型コンバーターの完全なクラス名 この例では、HelloWorldAction-conversion.properties ファイルの内容は次のとおりです。
createtime= cn.csdn.conversion.DateConverter
上記の型コンバーターをグローバル型コンバーターとして登録します。
xwork-conversion.properties ファイルを WEB-INF/classes の下に配置します。プロパティ ファイルの内容は次のとおりです。
変換される型 = 型コンバーターの完全修飾クラス名 この例では、xwork-conversion.properties ファイルの内容は次のとおりです。
java.util.Date= cn.csdnconversion.DateConverter