[英]JSF: bean scope; session vs request
我有一个名为UserSearchHandler
的托管bean,它有一个doSearch
方法,填充UserSearchHandler.searchResults
,显示在userSearch.xhtml
页面的表中。
我有另一个名为UserHandler
托管bean,它有一个showUser
方法,依此类推。
在搜索结果表中,用户名是一个链接,单击该链接时,应在userView.xhtml
页面上显示用户详细信息。 表和链接如下所示:
<p:dataTable var="user" value="#{userSearchHandler.searchResults" >
// ... and so on ... then
<h:commandLink value="#{user.firstName}" action="#{userHandler.showUser}">
<f:setPropertyActionListener target="#{userHandler.userIdToShow}" value="#{profile.id}"/>
</h:commandLink>
当托管bean设置为session
范围时,一切正常。
但是,当我更改bean request
的范围时,搜索工作并填充表,但是当我点击名称链接时没有任何反应。 我在userHandler.showUser
方法上设置了一个断点,当userSearchHandler
设置为“request”范围时,它永远不会被命中。
任何人都可以帮助解释为什么这是,或者我做错了什么?
这是因为#{userSearchHandler.searchResults}
在新请求期间为空,因此JSF无法找到调用commandlink的相关行,以便调用该操作(并传递/设置属性,如果有的话)。
您需要确保在bean的构造/初始化期间预先#{userSearchHandler.searchResults}
相同的#{userSearchHandler.searchResults}
。 如果要根据一组特定参数创建它,那么您也要将它们与表单一起传递。
这就是为什么存在像Tomahawk的<t:saveState />
和新的JSF 2.0视图范围这样的解决方案的原因。
我有几点想法。 如果您在导航中使用了a,则可以尝试将其取出。 这样做意味着浏览器在呈现第二个窗口时不会发出新的HTTP请求。 它是新的HTTP请求,它清除请求范围的bean。 如果这不是一个选项,您可以在链接中传递一个参数,例如记录ID,这可以允许您从匹配该ID的数据源中提取数据。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.