【问题标题】:Setters are called twice in JSF managed bean在 JSF 托管 bean 中调用了两次设置器
【发布时间】:2011-11-09 15:27:19
【问题描述】:

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

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


我的Bean.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>


我的日历.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

【问题讨论】:

  • 那么,如果您删除datePicker,它会按预期工作吗?这很奇怪。你能知道在哪个 JSF 阶段调用了这些方法,以及它是否真的在同一个 HTTP 请求中?为简洁起见,您省略的表格中实际上没有更多内容吗?
  • 是的,我删除了 datepicker 事件监听器并简单地手动更改了日期,它以这种方式提交很好。检查我的问题,了解导致问题的 JSF 阶段的更新。
  • 这很奇怪。 datePicker 脚本不会添加另一个具有同名的隐藏输入字段吗?使用 Firebug 或 Chrome 的“检查元素”来计算它。
  • 这个问题让我很好奇,我迟早会自己用 jQuery UI DatePicker 测试它,但我想先知道你使用的是什么 JSF impl/version 和 RF 版本。顺便问一下,有什么特别的原因让你不只使用 RichFaces 自己的&lt;rich:calendar&gt;
  • 现在不在工作,所以无法详细回复。我将 JSF2 与 Richfaces 3.3 一起使用。我没有使用 Richfaces 日历,因为它没有提供一种简单的方法来在标题中分别显示月份和年份的下拉菜单(如果我将其更改为使用 Richfaces 选择方式,则需要通过很多业务签字圈月/年)。 jqueryui.com/demos/datepicker/#dropdown-month-year

标签: jquery jsf richfaces jquery-ui-datepicker


【解决方案1】:

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

<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/getter? (而不是该字段的实际 id)。

【讨论】:

  • Ids 用于 html 和服务器端组件之间的映射,而值 EL 确定组件将调用哪个对象的 getter/setter。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-11-09
  • 1970-01-01
  • 1970-01-01
  • 2012-07-31
  • 2013-01-24
  • 2023-03-05
  • 2014-07-17
相关资源
最近更新 更多