2015-04-14 54 views
1

這個問題是從前一個問題的後續「禁用時爲true的InputText值null」,但我無法給它添加註釋。jsf inputText禁用和只讀屬性的形式

我使用jsf 2.2和設置爲true時的禁用和只讀屬性,對於包含在窗體中的inputText和inputTextarea控件,由於字段合併對象時數據庫中的關聯字段正在刪除數據從jsf頁面返回對象時爲空。

在窗體的字段上設置這些屬性的目的是在字段中顯示數據,但不允許用戶更改它並將更改保存到窗體中的其他字段。

除了將字段放置在表單之外並使頁面佈局複雜化之外,還可以實現其他什麼方法。

格雷厄姆

+0

請問您可以發佈一些代碼。因爲我無法重現此行爲所有預期的工作,與殘疾人和只讀後提交值保持正常。 – pL4Gu33

回答

1

我解決了這個問題,它是通過使用@RequestScoped而不是@SessionScoped我的頁面控制器豆引起的。

我在做什麼是使用編輯鏈接從數據表中傳遞當前產品對象到doEditProduct方法。

   <h:dataTable id="viewProductsTable" value="#{productController.products}" var="_product" 
         styleClass="data-table" headerClass="table-header" rowClasses="table-row"> 
       <h:column> 
        <f:facet name ="header"> 
         <h:outputText value="Product Name" /> 
        </f:facet> 
        <h:outputText value="#{_product.productName}"/> 
       </h:column> 
       <h:column> 
        <f:facet name="header"> 
         <h:outputText value="Goal"/> 
        </f:facet> 
        <h:outputText value="#{_product.goal}"/> 
       </h:column> 
       <h:column> 
        <f:facet name="header"> 
         <h:outputText value="Details"/> 
        </f:facet> 
        <h:outputText value="#{_product.description}"/> 
       </h:column> 
       <h:column> 
        <h:form> 
         <h:commandLink value="Edit" action="#{productController.doEditProduct(_product)}"/> 

        </h:form> 
       </h:column> 
      </h:dataTable> 

的productController.doEditProduct方法然後打開編輯頁面

public String doEditProduct(Product product) { 
    this.product = product; 
    return "edit-product.xhtml"; 

編輯頁面包含一個簡單的編輯形式

   <h:form id="addProductForm"> 
       <h:panelGrid columns="2" columnClasses="top-alignment, top-alignment"> 
        <h:outputLabel for="product-name" value="Product Name"/> 
        <h:outputText value="#{productController.product.productName}" id="product-name" /> 
        <h:outputLabel for="goal" value="Goal" /> 
        <h:inputTextarea value="#{productController.product.goal}" id="goal" rows="10" cols="100" /> 
        <h:outputLabel for="details" value="Details" /> 
        <h:inputTextarea value="#{productController.product.description}" id="details" rows="20" cols="100"/> 
        <f:facet name="footer"> 
         <h:panelGroup style="padding-top: 15px; display: inline-block; float: right; white-space: nowrap"> 
          <h:commandButton id="submit" value="Save" action="#{productController.updateProduct()}" class="button" /> 
          <h:button id="Cancel" outcome="index.xhtml" value="Cancel" class="button"/> 
         </h:panelGroup> 
        </f:facet> 

       </h:panelGrid> 
      </h:form> 

此時產品數據顯示在頁面上。然而,當點擊保存按鈕並運行更新方法時

public String updateProduct() { 
    try { 
     log.log(Level.INFO, "Updating: {0}", product.getGoal()); 
     productFacade.edit(product); 
    } catch (Exception e) { 
     log.log(Level.WARNING, e.toString()); 
     String errorMessage = getRootErrorMessage(e); 
     FacesMessage m = new FacesMessage(FacesMessage.SEVERITY_ERROR, errorMessage, "could not update product"); 
     facesContext.addMessage(null, m); 
     return ""; 

    } 
    return "index.xhtml"; 

任何已被禁用或只讀的字段被設置爲空。實際上,頁面上任何位置的任何非輸入字段都設置爲空。

控制器類上的@RequestScope意味着類正在被重新實例化,因此存儲在產品中的對象被分配了PostConstruct方法中的新對象。可編輯字段中的值被轉移到這個新對象,並且不可編輯字段被設置爲空。與數據庫合併意味着字段中的數據被刪除。

使用@SessionScoped意味着控制器bean跨頁請求繼續存在。 (我需要提醒自己的基本網頁生命週期)

希望這可以幫助任何其他人有這種行爲。

格雷厄姆