我有一个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>
答案 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>
会很难。