0

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

保持简短:两个独立的 XHTML 视图,使用两个独立的托管 Bean @RequestScope。

WebuserListBean 和 EditWebuserBean,我们用@ManagedProperty 注入WebuserListBean,这样我们就可以获取选中的用户数据。到目前为止没有问题。视图已成功填充数据!

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

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

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

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

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

  1. 我们不想为此创建一个 SessionScoped Managed Bean
  2. 我们不想使用任何参数等。我们想使用 EJB
  3. 我们不确定是否可以将数据存储在作为模块端点的有状态会话 bean 中?这是正确的方法吗?

感谢您的任何建议,我们可以粘贴一些代码,但我想这是没有意义的!干杯!

4

1 回答 1

0

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

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

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

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

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

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

于 2012-07-24T16:23:31.943 回答