2

JSF + Primefaces 新手。(使用 JSF 2.1,Primefaces 3.4.2)

我有一个表单,它有一个内部 panelGroup,它使用 Primefaces commandButton 来获取数据以填充各种表单组件。partialSubmit 解决了尚未填充的字段的验证问题,因此效果很好。该页面按预期运行,但现在我正在尝试将实现调整为“更清洁”。

我的问题与我用于表单使用的支持 bean 的 JSF 范围有关。使用会话范围,一切都很好,但在使用请求范围时就不行了。据我了解,“最终”提交(通过另一个 p:commandButton 组件)和此获取按钮都在调用提交,因此对任何一个的响应都构成了请求生命周期的完成。如果我是正确的,它解释了为什么我得到(使用请求范围)以下内容:
java.lang.IllegalStateException:在提交响应后无法创建会话

使用获取按钮时。

但很明显,这“打破”了我对获取请求的意图,只是导致表单通过 bean 使用更新的数据。

那么,我的理解是否正确,任何使用中间提交的设计模式(通过 partialSubmit="true" commandButton(默认情况下启用 ajax 行为)都需要使用至少会话范围的支持 bean?理想情况下, 实现请求与导航级别请求的机制将允许在 1 个请求的上下文中完成这些中间提交。或者我需要做一些额外的研究吗?(获取 JSF 2.x 书而不是使用我的 1.2 副本?) MTIA 的任何反馈。

我的获取组件:

<p:commandButton id="returningBtn" partialSubmit="true" value="Hit if returning" 
    process="nameInfo" actionListener="#{player.loadReturning}" update="registrationForm">
    <p:resetInput target="registrationForm" />
</p:commandButton>

我的最终提交:

<p:commandButton tabindex="0" id="SubmitButton" value="Register"
   action="#{player.register}" update="regPage"/>
4

1 回答 1

3

partialSubmit 解决了尚未填充的字段的验证问题,因此效果很好。

不,它不会那样做。它只将process属性中指定的输入字段发送到服务器,而不是当前表单的所有输入字段。它正是process告诉哪些输入需要处理(转换、验证和更新)的属性。partialSubmit="true"仅仅减少了网络带宽和请求参数解析开销。另请参阅有关该主题的 PrimeFaces 博客


该页面按预期运行,但现在我正在尝试将实现调整为“更清洁”。我的问题与我用于表单使用的支持 bean 的 JSF 范围有关。使用会话范围,一切都很好,但在使用请求范围时就不行了。

会话范围确实是表单的错误范围。您需要请求或视图范围。如果您的表单具有某种状态,需要在同一表单上的后续提交中记住该状态,那么您需要视图范围。另请参阅如何选择正确的 bean 范围?


java.lang.IllegalStateException:提交响应后无法创建会话

这可以看作是 Mojarra 中的一个错误,该错误已在 2.1.8 中修复。另请参阅添加 <h:form> 导致 java.lang.IllegalStateException:如果您无法升级,则在响应已提交多个解决方法后无法创建会话。


那么,我的理解是否正确,任何使用中间提交的设计模式(通过 partialSubmit="true" commandButton(默认情况下启用 ajax 行为)都需要使用至少会话范围的支持 bean?理想情况下,具有实现请求与导航级别请求的机制将允许在 1 个请求的上下文中完成这些中间提交。

如前所述,您需要视图范围。


还是我需要做一些额外的研究?(获取 JSF 2.x 书籍而不是使用我的 1.2 副本?)

确实。自 JSF2 以来不仅视图范围是新的,而且与 JSF1 相比,JSF2 中的许多其他事情都以不同的方式完成(阅读:更优雅)。您可以在我们的 JSF wiki 页面底部找到几个指向合理 JSF2 资源的链接。

于 2013-01-15T14:06:41.400 回答