Struts-2-struts-type-conversion
Struts 2-タイプ変換
HTTPリクエストのすべては、プロトコルによって String として扱われます。 これには、数字、ブール値、整数、日付、小数などが含まれます。 ただし、Strutsクラスでは、任意のデータ型のプロパティを使用できます。
Strutsはどのようにプロパティを自動配線しますか?
*Struts* は、カバーの下にあるさまざまなタイプコンバーターを使用して、重量物を持ち上げます。
たとえば、Actionクラスに整数属性がある場合、Strutsは何もせずに要求パラメーターを整数属性に自動的に変換します。 デフォルトでは、Strutsには多数のタイプコンバーターが付属しています
あなたが以下にリストされたコンバータのいずれかを使用している場合、あなたは心配することは何もありません-
- 整数、浮動小数点、倍精度、10進数
- 日付と日時
- 配列とコレクション
- 列挙型
- ブール値
- BigDecimal
独自のデータ型を使用している場合、表示する前にこれらの値を変換する方法をStrutsに認識させるために独自のコンバーターを追加する必要があります。 次のPOJOクラス Environment.java を検討してください。
package com.finddevguides.struts2;
public class Environment {
private String name;
public Environment(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
これは name という属性を持つ非常に単純なクラスなので、このクラスについて特別なことは何もありません。 システム- SystemDetails.java に関する情報を含む別のクラスを作成しましょう。
この演習では、環境を「開発」に、オペレーティングシステムを「Windows XP SP3」にハードコーディングしました。
リアルタイムプロジェクトでは、この情報をシステム構成から取得します。
私たちは次のアクションクラスを持ってみましょう-
package com.finddevguides.struts2;
import com.opensymphony.xwork2.ActionSupport;
public class SystemDetails extends ActionSupport {
private Environment environment = new Environment("Development");
private String operatingSystem = "Windows XP SP3";
public String execute() {
return SUCCESS;
}
public Environment getEnvironment() {
return environment;
}
public void setEnvironment(Environment environment) {
this.environment = environment;
}
public String getOperatingSystem() {
return operatingSystem;
}
public void setOperatingSystem(String operatingSystem) {
this.operatingSystem = operatingSystem;
}
}
次に、単純なJSPファイル System.jsp を作成して、環境とオペレーティングシステムの情報を表示します。
<%@ page language = "java" contentType = "text/html; charset = ISO-8859-1"
pageEncoding = "ISO-8859-1"%>
<%@ taglib prefix = "s" uri = "/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>System Details</title>
</head>
<body>
Environment: <s:property value = "environment"/><br/>
Operating System:<s:property value = "operatingSystem"/>
</body>
</html>
*struts.xml* を使用して、 *system.jsp* と *SystemDetails.java* クラスをまとめて配線しましょう。
SystemDetailsクラスには、文字列「 SUCCESS 」を返す単純なexecute()メソッドがあります。
<?xml version = "1.0" Encoding = "UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name = "struts.devMode" value = "true"/>
<package name = "helloworld" extends = "struts-default">
<action name = "system"
class = "com.finddevguides.struts2.SystemDetails"
method = "execute">
<result name = "success">/System.jsp</result>
</action>
</package>
</struts>
- プロジェクト名を右クリックし、[エクスポート]> [WARファイル]をクリックして、WARファイルを作成します。
- 次に、このWARをTomcatのwebappsディレクトリにデプロイします。 最後に、Tomcatサーバーを起動して、URL http://localhost:8080/HelloWorldStruts2/system.action *にアクセスしてみます。 これにより、次の画面が生成されます-
上記の出力の何が問題になっていますか? Strutsは、文字列「Windows XP SP3」およびその他の組み込みデータ型を表示および変換する方法を知っていますが、 Environment 型のプロパティをどう処理するかを知りません。 それは単にクラスの* toString()*メソッドと呼ばれます
この問題を解決するために、Environmentクラスの単純な TypeConverter を作成して登録しましょう。
以下を使用して EnvironmentConverter.java というクラスを作成します。
package com.finddevguides.struts2;
import java.util.Map;
import org.apache.struts2.util.StrutsTypeConverter;
public class EnvironmentConverter extends StrutsTypeConverter {
@Override
public Object convertFromString(Map context, String[] values, Class clazz) {
Environment env = new Environment(values[0]);
return env;
}
@Override
public String convertToString(Map context, Object value) {
Environment env = (Environment) value;
return env == null ? null : env.getName();
}
}
*EnvironmentConverter* は *StrutsTypeConverter* クラスを拡張し、Strutsに* convertFromString()*および* convertToString()*の2つのメソッドをオーバーライドすることで、EnvironmentをStringに、またはその逆に変換する方法を指示します。
アプリケーションで使用する前に、このコンバーターを登録しましょう。 コンバーターを登録するには2つの方法があります。
コンバーターが特定のアクションでのみ使用される場合、 '[action-class]' converstion.properties という名前を付ける必要があるプロパティファイルを作成する必要があります。
私たちの場合、次の登録エントリを持つ SystemDetails-converstion.properties というファイルを作成します-
environment = com.finddevguides.struts2.EnvironmentConverter
上記の例では、「environment」は SystemDetails.java クラスのプロパティの名前であり、このプロパティとの間の変換に EnvironmentConverter を使用するようStrutsに指示しています。
ただし、これを行うのではなく、アプリケーション全体で使用できるように、このコンバーターをグローバルに登録します。 これを行うには、 WEBINF/classes フォルダーに次の行で xwork-conversion.properties というプロパティファイルを作成します
com.finddevguides.struts2.Environment = \
com.finddevguides.struts2.EnvironmentConverter
これはコンバーターをグローバルに登録するだけなので、 Struts は、Environmentタイプのオブジェクトに遭遇するたびに自動的に変換を実行できます。 今、あなたがプログラムを再コンパイルして再実行すると、次のようなより良い出力が得られます-
明らかに、結果はより良くなり、Strutsコンバーターは正常に動作しています。
これは、複数のコンバーターを作成し、要件に従って使用するためにそれらを登録する方法です。