创建一个
<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吗?



