将ListBox的内容绑定到另一个列表框中的选定项目与JSF&管理豆类

时间:2010-04-16 22:54:49

标签: java jsp jsf java-ee

我目前有一个使用两个列表框的JSF应用程序。第一个,比如ListBox1,包含制造商列表;每个选项来自数据库(通过名为QueryUtil的类中的方法getManufacturers),动态填充,其值为整数ID。到目前为止,这部分工作。

我的目标是填充第二个列表框,例如ListBox2,其中包含制造商销售的产品列表。此产品列表也将来自数据库(产品通过外键关系通过我的QueryUtil类中的方法getProducts链接到制造商)。我该怎么做呢?请记住,我在24小时内一直在与JSF合作;我愿意接受这样一个事实:我错过了一些非常简陋的事情。

同样,我已经能够很好地填写制造商名单;不幸的是,添加Products组件会给我java.lang.IllegalArgumentException: argument type mismatch

面-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>

1 个答案:

答案 0 :(得分:2)

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

您错误地使用了binding attribute而不是value。绑定属性通常仅用于将控件实例绑定到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}并在setManufacturers实例化时通过ProductBean进行设置。充其量,这是无害的代码,什么也不做,因为在任何范围内都没有名为manufacturers的变量;但是这个错误可能会导致进一步的错误。