将两个h:inputText字段分割为小时和分钟,并使用f:convertDateTime分割java.util.Date
我想在这个页面中设置一个Date字段
|hours| h |minutes|
小时和分钟在分开的inputText中。
豆有这个date
import java.util.Date; ... private Date myDate; ...
和页面是
<h:form> ... <h:inputText id="myDateHours" maxlength="2" value="#{myBean.myDate}" <f:convertDateTime pattern="HH" /> </h:inputText> <h:outputText value=" h " /> <h:inputText id="myDateMinutes" maxlength="2" value="#{myBean.myDate}" <f:convertDateTime pattern="mm" /> </h:inputText> ... </h:form>
但问题是,当我提交表单只有最后一个元素被保存。 例如,如果我input小时数,然后input分钟数,则小时数将被覆盖,结果是
| 00 | h | minutes |
我试图设置
<h:inputText id="myDateHours" value="#{myBean.myDate.hours}></h:inputText> <h:inputText id="myDateMinutes" value="#{myBean.myDate.minutes}></h:inputText>
但我得到了一个
Cannot convert 01/01/70 01:00 of type class java.util.Date to int
我不想用两个int字段replace我的date字段(小时和分钟…)你有想法吗?
谢谢
如果您想使用单个模型值,则这种特殊情况是不可能的。
然而,这是一个复合组件的完美候选人。 它允许将单个模型值绑定到一组紧密相关的现有组件,并在后备组件中执行处理/转换,从视图和后台bean中完全分离。 其中一个例子可以在这篇文章中find: 具有多个input字段的复合组件 。 这个例子可以在你的具体情况下改变如下:
/resources/components/inputTime.xhtml
:
<ui:component xmlns="http://www.w3.org/1999/xhtml" xmlns:f="http://java.sun.com/jsf/core" xmlns:h="http://java.sun.com/jsf/html" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:cc="http://java.sun.com/jsf/composite" > <cc:interface componentType="inputTime"> <cc:attribute name="value" type="java.util.Date" shortDescription="The selected time. Defaults to now." /> </cc:interface> <cc:implementation> <span id="#{cc.clientId}" style="white-space:nowrap"> <h:inputText id="hour" binding="#{cc.hour}" maxlength="2" converter="javax.faces.Integer" />h <h:inputText id="minute" binding="#{cc.minute}" maxlength="2" converter="javax.faces.Integer" /> </span> </cc:implementation> </ui:component>
com.example.InputTime
@FacesComponent("inputTime") public class InputTime extends UIInput implements NamingContainer { private UIInput hour; private UIInput minute; /** * As required by <cc:interface>. */ @Override public String getFamily() { return UINamingContainer.COMPONENT_FAMILY; } /** * Set initial hour and minute based on model. */ @Override public void encodeBegin(FacesContext context) throws IOException { Calendar calendar = Calendar.getInstance(); Date date = (Date) getValue(); if (date != null) { calendar.setTime(date); } hour.setValue(calendar.get(Calendar.HOUR_OF_DAY)); minute.setValue(calendar.get(Calendar.MINUTE)); super.encodeBegin(context); } /** * Returns the submitted value in HH-mm format. */ @Override public Object getSubmittedValue() { return hour.getSubmittedValue() + "-" + minute.getSubmittedValue(); } /** * Converts the submitted value to concrete {@link Date} instance. */ @Override protected Object getConvertedValue(FacesContext context, Object submittedValue) { try { return new SimpleDateFormat("HH-mm").parse((String) submittedValue); } catch (ParseException e) { throw new ConverterException(e); } } public UIInput getHour() { return hour; } public void setHour(UIInput hour) { this.hour = hour; } public UIInput getMinute() { return minute; } public void setMinute(UIInput minute) { this.minute = minute; } }
用法:
<html ... xmlns:my="http://java.sun.com/jsf/composite/components"> ... <my:inputTime value="#{bean.date}" />
也可以看看:
- 何时使用<ui:include>,标记文件,复合组件和/或自定义组件?
在bean中需要两个独立的setter方法,然后在服务器中进行合并。
<h:inputText id="myDateHours" value="#{myBean.hours}></h:inputText> <h:inputText id="myDateMinutes" value="#{myBean.minutes}></h:inputText>
两者都必须获取date值,因此您可以在窗体调用的操作中使用JAVA日历设置这两个字段。
Calendar calendar = new GregorianCalendar(); calendar.setTimeInMillis(0); calendar.set(Calendar.HOUR, getHours().getHours()); calendar.set(Calendar.MINUTE, getMinutes().getMinutes());
如果需要,请注意时区。