在JSF + EJB 3.1中的Request Scoped Managed Beans之间传递参数

时间:2012-07-24 15:24:37

标签: jsf-2 java-ee-6 ejb-3.1 managed-bean stateful-session-bean

我们的问题是使用JSF + EJB编辑数据库的一个非常基本的简单实现。

保持简短: 两个单独的XHTML视图,使用两个独立的Managed Beans @RequestScope。

WebuserListBean和EditWebuserBean,并且我们使用@ManagedProperty注入WebuserListBean,因此我们可以获取所选的用户数据。到目前为止没有问题。视图已成功填充数据!

BUT! 我们希望能够编辑用户! 在这里(令我惊讶的是)我们无法克服这个问题。

第一次尝试: 因为填充视图后请求范围bean已经死了,所以在Save()方法上,@ PostConstruct会再次尝试启动,当然它不能。所以我们甚至无法从数据库或任何东西中获取它。

第二次尝试: 因为在填充视图后请求范围bean已经死了,如果我们没有在@postconstruct中将user设置为字段,我们将丢失与之前视图上链接的用户对象的连接(并注入,但现在该视图也已死)

第3次尝试: 无法在ViewScoped中注入RequestScope

好的和我们的限制,因为我们认为这是错误的方式:

  1. 我们不想为此
  2. 创建一个SessionScoped Managed Bean
  3. 我们不想使用任何参数等。我们想使用EJB
  4. 我们不确定是否可以将数据存储在我们的有状态会话bean中 模块的端点?这是正确的方法吗?
  5. 感谢您的任何建议,我们可以粘贴一些代码,但我想这是毫无意义的! 干杯!

1 个答案:

答案 0 :(得分:0)

有很多方法可以做到这一点,但如果导航中涉及的页面位于同一个文件夹中,我建议使用闪光灯(我最近发现在阅读BalusC答案时发现存在已知问题闪存,在不同文件夹中的页面之间导航时,它不会保存值!)。

flash是一种比单个请求的上下文更长时间保存参数的方法(如果我没有弄错的话,取自Ruby的概念,如果我错了,有人会纠正我),允许发送的参数到例如,在后续视图中获取。如果我没有弄错的话,那些值在保存后发出的第二个请求中被丢弃。您可以在托管bean中注入flash,如下所示:

@ManagedProperty("#{flash}")
private Flash flash;

public void setFlash(Flash newFlash) {
    flash = newFlash;
}

然后,您可以像使用put和get方法的地图一样访问它。如果在bean中使用put方法,则返回重定向规则,并在第二个bean上使用对象应该在那里的get方法。

您还可以在JSF中找到一个高度易于理解的通信指南(列出一个非常广泛的选项列表)here,特别是如果您需要在不同文件夹中的页面之间导航。