JSF更新视图不​​会更改bean

时间:2017-11-16 16:58:49

标签: hibernate jsf-2.2

我得到了一份"文件"的基本编辑表格。实体(我使用JSF2和Hibernate),"创建"表单工作正常,但"编辑"没有按'吨。因此编辑表单显示当前文档值,但是当它发送新值时,backbean不会获取它们并且与旧实体一样工作。

我的edit.xhtml的一部分:

<ui:param name="doc" value="#{document.getDocument()}" />

<h:form id="editForm">
    <h:inputHidden name="ID" id="ID" value="#{doc.ID}" />

    <div class="input-group">
        <span class="input-group-label">Title *</span>
        <h:inputText type="text" class="input-group-field" size="30" name="title" id="title" a:required="required" a:placeholder="title" value="#{doc.title}"/>
    </div>
    <h:message for="title"></h:message>

    <div class="input-group">
        <span class="input-group-label">Subtitle</span>
        <h:inputText type="text" class="input-group-field" size="30" name="subtitle" id="subtitle" a:placeholder="subtitle" value="#{doc.subtitle}" />
    </div>
    <h:message for="subtitle"></h:message>

    <div class="button-group">
        <h:button outcome="/main?faces-redirect=true" type="button" value="Cancel"></h:button>
       <h:commandButton action="${doc.save}" value="Save">
           <f:ajax render="@form" execute=":editForm" event="keyup"/> 
       </h:commandButton>
    </div>

</h:form>

我的文档bean的一部分:

@ManagedBean
@Entity
@ViewScoped
public class document implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name = "ID")
    private int ID;
    @NotNull
    private String title;
    private String subtitle;

    //Getters Setters....

    @Transient
    public document getDocument() {
        documentDAO = new DocumentDAO();
        Optional<document> doc =  documentDAO.read(this.ID);
        if(doc.isPresent()) {           
            return doc.get();
        }else {
            return null;
        }
    }

    public String save() {
         documentDAO = new DocumentDAO();
         System.out.println("Saving Document (" + this.getTitle() + ")...");
         documentDAO.update(this);
         if(this.error == null || this.error.isEmpty())
              return "/list?faces-redirect=true";
         else 
             return "edit";             
     }

如果我编辑文档标题,例如&#34; test&#34;,通过&#34; testok&#34;,并发送表单,系统打印&#34;保存文档(测试)。 ..&#34;,而不是&#34;保存文件(testok)......&#34;尽管我能看到&#34; testok&#34;已发送html后请求(使用导航器的Web开发面板)。 我没有表格中的表格。

1 个答案:

答案 0 :(得分:0)

我找到了一个解决方案,通过使用bean的副本进行编辑,并将其加载到视图参数中,从前一个列表页面中检索id。 在我的edit.xhtml的标题中:

<f:metadata>
    <f:viewParam name="id" value="#{document.ID}"/>
    <f:viewAction action="#{document.getDocument()}" />
</f:metadata>

在我的文档bean中:

@Transient
public void getDocument() {
    documentDAO = new DocumentDAO();
    Optional<document> doc =  documentDAO.read(this.ID);
    if(doc.isPresent()) {           
        document d = doc.get();         
        this.title = d.title;
        this.subtitle = d.subtitle;
    }
}

现在它工作正常,它更新了bean。只是复制所有成员变量有点蹩脚,也许有更好的方法。