在Primefaces JSF2.x中使用请求范围的托管bean

时间:2013-01-15 13:55:52

标签: jsf primefaces scope

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

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

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

使用提取按钮时。

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

所以,我的理解是正确的,任何使用中间提交的设计模式(通过partialSubmit =“true”commandButton(默认情况下启用了ajax行为))都需要使用至少会话范围的支持豆子? 理想地,用于具有实现请求与导航级别请求的机制将允许这些中间提交在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"/>

1 个答案:

答案 0 :(得分:3)

  

partialSubmit解决了尚未填充的字段的验证问题,以便运行良好。

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


  

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

会话范围确实是表单的错误范围。您需要请求或视图范围。如果您的表单具有某个状态,需要在同一表单上的后续提交中记住,那么您需要视图范围。另请参阅How to choose the right bean scope?


  

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

这可以被认为是Mojarra中的一个错误,它在2.1.8中得到修复。如果无法升级,请参阅Adding <h:form> causes java.lang.IllegalStateException: Cannot create a session after the response has been committed了解一些解决方法。


  

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

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


  

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

当然。自JSF2以来,视图范围不仅是新的,而且与JSF1相比,JSF2中的许多其他事情也有所不同(阅读:更优雅)。您可以在our JSF wiki page底部找到指向JSF2资源的多个链接。