私はアクションを持っています。そのアクションには List of Dates プロパティがあります。リクエスト パラメータは「yyyy.MM.dd」形式になります。「-coversion.properties」ファイルがあります(この目的でグローバル型コンバーターを使用したくありません)。
私は注釈を使用していません。
コレクションではなく単一の Date である場合、プロパティ固有の変換は簡単です。リストの要素にプロパティ固有の型変換を適用することは可能ですか?
うまく動作するサンプルコードを書きました。その構造は上記の通りです。
最初に、次のようにコンバーターを作成し/util/MyDateConverter.java
ました。
package util;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;
import com.opensymphony.xwork2.conversion.TypeConversionException;
import ognl.DefaultTypeConverter;
public class MyDateConverter extends DefaultTypeConverter {
@Override
public Object convertValue(Map context, Object object, Class type) {
if (type == Date.class) {
String datePattern = "yyyy.MM.dd";
DateFormat format = new SimpleDateFormat(datePattern);
format.setLenient(false);
try {
String[] dateString = (String[]) object;
return format.parse(dateString[0]);
} catch (Exception e) {
throw new TypeConversionException("Given Date is Invalid");
}
}
return null;
}
}
次に、struts2 コレクション変換サポートを使用するために、次のように記述しました/util/MyDate.java
。
package util;
import java.io.Serializable;
import java.util.Date;
public class MyDate implements Serializable {
public MyDate(int myId, Date value) {
super();
this.myId = myId;
this.value = value;
}
int myId;
Date value;
public Date getValue() {
return value;
}
public void setValue(Date value) {
this.value = value;
}
public int getMyId() {
return myId;
}
public void setMyId(int myId) {
this.myId = myId;
}
@Override
public String toString() {
return value.toString();
}
}
/action/Action1-conversion.properties
次に、以下のように記述して、コレクションをサポートする方法を struts2 に指示しました。
KeyProperty_dates=myId
Element_dates=util.MyDate
CreateIfNull_dates=true
MyDate.value
次に、次のように記述して変換方法を彼に伝えました/util/MyDate-conversion.properties
。
value=util.MyDateConverter
/index.jsp
次に、以下のように準備しました。
<%@ taglib uri="/struts-tags" prefix="s"%>
<s:form>
<s:date name="dates(1).value" format="yyyy.MM.dd" id="dateSD1" />
<s:textfield name="dates(1).value" value="%{dateSD1}" label="New Date 1" />
<s:date name="dates(2).value" format="yyyy.MM.dd" id="dateSD2" />
<s:textfield name="dates(2).value" value="%{dateSD2}" label="New Date 2"/>
<s:submit value="Update" />
<pre>
Current Date 1: <s:date name="dates(1).value" />
Current Date 2: <s:date name="dates(2).value" />
</pre>
</s:form>
そして/action/Action1.java
以下のように:
package action;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import util.MyDate;
import com.opensymphony.xwork2.ActionSupport;
public class Action1 extends ActionSupport {
public Action1() {
super();
dates.add(new MyDate(1, new Date()));
dates.add(new MyDate(2, new Date()));
}
public String execute() {
return SUCCESS;
}
List<MyDate> dates = new ArrayList<MyDate>();
public void setDates(List<MyDate> dates) {
this.dates = dates;
}
public List<MyDate> getDates() {
return dates;
}
}
アプリケーションを実行した後、Update
ボタンは期待どおりに機能し、変換がうまく機能していることを示しています。
このサンプル コードがお役に立てば幸いです。