struts 2の時間フォーマット変換問題


struts 2は時間ラベルを提供しています。
<s:date name="todayDate" format="yyyy-MM-dd" />
   このラベルは表示する時しか使えませんが、入力ボックスに時間を表示したいなら、ユーザーに直接時間を変更させてもいいです。どうすればいいですか?datepicker?選択が面倒くさいので、ユーザーに入力してもらいたいです。多様な日付フォーマットに対応しています。また、時間ラベルを使うなら、どこでもformatを指定しなければなりません。フォーマットを直したいなら、すべての時間表示が変わります。どうすればいいですか?
 
struts 2のソースコードとドキュメントを訳して、一つの方法を見つけました。  compensymphone.xwork 2.util.XWork Coverter
 * <p/> In some situations you may wish to apply a type converter globally. 
 *  This can be done by editing the file
 * <b>xwork-conversion.properties</b> in the root of your class path 
 * (typically WEB-INF/classes) and providing a
 * property in the form of the class name of the object you wish to convert 
 * on the left hand side and the class name of
 * the type converter on the right hand side. For example, providing 
 * a type converter for all Point objects would mean
 * adding the following entry:
 *
 * <p/><b>com.acme.Point = com.acme.PointConverter</b>
 
XWork Coverterは、まずclaspath rootの下でxwork-conversion.propertiesファイルを探して、このファイルはグローバル変換を定義しました。そして、新しいクラスに出会うたびに、特別なカスタム変換プロファイルがあるかどうかを調べます。設定ファイルをカスタマイズするためのパスは以下の通りです。
className.replace('.', '/') + "-conversion.properties";
 例えば、comp.acme.Pointの変換構成は、claspathの下の/com/acme/Point-coversion.propertiesファイルです。
 
ok、この問題はよく解決しました。
 
私のxwork-coversion.propertiesファイル:
java.util.Date=cn.jolstar.struts.type.DateTypeConverter
 私のDateType Coverterコード:
/**
 * 
 */
package cn.jolestar.struts.type;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;

import org.apache.log4j.Logger;
import org.apache.struts2.util.StrutsTypeConverter;


/**
 * @author jolestar
 * 
 */
public class DateTypeConverter extends StrutsTypeConverter {

	private static final Logger log = Logger.getLogger(DateTypeConverter.class);
	public static final String DEFAULT_DATE_FORMAT = "yyyy-MM-dd";
	
	//            
	public static final DateFormat[] ACCEPT_DATE_FORMATS = {
			new SimpleDateFormat(DEFAULT_DATE_FROMAT),
			new SimpleDateFormat("yyyy MM dd "),
			new SimpleDateFormat("yyyy/MM/dd") };

	/**
	 * 
	 */
	public DateTypeConverter() {
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.apache.struts2.util.StrutsTypeConverter#convertFromString(java.util.Map,
	 *      java.lang.String[], java.lang.Class)
	 */
	@Override
	public Object convertFromString(Map context, String[] values, Class toClass) {
		if (values[0] == null || values[0].trim().equals(""))
			return null;
		for (DateFormat format : ACCEPT_DATE_FORMATS) {
			try {
				return format.parse(values[0]);
			} catch (ParseException e) {
				continue;
			} catch (RuntimeException e) {
				continue;
			}
		}
		log.debug("can not format date string:" + values[0]);
		return null;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.apache.struts2.util.StrutsTypeConverter#convertToString(java.util.Map,
	 *      java.lang.Object)
	 */
	@Override
	public String convertToString(Map context, Object o) {
		if (o instanceof Date) {
			SimpleDateFormat format = new SimpleDateFormat(
					DEFAULT_DATE_FORMAT);
			try {
				return format.format((Date) o);
			} catch (RuntimeException e) {
				return "";
			}
		}
		return "";
	}

}
 
 
 
このように、文字列から日付オブジェクトに変換する際には、上記のような複数の日付フォーマットを試しますが、出力する場合は、一括してDEFALT-DATE-FOREMATに変換します。フォーマットを変更する必要があります。DEFAULT-DATE-FOREMATを変更するだけです。もちろん、それを配置ファイルに入れてもいいです。修正しやすいです。
 
この点を知ると、実はstrutsのタイプ転換モードが分かります。その後、文字列IDから持続化オブジェクトへの変換、またはカスタム文字列からオブジェクトへの変換が容易になります。