selectBooleanCheckbox不会启动viewstate id

时间:2013-05-28 13:48:14

标签: jsf-2 primefaces

我有一个ViewScoped的支持bean。我在表单中启用了一些ajax SelectBooleanCheckbox es。 例如:

<p:selectBooleanCheckbox value="#{formBean.value2}">  
    <p:ajax update=":theform"/>  
</p:selectBooleanCheckbox>

通常,一些隐藏的输入字段应该在html中传递viewstate id。问题是那些没有在第一页请求上启动。当我单击其中一个复选框时,表单(以及复选框)将刷新。从这一刻起,视图状态ID与这些复选框一起发送,因此可以保留视图状态。

最大的问题是,在第一次ajax调用时,会启动一组新的ViewScoped bean,因此我丢失了有关第一个操作的数据。从那时起,一切似乎都能正常运作。

任何人都可以就可能出现的问题给我任何指示吗?

确切代码:

        <p:panel header="Schedule" toggleable="true">
            <form>
                <p:outputPanel id="schedule">
                    <ui:repeat var="scheduleDay" value="#{jobBean.jobScheduleDays}">
                        <div>
                            <p:selectBooleanCheckbox value="#{scheduleDay.selected}" style="margin:4px">
                                <p:ajax update=":schedule" />
                            </p:selectBooleanCheckbox>
                            <h:outputText value="#{scheduleDay.readableDay}" style="text-transform:capitalize"/>
                        </div>
                    </ui:repeat>
                </p:outputPanel>
            </form>
        </p:panel>

1 个答案:

答案 0 :(得分:3)

您的问题是由使用纯HTML <form>而不是JSF <h:form>引起的。 <h:form>不仅会生成正确的HTML <form>元素,并且会设置正确的方法和操作URL,但它还会生成两个额外的隐藏字段,用于标识正在提交的表单和JSF视图状态标识符

E.g。

<h:form id="foo">

产生

<form id="foo" name="foo" action="ViewHandler#getActionURL()" method="post">
    <input type="hidden" name="foo" value="foo" />
    <input type="hidden" name="javax.faces.ViewState" value="..." />

(表单操作网址填充了ViewHandler#getActionURL()的结果)

纯HTML <form>与JSF ajax请求一起使用是因为他们没有完全使用表单元素发送HTTP POST请求,而是使用JavaScript的XMLHttpRequest对象发送HTTP POST通过使用JavaScript的form.elements遍历父表单中的输入元素来填充参数的请求。 JSF ajax响应将自动更新JSF视图状态隐藏字段,这就是为什么JSF能够处理从第二个请求开始提交表单的原因。

但是,在使用非ajax请求时,使用纯HTML <form>会很难。