Java JSF表单中的可选日历类型字段
我想让JSF表单中的日历输入成为可选的。当用户未通知出生时,日历字段必须保持空 我的代码:Java JSF表单中的可选日历类型字段,java,jsf,jsf-2,calendar,Java,Jsf,Jsf 2,Calendar,我想让JSF表单中的日历输入成为可选的。当用户未通知出生时,日历字段必须保持空 我的代码: @Model public class Registration { private User user = new User(); public void register() { // stuff } //getUser } public class User { //other fields private Calendar birth;
@Model
public class Registration {
private User user = new User();
public void register() {
// stuff
}
//getUser
}
public class User {
//other fields
private Calendar birth;
// gets and sets
}
<h:outputLabel for="birth" value="Birth Date" />
<h:inputText id="birth" value="#{registration.user.birth.time}" >
<f:convertDateTime pattern="dd/MM/yyyy" />
</h:inputText>
模型类:
@Model
public class Registration {
private User user = new User();
public void register() {
// stuff
}
//getUser
}
public class User {
//other fields
private Calendar birth;
// gets and sets
}
<h:outputLabel for="birth" value="Birth Date" />
<h:inputText id="birth" value="#{registration.user.birth.time}" >
<f:convertDateTime pattern="dd/MM/yyyy" />
</h:inputText>
页面:
@Model
public class Registration {
private User user = new User();
public void register() {
// stuff
}
//getUser
}
public class User {
//other fields
private Calendar birth;
// gets and sets
}
<h:outputLabel for="birth" value="Birth Date" />
<h:inputText id="birth" value="#{registration.user.birth.time}" >
<f:convertDateTime pattern="dd/MM/yyyy" />
</h:inputText>
到目前为止,这里的问题是
,它依赖于Calendar
的getTime()
方法来进行转换。它在执行时抛出一个NPE(空指针异常)。我知道,如果我初始化出生,问题就解决了,但我真的希望当用户不填写字段时,字段为空
有没有办法做到这一点的想法?问题与转换无关,而是与表达式有关:
{registration.user.birth.time}
实际上,这是DateTimeConverter
code:
public Object getAsObject(FacesContext context, UIComponent component,
String value) {
...
Object returnValue = null;
DateFormat parser = null;
try {
// If the specified value is null or zero-length, return null
if (value == null) {
return (null);
}
value = value.trim();
if (value.length() < 1) {
return (null);
}
...
returnValue = parser.parse(value);
} catch (ParseException e) {
...
}
return returnValue;
}
好吧,我会把这篇文章发给后人的。我认为这会起作用:
@FacesConverter("CustomCalendarConverter")
public class CalConverter implements Converter{
@Override
public Object getAsObject(FacesContext context, UIComponent component, String value) {
if(value != null && !value.toString().isEmpty()){
try {
String pattern = (String) component.getAttributes().get("pattern");
Calendar calendar = Calendar.getInstance();
calendar.setTime(new SimpleDateFormat(pattern).parse(value));
return calendar;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
return null;
}
@Override
public String getAsString(FacesContext context, UIComponent component, Object value) {
if(value != null && !value.toString().isEmpty()){
Calendar cal = (Calendar) value;
String pattern = (String) component.getAttributes().get("pattern");
return new SimpleDateFormat(pattern).format(cal.getTime());
}
else return null;
}
}
观点应该是:
<h:outputLabel for="birth" value="Birth Date" />
<h:inputText id="birth" value="#{registration.user.birth}">
<f:converter converterId="CustomCalendarConverter" />
<f:attribute name="pattern" value="dd/MM/yyyy" />
</h:inputText>
您也可以创建一个复合组件,例如
。这是f:convertDateTime转换器的默认行为。如果字符串为null或空字符串,它将返回null,这是NPE的原因。您可以编写一个自定义转换器,它将提供一个日期值,如31-Jan-2999,这意味着用户输入的是null或空字符串。