如何针对多种模式验证输入日期? [英] how to validate input date against multiple patterns?
问题描述
在我的jsf应用程序中,我知道如何使用jsf转换器对我的 ice中的一个模式验证用户输入:selectInputDate
:
In my jsf application I know how to validate user input against one pattern in my ice:selectInputDate
using a jsf converter:
<f:convertDateTime pattern="MM/dd/yyyy" />
但如果我想让用户能够以格式输入日期,我该怎么办? MM-dd-yyyy呢?
but how should I do if I want to let the user be able to enter a date in format: "MM-dd-yyyy" too?
我认为这可以从jsf扩展DateConverter但我已经尝试过了,但是我失败了。您是否有一个有效的示例来根据多种模式验证输入日期?
I think this can be done extending DateConverter from jsf but I already tried with that and I fail. Do you have a valid example to validate input date against multiple patterns?
谢谢。
UPDATE :我正在使用jsf 1.2
UPDATE: I'm using jsf 1.2
推荐答案
创建一个接受多个的自定义转换器组件上的< f:attribute>
模式。
Create a custom converter which accepts multiple patterns by <f:attribute>
on the component.
以下是您希望获得视图的方式看起来像:
Here's how you'd like to have the view to look like:
<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,将其注册为
And here's how the converter can look like (for JSF 1.x, register it as
<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
。
Note that it only picks the first (default) pattern to redisplay the value. So in the above example, if you enter 05-10-2011
, then it get redisplayed as 05/10/2011
.
无关到具体问题,模式 MM -dd-yyyy
不常见。你的意思是不是要用 dd-MM-yyyy
?
Unrelated to the concrete problem, the pattern MM-dd-yyyy
isn't very common. Didn't you mean to use dd-MM-yyyy
?
这篇关于如何针对多种模式验证输入日期?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!