繁体   English   中英

JSF:bean范围;会话与请求

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM