如何在编辑/保存表单中保留所选实体?

时间:2011-11-17 14:19:48

标签: java jsf java-ee jsf-2

我目前正在使用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,但这样做<f:viewParam>不再有用了。

1 个答案:

答案 0 :(得分:1)

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

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

但更好的方法是在setter(和definitely also not in getters)中执行任何业务逻辑并使用{​​{1}}代替。这样<f:event type="preRenderView">将按预期工作。

另见: