Java 在没有会话bean的情况下优雅地处理属性
我正在使用JSF2.0和RichFaces4开发一个应用程序,该应用程序包含许多显示元素的表,当然还有常见的查看/编辑/删除选项。经过一段时间的浏览和谷歌搜索,我决定发布一个问题,因为我找到的答案并没有解决我的问题 现在,直截了当地说,我的应用程序在处理存储在请求bean中的某些属性时出现了问题,在某些情况下,由于连续的请求而丢失了这些属性 例如,当我想要编辑一个对象时,该对象被发送(f:propertyActionListener)到一个在表单上显示数据的请求bean,然后在该请求结束时被丢弃。保存时,将创建一个新对象,并将表单上的属性设置为该对象,该项将被保存而不是更新,因为它没有id(JPA+Hibernate) 我已经调查了许多选项,这就是我迄今为止所做的工作和结果: f:param+h:link或h:commandLink:使用@ManagedProperty时,参数为null,我在上下文中找不到它,无法通过JNDI进行查找 f:setPropertyActionListener+h:commandLink+Requestbean:有效。。。但是我丢失了一些数据。显示数据的表单有一些有条件地呈现的字段,我无法保存这些信息,因此如果验证阶段发现无效数据,表单就会混乱 f:viewParam+h:commandLink+查看作用域Bean:这里有一些奇怪的东西。这一个不能直接工作,因为bean似乎在呈现表单之前被丢弃,因为表单呈现时没有任何信息,因为bean是干净的 使用会话bean:很有魅力,但我不想为每一种表单都创建会话bean,因为我还在学习JSF生命周期的知识,我想用正确的方式来实现它 如果我想保持请求会话方法,有没有一种方法可以存储参数(对象或普通字符串)并在以后的请求bean中获取Java 在没有会话bean的情况下优雅地处理属性,java,jsf-2,richfaces,Java,Jsf 2,Richfaces,我正在使用JSF2.0和RichFaces4开发一个应用程序,该应用程序包含许多显示元素的表,当然还有常见的查看/编辑/删除选项。经过一段时间的浏览和谷歌搜索,我决定发布一个问题,因为我找到的答案并没有解决我的问题 现在,直截了当地说,我的应用程序在处理存储在请求bean中的某些属性时出现了问题,在某些情况下,由于连续的请求而丢失了这些属性 例如,当我想要编辑一个对象时,该对象被发送(f:propertyActionListener)到一个在表单上显示数据的请求bean,然后在该请求结束时被丢弃
不知道这是否有帮助,但我通过ui:insert和ui:define使用母版页。使用视图范围的bean。它应该会起作用。您在这里描述的问题表明您正在将它绑定到JSTL标记或
id
或binding
属性。您不应该在视图范围的bean上这样做。另见。另一个可能的原因是您正在使用CDI的@Named
来管理bean,而不是JSF的@ManagedBean
。这也解释了为什么@ManagedProperty
在您的一次尝试中不起作用,因为它还要求bean由JSF的@ManagedBean
管理
对于母版详细信息页方法,在表页中使用带有
的
在母版页中创建查看/编辑链接
例如user/list.xhtml
#{user.id}
#{user.name}
这个bean可以只是请求作用域
然后,在defail页面(本例中为编辑页面)中,使用
转换、验证id
并将其设置为用户
例如,user/edit.xhtml
...
使用@ViewScoped
bean保存数据、服务和操作方法:
@ManagedBean
@ViewScoped
public class UserEdit {
private User user;
@EJB
private UserService service;
public String save() {
service.save(user);
return "users";
}
// Getter+setter.
}
使用视图范围的bean。它应该会起作用。您在这里描述的问题表明您正在将它绑定到JSTL标记或
id
或binding
属性。您不应该在视图范围的bean上这样做。另见。另一个可能的原因是您正在使用CDI的@Named
来管理bean,而不是JSF的@ManagedBean
。这也解释了为什么@ManagedProperty
在您的一次尝试中不起作用,因为它还要求bean由JSF的@ManagedBean
管理
对于母版详细信息页方法,在表页中使用带有
的
在母版页中创建查看/编辑链接
例如user/list.xhtml
#{user.id}
#{user.name}
这个bean可以只是请求作用域
然后,在defail页面(本例中为编辑页面)中,使用
转换、验证id
并将其设置为用户
例如,user/edit.xhtml
...
使用@ViewScoped
bean保存数据、服务和操作方法:
@ManagedBean
@ViewScoped
public class UserEdit {
private User user;
@EJB
private UserService service;
public String save() {
service.save(user);
return "users";
}
// Getter+setter.
}
即使在这种情况下,
@ViewScoped
真的是一个好的解决方案吗?虽然这需要更多的工作,但我通常倾向于使用@ConversationScoped
,以避免后退按钮的使用、多个选项卡/窗口以及视图范围的数据过期等问题。我需要就我的想法写一篇合适的博客文章,但现在我将引用我的一篇文章。谢谢你的文章@BalusC!阅读你的答案总是一种乐趣。至于选项,我们没有对博客上的链接所声明的特定标记进行任何绑定,也没有将标记直接绑定到bean。在“渲染”属性上使用一些EL表达式是否会导致此问题?我们这样做是为了根据具体情况调整表单。@ViewScoped
是否也会在一个基本的hello world页面上失败,该页面只有一个提交按钮,其中操作方法返回null
或void
?是的,它也会丢失数据。调试我发现有一个正确设置bean的第一个调用,然后是第二个完全干净的bean调用。我想它会被丢弃,然后重新测试。。。我甚至定义了一个带有重定向指令的导航规则,并在true上包含view params。这种症状,再加上@ManagedProperty
失败,以及您喜欢@ConversationScoped
,表明您实际上根本没有使用JSF@ManagedBean