【发布时间】:2014-05-05 14:46:29
【问题描述】:
我有一个带有数据表的页面,该数据表是根据查询参数(例如username 和pagenum)填充的。表中的每个条目都有一个删除命令按钮
当pagenum != 0 和我们点击删除时,要显示的记录列表是在“应用”阶段生成的。在这个阶段,视图参数没有被设置,所以记录列表是空的,所以什么都没有被删除(我们的删除方法没有被调用)
为了解决这个问题,我添加了一个 @PostConstruct 方法,该方法从 Servlet 请求中检索查询参数并设置 bean 中的值,因此当我们获取离开记录列表时它们可用,这允许我删除方法被调用。
我确信 JSF 有更好的方法来处理这种情况,而 @PostConstruct 的解决方法是一个 hack。
在不使用 View 或 Session 范围的 bean 的情况下,实现此场景的正确方法是什么?
肯定有一种方法可以只发布表单并删除相应的记录,而不必浪费时间重新生成记录列表。
【问题讨论】:
-
你为什么不想为你的 bean 使用
@ViewScoped?@SessionScoped不适合这种情况。 -
你能发布你的代码吗?正如@LuiggiMendoza 所说,最简单的方法是使用“@ViewScoped”,这将使您能够维护表格的状态。
-
在这种情况下,将状态存储在服务器中(如在
@ViewScopedbean 中)对我来说是违反直觉的。如果我不使用 JSF,那么很容易在每条记录上实现一个表单,提交时会调用适当的代码来删除记录,而无需在服务器上维护任何会话状态。帮助我理解为什么在这里使用@ViewScopedbean 是一件好事。如果用户加载页面、离开并吃午饭、提交删除表单之一,但会话已过期,会发生什么? -
或者至少帮助我理解为什么 JSF 在调用 delete 方法之前重建视图时不设置查询参数是有意义的。
-
在 JSF 1.x 中,Tomahawk 提供了
<t:saveState>一种方法,可以轻松地将请求范围 bean 转换为视图范围 bean。 Spring 的人们只是跳入各种 hack 或自定义注释,然后指责 JSF 而不是 Spring,因为 Spring 不知道“视图范围”概念。好吧,您的(理论)答案是一个自定义 Spring 注释,它立即注入 HTTP 请求参数,而不是使用<f:viewParam>。我不能一概而论地详细回答这个问题。