jsf 2 -更新复合组件中作为参数传递的值



我使用这个问题来创建一个具有时间选择器行为的复合组件。

这是我的复合xhtml
<ui:composition 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"
xmlns:rich="http://richfaces.org/rich">
<cc:interface componentType="customTimeBean">
    <cc:attribute name="date" type="java.util.Date" required="true" />
</cc:interface>
<cc:implementation>
    <rich:inputNumberSpinner value="#{cc.hours}" minValue="0"
        maxValue="23" />
    <h:outputLabel value=":" />
    <rich:inputNumberSpinner value="#{cc.minutes}" minValue="0"
        maxValue="59" />
</cc:implementation>
</ui:composition>

这是我的Faces组件

@FacesComponent(value = "customTimeBean")
public class CustomTimeBean extends UINamingContainer {
    private Date getDate() {
        Date d = (Date) getAttributes().get("date");
        if (d == null) {
            //throw new RuntimeException("Date no debe ser nulo");
            d = new date();
        }
        return d;
    }
    public void setMinutes(int value) {
        getDate().setMinutes(value);
    }
    public void setHours(int value) {
        getDate().setHours(value);
    }
    public int getMinutes() {
        return getDate().getMinutes();
    }
    public int getHours() {
        return getDate().getHours();
    }
    public void setSeconds(int value) {
        getDate().setHours(value);
    }
    public int getSeconds() {
        return getDate().getSeconds();
    }
}

的用法
<sigh:time date="#{bean.date}" hasSeconds="false"/>

我的测试案例:

<h:outputLabel value="#{controller.date}" id="date" />
<sigh:time date="#{controller.date}" />
<a4j:commandButton render="date" />

"控制器":

@ManagedBean
public class Controller  {
    Date date;
    public Date getDate() {
        return date;
    }
    public void setDate(Date date) {
        this.date = date;
    }
}     

这工作得很好,但是,当我传递一个空日期作为属性时,这不起作用,我如何更新Bean (controller.date)中的值?

在我的测试用例中,当我按a4j:commandButton和控制器中的日期为空时,outputlabel不显示任何内容(日期为空),当日期不为空时,每次我单击按钮时都会更新日期。

对不起,我的英语不好。

谢谢!

直接替换

throw new RuntimeException("Date no debe ser nulo");

d = new Date();

与具体问题无关,您在那里使用的Date方法已弃用。另请参见javadoc。主要原因是它不能正确处理时区/夏令时。您应该在复合的内部使用java.util.Calendar来代替。

最新更新