2012-08-31 92 views
1

我想將複選框傳遞給後備CDI-Bean。 postTest.values只是一個Longs列表。h:selectBooleanCheckbox未將結果傳遞給映射

<h:form> 
    <h:dataTable value="#{postTest.values}" var="val"> 
     <h:column> 
      <h:outputLabel value="#{val}"/> 
     </h:column> 
     <h:column> 
      <h:selectBooleanCheckbox value="#{postTest.checked[val]}"/> 
     </h:column> 
    </h:dataTable> 
    <h:commandButton action="#{postTest.process}"/> 
</h:form> 

操作方法應打印出檢查值。但它只是空的。

@Named 
@RequestScoped 
public class PostTest { 

    List<Long> values; 
    Map<Long, Boolean> checked; 

    ... 
    public String process() { 
     logger.info(this.toString() + "Processing"); 
     for (Long l : checked.keySet()) { 
      logger.info(this.toString() + "\t" + l + ". checked: " + checked.get(l)); 
     } 

     return "index2"; 
    } 
    ... 
} 

當我記錄添加到getChecked()方法,我可以看到,它只是一次檢索每列及其內容不發生任何變化。

問題似乎與到的是,當形式傳遞值的postTest.values未初始化的點。因爲如果我在構造函數(或@PostConstruct)中初始化postTest.values,則檢查的項目會正確傳遞。

爲什麼在執行POST請求後,根本不需要初始化postTest.values

有沒有辦法阻止?

或者我還有其他選擇嗎?例如。確保postTest.values已正確初始化,不使用構造函數和@PostConstruct,因爲我想在初始化之前將值傳遞給它(我嘗試了偵聽器,但他們似乎沒有解決這個問題)。

謝謝!

+0

我懷疑你的問題是範圍是兩個短。請求範圍僅計入頁面呈現 - 您第一次訪問該頁面時。在表單提交(回發)時,將創建一個新的bean並且需要重新初始化這些值。嘗試將範圍擴大到更大的範圍 - 比如Session。 –

回答

0

您還可以使用的MyFaces CODI @ViewAccessScoped註釋,如果你不想@ConversationScopedstart()end()方法玩。它是一種CDI擴展,與JSF託管bean的@ViewScoped相當。我沒有檢查這個註釋的實現,但我看到許多開發人員說它甚至比@ViewScoped註釋更好。

只需下載Myfaces CODI並將其放入類路徑並使用註釋。

+0

MyFaces CODI允許爲您的CDI bean使用'@ ViewAccessScoped'和'@ ViewScoped'。 WIKI提到了這種差異。 –