0

我有一个支持 bean,它是ViewScoped. 我SelectBooleanCheckbox在表单中有一些启用 ajax 的 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>
4

1 回答 1

3

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

例如

<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="..." />

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

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

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

于 2013-05-28T14:51:52.287 回答