Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在没有会话bean的情况下优雅地处理属性_Java_Jsf 2_Richfaces - Fatal编程技术网

Java 在没有会话bean的情况下优雅地处理属性

Java 在没有会话bean的情况下优雅地处理属性,java,jsf-2,richfaces,Java,Jsf 2,Richfaces,我正在使用JSF2.0和RichFaces4开发一个应用程序,该应用程序包含许多显示元素的表,当然还有常见的查看/编辑/删除选项。经过一段时间的浏览和谷歌搜索,我决定发布一个问题,因为我找到的答案并没有解决我的问题 现在,直截了当地说,我的应用程序在处理存储在请求bean中的某些属性时出现了问题,在某些情况下,由于连续的请求而丢失了这些属性 例如,当我想要编辑一个对象时,该对象被发送(f:propertyActionListener)到一个在表单上显示数据的请求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中获取


不知道这是否有帮助,但我通过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