我们的问题是使用JSF + EJB编辑数据库的一个非常基本的简单实现。
保持简短: 两个单独的XHTML视图,使用两个独立的Managed Beans @RequestScope。
WebuserListBean和EditWebuserBean,并且我们使用@ManagedProperty注入WebuserListBean,因此我们可以获取所选的用户数据。到目前为止没有问题。视图已成功填充数据!
BUT! 我们希望能够编辑用户! 在这里(令我惊讶的是)我们无法克服这个问题。
第一次尝试: 因为填充视图后请求范围bean已经死了,所以在Save()方法上,@ PostConstruct会再次尝试启动,当然它不能。所以我们甚至无法从数据库或任何东西中获取它。
第二次尝试: 因为在填充视图后请求范围bean已经死了,如果我们没有在@postconstruct中将user设置为字段,我们将丢失与之前视图上链接的用户对象的连接(并注入,但现在该视图也已死)
第3次尝试: 无法在ViewScoped中注入RequestScope
好的和我们的限制,因为我们认为这是错误的方式:
感谢您的任何建议,我们可以粘贴一些代码,但我想这是毫无意义的! 干杯!
答案 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,特别是如果您需要在不同文件夹中的页面之间导航。