java - 如何在编辑/保存表单中保留选定的实体?

标签 java jsf jakarta-ee jsf-2

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

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

联系人是 JPA 实体。创建新联系人并显示联系人列表和详细信息页面效果很好。但是我在更新联系信息时遇到了问题。

如果单击某个联系人,我会打开一个详细信息页面并将 ID 作为获取参数传递。现在执行以下 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>不再工作了。

最佳答案

因为您正在 View 参数的 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 )中执行任何业务逻辑并使用 <f:event type="preRenderView">反而。这样@ViewScoped将按预期工作。

另请参阅:

关于java - 如何在编辑/保存表单中保留选定的实体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8168616/

相关文章:

java - 这需要显式同步吗?

java - Hibernate,Spring - 没有在数据库中填充我的表

java - 在 JSP 中定义类

jsf - 将动态表单的多个提交值映射到单个 bean 属性

java - SelectItem.value 仅以字符串形式返回对象引用

java - Java EE 中的上下文依赖影响

java - 使用 SAX java Swing 的 XML 解析器

javascript - 当输入文本中写入内容时,如何通过 jquery 启用 jsf 中的命令按钮

java - Java EE 的安全框架,如seam - JSP、Servlet、DAO

java - 依赖注入(inject)、多态性和 OOP 模式(MVC、命令等)