繁体   English   中英

无需会话bean即可优雅地处理属性

[英]Elegant handling of attributes without a session bean

我正在使用JSF 2.0和Richfaces 4开发一个应用程序,该应用程序包含许多显示元素的表,当然还有通常的View / Edit / Delete选项。 经过一些SO浏览和Google搜索后,我决定发布一个问题,因为我发现的答案不能解决我的问题。

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

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

我已经研究了许多选项,这是我到目前为止所做的以及结果:

f:param + h:link或h:commandLink:使用@ManagedProperty时,param为null,我无法在Context中找到它来通过JNDI查找它。

f:setPropertyActionListener + h:commandLink +请求Bean:有效 ...但是我丢失了一些数据。 显示数据的表单具有一些有条件地呈现的字段,我无法保存该信息,因此,如果验证阶段发现无效数据,则表单将被弄乱。

f:viewParam + h:commandLink + View Scoped Bean:这里很奇怪。 这个代码不能直接工作,因为该bean似乎在呈现表单之前就被丢弃了,因为该表单是干净的,因此呈现的表单没有任何信息。

使用会话bean:就像一个魅力一样,但是我不想为每种表单都创建一个会话bean,只是因为我仍在学习有关JSF生命周期的知识,所以我想以正确的方式来做。

如果我想保留Request会话方法,是否可以存储参数(对象或纯字符串)并稍后在request bean上获取?

Dunno如果有帮助,但是我正在通过ui:insert和ui:define使用母版页。

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

对于主从页面方法,请在表页面中将<h:link><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>转换,验证并将id设置为User

例如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>

使用@ViewScoped bean来保存数据,服务和操作方法:

@ManagedBean
@ViewScoped
public class UserEdit {

    private User user;

    @EJB
    private UserService service;

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

    // Getter+setter.
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM