【问题标题】:How to retain selected entity in edit/save form?如何在编辑/保存表单中保留选定的实体?
【发布时间】:2011-11-17 14:19:47
【问题描述】:

我目前正在使用 JBoss 学习 Java EE,但我遇到了一个简单的问题。尽管这应该很常见,但我没有在互联网上找到解决方案。

我想显示联系人列表,如果选择了联系人,则会打开详细信息页面并且可以编辑联系人信息。

联系人是 JPA 实体。创建新联系人并显示联系人列表和详细信息页面工作正常。但是我无法更新联系信息。

如果点击了一个联系人,我会打开一个详细信息页面并将 id 作为 get 参数传递。现在执行以下 JSF 代码:

<f:metadata>
  <f:viewParam name="contactID" value="#{contactUpdate.contactID}" />
</f:metadata>


<h:form>
  <h:outputLabel for="firstName" value="First Name:" />
  <h:inputText id="firstName" value="#{contactUpdate.contact.firstName}" />
  <h:commandButton id="register" action="#{contactUpdate.updateContact()}" value="Update" />
</h:form>

这就是 bean(getter 和 setter 被移除):

@Stateful
@Named
@RequestScoped
public class ContactUpdate {

@Inject
private EntityManager em;

private Contact contact;
private long contactID;


public void updateContact(){
    EntityTransaction transaction = em.getTransaction();
    transaction.begin();
    transaction.commit();
}

public void setContactID(long contactID) {
    this.contactID = contactID;

    setContact(em.find(Contact.class, contactID));
}

}

如果我更新它,联系人是null。我假设请求范围太短并且已经清除。是否可以在提交时设置contactID

我认为也可以使用@ViewScoped,但这样做&lt;f:viewParam&gt; 不再起作用了。

【问题讨论】:

    标签: java jsf jakarta-ee jsf-2


    【解决方案1】:

    因为您是在视图参数的设置器中准备联系人,所以您需要将联系人 ID 作为请求参数传回,以便请求范围 bean 可以正确准备:

    <h:commandButton id="register" action="#{contactUpdate.updateContact()}" value="Update">
        <f:param name="contactID" value="#{contactUpdate.contactID}" />
    </h:commandButton>
    

    但最好在设置器(和definitely also not in getters)中执行任何业务逻辑,而改用&lt;f:event type="preRenderView"&gt;。这样@ViewScoped 将按预期工作。

    另见:

    【讨论】:

    • 太好了,非常感谢 :) 出于某种原因,我没有意识到 存在。
    • 不客气。然而,在 JSF 2.2 中会有一个&lt;f:viewAction&gt;。另请参阅“另请参阅”链接。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 2020-06-03
    • 2015-09-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多