2010-04-16 45 views
2

我目前有一個使用兩個列表框的JSF應用程序。第一個例如ListBox1包含製造商列表;每個選項都來自數據庫(通過名爲QueryUtil的類中的getManufacturers方法),動態填充,其值爲整數ID。這部分工作到目前爲止。將列表框的內容從其他列表框中綁定到另一個列表框的內容(帶JSF和託管豆)

我的目標是填充第二個列表框,說ListBox2,與製造商出售的產品列表。產品列表也將來自數據庫(產品通過外鍵關係鏈接到製造商,通過QueryUtil類中的getProducts方法)。我如何去做這件事?請記住,我一直在使用JSF不到24小時;我願意接受我錯過了一些非常基本的事實。

再一次,我已經能夠填寫製造商名單就好了;不幸的是,在添加產品組件給我java.lang.IllegalArgumentException: argument type mismatch

faces-config.xml中

<managed-bean> 
    <managed-bean-name>ProductsBean</managed-bean-name> 
    <managed-bean-class>com.nieltown.ProductsBean</managed-bean-class> 
    <managed-bean-scope>request</managed-bean-scope> 
    <managed-property> 
    <property-name>manufacturers</property-name> 
    <property-class>java.util.ArrayList</property-class> 
    <value>#{manufacturers}</value> 
    </managed-property> 
    <managed-property> 
    <property-name>selectedManufacturer</property-name> 
    <property-class>java.lang.Integer</property-name> 
    <value>#{selectedManufacturer}</value> 
    </managed-property> 
    <managed-property> 
    <property-name>products</property-name> 
    <property-class>java.util.ArrayList</property-class> 
    <value>#{products}</value> 
    </managed-property> 
    <managed-property> 
    <property-name>selectedProduct</property-name> 
    <property-class>java.lang.Integer</property-name> 
    <value>#{selectedProducts}</value> 
    <managed-property> 
</managed-bean> 

com.nieltown.ProductsBean

public class ProductsBean { 

    private List<SelectItem> manufacturers; 
    private List<SelectItem> products; 
    private Integer selectedManufacturer; 
    private Integer selectedProduct; 

    public ProductsBean() {} 

    public Integer getSelectedManufacturer(){ 

     return selectedManufacturer; 

    } 

    public void setSelectedManufacturer(Integer m){ 

     selectedManufacturer = m; 

    } 

    public Integer getSelectedProduct(){ 

     return selectedProduct; 

    } 

    public void setSelectedProduct(Integer p){ 

     selectedProduct = p; 

    } 

    public List<SelectItem> getManufacturers(){ 

     if(manufacturers == null){ 
      SelectItem option; 
      plans = new ArrayList<SelectItem>(); 
      QueryUtil qu = new QueryUtil(); 
      Map<Integer, String> manufacturersMap = qu.getManufacturers(); 
      for(Map.Entry<Integer, String> entry : manufacturersMap.entrySet()){ 
       option = new SelectItem(entry.getKey(),entry.getValue()); 
       manufacturers.add(option); 

      } 
     } 
     return manufacturers; 

    } 

    public void setManufacturers(List<SelectItem> l){ 

     manufacturers = l; 

    } 

    public List<SelectItem> getProducts(){ 

     if(products == null){ 
      SelectItem option; 
      products = new ArrayList<SelectItem>(); 
      if(selectedPlan != null){ 
       PMTQueryUtil pqu = new PMTQueryUtil(); 
       Map<Integer, String> productsMap = pqu.getProducts(); 
       for(Map.Entry<Integer, String> entry : productsMap.entrySet()){ 
        option = new SelectItem(entry.getKey(),entry.getValue()); 
        products.add(option); 
       } 
      } 
     } 
     return products; 
    } 

    public void setProducts(List<SelectItem> l){ 

     products = l; 

    } 
} 

JSP片段

<h:selectOneListbox id="manufacturerList" 
    value="#{ProductsBean.selectedManufacturer}" 
    size="10"> 
    <f:selectItems value="#{ProductsBean.manufacturers}" /> 
</h:selectOneListbox> 
<h:selectOneListbox id="productList" 
    value="#{PendingPlansBean.selectedProduct}" 
    size="10"> 
    <f:selectItems binding="#{ProductsBean.products}" /> 
</h:selectOneListbox> 

回答

2
<f:selectItems binding="#{ProductsBean.products}" /> 

您錯誤地使用了binding attribute而不是value。 binding屬性通常只用於將控件實例綁定到bean。這可能是異常的來源,因爲它預期的類型爲UIComponent並得到List<SelectItems>

<managed-property> 
    <property-name>manufacturers</property-name> 
    <property-class>java.util.ArrayList</property-class> 
    <value>#{manufacturers}</value> 
    </managed-property> 

託管屬性是依賴注入的一種形式。通過定義上述屬性,您可以告訴JSF框架解析#{manufacturers}並在ProductBean實例化時通過setManufacturers進行設置。最好的情況是,這是無害的代碼,它不會執行任何操作,因爲在任何範圍內都沒有變量manufacturers;但是這個錯誤可能會導致更多的錯誤。

+0

不幸的是,使用「值」而不是「綁定」是我第一次嘗試。我沒有得到例外,但是當我選擇製造商時,產品列表不會自動填充。這就是我真正想要做的。 我可能會在這裏叫出錯誤的樹;我需要的解決方案可能需要的不僅僅是對如何設置我的bean和JSF控件的修改。我是否需要將一個onClick事件添加到製造商列表中,一旦製造商被選中,該列表就會進行AJAX調用以填充產品列表? – nieltown 2010-04-19 14:42:08

+0

在生成產品列表之前,您需要向服務器提交某種形式的數據以設置'selectedManufacturer'。這可以通過onclick,按鈕(或者AJAX假設你選擇的JSF棧支持它)。我建議您熟悉JSF生命週期,並瞭解它何時會導致調用bean方法。 http://java.sun.com/javaee/5/docs/tutorial/doc/bnaqq.html – McDowell 2010-04-25 14:52:06

相關問題