創建該組件由<f:attribute>
接受多個圖案的定製轉換器。
這裏是你想怎麼有視圖的樣子:
<h:inputText id="input" value="#{bean.date}">
<f:converter converterId="multiDateConverter" />
<f:attribute name="pattern1" value="MM/dd/yyyy" />
<f:attribute name="pattern2" value="MM-dd-yyyy" />
</h:inputText>
而這裏的轉換器可看怎麼樣(對JSF 1.x中,將其註冊爲
<converter-id>multiDateConverter</converter-id>
在faces-config.xml
代替)
@FacesConverter(value="multiDateConverter")
public class MultiDateConverter implements Converter {
@Override
public Object getAsObject(FacesContext context, UIComponent component, String value) throws ConverterException {
List<String> patterns = getPatterns(component);
Date date = null;
for (String pattern : patterns) {
SimpleDateFormat sdf = new SimpleDateFormat(pattern);
sdf.setLenient(false); // Don't parse dates like 33-33-3333.
try {
date = sdf.parse(value);
break;
} catch (ParseException ignore) {
//
}
}
if (date == null) {
throw new ConverterException(new FacesMessage("Invalid date format, must match either of " + patterns));
}
return date;
}
@Override
public String getAsString(FacesContext context, UIComponent component, Object value) throws ConverterException {
return new SimpleDateFormat(getPatterns(component).get(0)).format((Date) value);
}
private static List<String> getPatterns(UIComponent component) {
List<String> patterns = new ArrayList<String>();
for (int i = 1; i < Integer.MAX_VALUE; i++) {
String pattern = (String) component.getAttributes().get("pattern" + i);
if (pattern != null) {
patterns.add(pattern);
} else {
break;
}
}
if (patterns.isEmpty()) {
throw new IllegalArgumentException("Please provide <f:attribute name=\"patternX\"> where X is the order number");
}
return patterns;
}
}
注意,只挑選第一個(默認)模式來重新顯示 價值。因此,在上例中,如果輸入05-10-2011
,則會重新顯示爲05/10/2011
。
無關的具體問題,模式MM-dd-yyyy
是不是很常見。你不是想要用dd-MM-yyyy
?
JSF 1.x or 2.x? – BalusC 2011-05-10 15:12:38
@BalusC - 我在這個項目中使用JSF 1.2 ... – 2011-05-10 15:27:08
謝謝,它畢竟不是很相關,唯一的區別就是能否使用'@ FacesConverter'。無論如何,請經常提及JSF impl /版本以後的問題:) – BalusC 2011-05-10 15:29:50