1

我正在开发一个使用 JSF 2.0 和 Richfaces 4 的应用程序,它由许多显示元素的表格组成,当然还有通常的查看/编辑/删除选项。经过一些 SO 浏览和谷歌搜索后,我决定发布一个问题,因为我找到的答案并没有解决我的问题。

现在,直截了当,我的应用程序在处理存储在请求 bean 中的某些属性时遇到问题,并且在某些点上,由于连续请求而丢失。

例如,当我想编辑一个对象时,该对象被发送 (f:propertyActionListener) 到在表单上显示数据的请求 bean,然后在该请求结束时将其丢弃。保存时,会创建一个新对象并将表单上的属性设置为它,并且该项目被保存而不是更新,因为它没有 id (JPA + Hibernate)。

我已经调查了很多选项,这就是我到目前为止所做的事情和结果:

f:param + h:link 或 h:commandLink:使用 @ManagedProperty 参数为空,我无法在 Context 上找到它以通过 JNDI 查找它。

f:setPropertyActionListener + h:commandLink + Request Bean:有效...但我丢失了一些数据。显示数据的表单有一些条件渲染的字段,我无法保存该信息,因此如果验证阶段发现无效数据,表单就会混乱。

f:viewParam + h:commandLink + View Scoped Bean:这里有一些奇怪的东西。这个不能直接工作,因为 bean 似乎在呈现表单之前被丢弃,因为表单是在没有任何信息的情况下呈现的,因为 bean 是干净的。

使用会话 bean:就像一个魅力,但我不想仅仅因为我仍在学习有关 JSF 生命周期的东西而为每个表单创建一个会话 bean,我想以正确的方式来做。

如果我想保留请求会话方法,有没有办法存储参数(对象或纯字符串)并稍后在请求 bean 上获取?

不知道这是否有帮助,但我通过 ui:insert 和 ui:define 使用母版页。

4

1 回答 1

1

使用视图范围的 bean。它应该工作。您在那里描述的问题表明您将其绑定到 JSTL 标记idbinding属性。您不应该在视图范围的 bean 上这样做。另请参阅@ViewScoped标签处理程序中的失败。另一个可能的原因是您使用 CDI@Named来管理 bean 而不是 JSF 的@ManagedBean. 这也可以解释为什么@ManagedProperty在您的尝试之一中不起作用,因为它还要求 bean 由 JSF 的@ManagedBean.

对于主-详细信息页面方法,在表格页面中使用<h:link>with<f:param>在主页面中创建查看/编辑链接。

例如user/list.xhtml

<h:dataTable value="#{userList.users}" var="user">
    <h:column>#{user.id}</h:column>
    <h:column>#{user.name}</h:column>
    <h:column>
        <h:link value="Edit" outcome="edit">
            <f:param name="id" value="#{user.id}" />
        </h:link>
    </h:column>
</h:dataTable>

bean 可以只是请求范围。

然后,在默认页面(在本例中为编辑页面)中,用于<f:viewParam>转换、验证和设置idUser.

例如user/edit.xhtml

<f:metadata>
    <f:viewParam name="id" value="#{userEdit.user}"
        converter="#{userConverter}" converterMessage="Bad request. Unknown user."
        required="true" requiredMessage="Bad request. Please use a link from within the system." />
</f:metadata>

<h:messages />
<h:link value="Back to all users" outcome="users" />

<h:form id="user" rendered="#{not empty userEdit.user}">
    <h:inputText value="#{userEdit.user.name}" required="true" />
    ...

    <h:commandButton value="Save" action="#{userEdit.save}">
        <f:ajax execute="@form" render="@form" />
    </h:commandButton>
</h:form>

使用@ViewScopedbean 来保存数据、服务和操作方法:

@ManagedBean
@ViewScoped
public class UserEdit {

    private User user;

    @EJB
    private UserService service;

    public String save() {
        service.save(user);
        return "users";
    }

    // Getter+setter.
}
于 2012-04-27T04:34:14.483 回答