Setter在JSF托管bean中被调用两次

时间:2011-11-09 15:27:19

标签: jquery jsf richfaces jquery-ui-datepicker

自从我将jquerys datePicker添加到应用程序后,我在将日期应用到managedBean时遇到了问题。

我将日期选择器附加到两个日期字段并且工作正常(弹出并允许选择日期,输入字段更改以正确反映日期选择)。


myBean.java

public class MyBean {

    private Date startDate;
    private Date endDate;

    public MyBean()
    {
        ...
    }

    public void filterList()
    {
        ...
    }

    public Date getStartDate()
    {
        return startDate;
    }

    public void setStartDate(Date startDate)
    {
        this.startDate = startDate;
    }

    public Date getEndDate()
    {
        return endDate;
    }

    public void setEndDate(Date startDate)
    {
        this.endDate = endDate;
    }

}


myPage.xhtml:

<h:form id="my_requests_pending">
    <rich:panel id="filter_panel">
        <h:panelGrid rendered="#{myBean.filter}">
            <h:panelGrid>
                <h:outputText id="startDateLbl" value="#{messages['MyBeanMessages.startDate']}" />
                <h:panelGrid>                       
                    <h:inputText id="startDate" value="#{mysBean.startDate}">
                        <f:convertDateTime pattern="E, d MMM, yyyy" timeZone="#{localeBean.timeZone}" />
                    </h:inputText>
                </h:panelGrid>
            </h:panelGrid>
            <h:panelGrid>
                <h:outputText value="#{messages['MyBeanMessages.endDate']}" />
                <h:panelGrid> 
                    <h:inputText id="endDate" value="#{myBean.endDate}">
                        <f:convertDateTime pattern="E, d MMM, yyyy" timeZone="#{localeBean.timeZone}" />
                    </h:inputText>
                </h:panelGrid>
            </h:panelGrid>
        <h:panelGrid columns="1">
            <h:commandButton id="myReqSubmitBtn" value="#{messages['MyBeanMessages.submit']}" action="#{myBean.filterList}" />
        </h:panelGrid>
        </h:panelGrid>
    </rich:panel>
</h:form>


myCalendar.js

jQuery('startDate,endDate').datepicker.({
        showOn : 'both',
        changeMonth : true,
        changeYear : true,
        showOtherMonths : true,
        selectOtherMonths : true,
        showButtonPanel : true,
        dateFormat : "D, d M, yy",
        showAnim : "slideDown"
    });


当我提交我的表单时会出现问题。

setStartDate / setEndDate方法被调用两次(我可以在调试模式下看到这一点) 第一次将日期正确设置为新更改日期,第二次调用将其重置回原始日期。

他们在JSF生命周期中发生的事情是我不知道的吗? 任何帮助赞赏。

更新

问题似乎出现在'更新模型'JSF阶段。 它输出以下调试代码:

09-Nov-2011 16:02:26 org.exadel.jsf.PhaseTracker beforePhase
INFO: BEFORE UPDATE_MODEL_VALUES 4
  • 然后在setStartDate()方法中命中断点并正确更新startDate属性。
  • 当它离开setStartDate()方法时,它会对jsf库等进行多次调用...并再次返回到setStartDate()中的断点!
  • 然后我退出方法并出现以下调试代码。
09-Nov-2011 17:06:21 org.exadel.jsf.PhaseTracker afterPhase
INFO: AFTER UPDATE_MODEL_VALUES 4
09-Nov-2011 17:06:21 org.exadel.jsf.PhaseTracker beforePhase
INFO: BEFORE INVOKE_APPLICATION 5

1 个答案:

答案 0 :(得分:0)

我的表单中也有以下代码(以前的日历功能中的旧代码)。

<h:panelGrid id="hiddendates" styleClass="panelgrid-nopad"
                style="display:none">
                <h:outputText id="formId" value="#{formId}" />
                <h:inputText id="startDateHidden"
                    value="#{myRequestsBean.startDate}">
                    <f:convertDateTime pattern="dd/MM/yyyy"
                        timeZone="#{localeBean.timeZone}" />
                </h:inputText>
                <h:inputText id="endDateHidden" value="#{myRequestsBean.endDate}">
                    <f:convertDateTime pattern="dd/MM/yyyy"
                        timeZone="#{localeBean.timeZone}" />
                </h:inputText>
            </h:panelGrid>

这些字段的id为'startDateHidden'和'endDateHidden' 字段是否根据el值映射到setter / getters? (而不是该字段的实际ID)。