JSF:bean范围;会话与请求

时间:2011-01-26 15:47:34

标签: jsf

我有一个名为UserSearchHandler的托管bean,它有一个填充doSearch的{​​{1}}方法,该方法显示在UserSearchHandler.searchResults页面的表格中。

我有另一个名为userSearch.xhtml的托管bean,它有UserHandler方法等等。

在搜索结果表中,用户名是一个链接,单击该链接时,应在showUser页面上显示用户详细信息。表和链接如下所示:

userView.xhtml

当托管bean设置为<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时,搜索工作并填充表格,但是当我点击名称链接时没有任何反应。我在request方法上设置了一个断点,当userHandler.showUser设置为“请求”范围时,它永远不会被击中。

任何人都可以帮忙解释为什么会这样,或者我做错了什么?

2 个答案:

答案 0 :(得分:5)

这是因为#{userSearchHandler.searchResults}在新请求期间是空的,因此JSF无法找到调用commandlink的相关行,以便调用该操作(并传递/设置属性,如果有的话)。 / p>

您需要确保在bean的构造/初始化期间预先创建相同的#{userSearchHandler.searchResults}。如果要根据一组特定参数创建它,那么您也要将它们与表单一起传递。

这就是为什么存在像Tomahawk的<t:saveState />和新的JSF 2.0视图范围这样的解决方案的原因。

另见:

答案 1 :(得分:0)

我有几点想法。如果您在导航中使用了a,则可以尝试将其取出。这样做意味着浏览器在呈现第二个窗口时不会发出新的HTTP请求。它是新的HTTP请求,它清除请求范围的bean。如果这不是一个选项,您可以在链接中传递一个参数,例如记录ID,这可以允许您从匹配该ID的数据源中提取数据。