2010-04-16 4 views
2

현재 두 개의 목록 상자를 사용하는 JSF 응용 프로그램이 있습니다. 첫 번째 제품인 ListBox1에는 제조업체 목록이 들어 있습니다. 각 옵션은 QueryUtil 클래스의 getManufacturers 메소드를 통해 데이터베이스에서 가져오고, 동적으로 채워지고, 값은 정수 ID입니다. 이 부분은 지금까지 작동합니다.JSF & Managed Beans가있는 다른 목록 상자에서 ListBox의 내용을 다른 목록 상자에 바인딩

내 목표는 두 번째 목록 상자, 예를 들어 ListBox2를 제조업체가 판매하는 제품 목록으로 채우는 것입니다. 이 제품 목록은 데이터베이스에서 가져옵니다 (제품은 QueryUtil 클래스의 getProducts 메소드를 통해 외래 키 관계를 통해 제조업체에 연결됩니다). 어떻게해야합니까? 24 시간 동안 JSF로 작업 해 왔음을 기억하십시오. 나는 아주 초보적인 것을 놓치고 있다는 사실을 기꺼이 받아 들일 것이다.

다시 말하지만, 제조업체의 목록을 잘 채울 수있었습니다. 불행히도, 제품의 성분을 첨가하여 저

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

<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 java.lang.IllegalArgumentException: argument type mismatch

면-config.xml에 제공

답변

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

value 대신 binding attribute을 잘못 사용했습니다. 바인딩 속성은 일반적으로 컨트롤 인스턴스를 bean에 바인딩하는 데에만 사용됩니다. 이것은 UIComponent 유형을 예상하고 List<SelectItems>을 받기 때문에 예외 소스 일 수 있습니다.

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

관리 속성은 종속성 주입의 한 형태입니다. 위의 속성을 정의함으로써, ProductBean이 인스턴스화 될 때 setManufacturers을 통해 JSF 프레임 워크에 #{manufacturers}을 설정하고이를 설정합니다. 아무래도 범위에 manufacturers이라는 변수가 없으므로 아무런 효과가없는 무해한 코드입니다. 그러나이 실수로 인해 버그가 더 심해질 수 있습니다.

+0

불행히도 "바인딩"대신 "값"을 사용하면 먼저 시도해 봤습니다. 예외는 없지만 제조업체를 선택할 때 제품 목록이 자동으로 채워지지 않습니다. 그게 내가 진정으로하려는거야. 나는 여기 잘못된 나무를 짖고 있을지도 모른다. 필요한 솔루션은 bean 및 JSF 컨트롤을 설정하는 방법을 수정하는 것 이상을 요구할 수 있습니다. 제조업체 목록에 onClick 이벤트를 추가해야 제조업체 목록에서 AJAX 호출을 통해 제품 목록을 채울 수 있습니까? – nieltown

+0

제품 목록을 생성하기 전에'selectedManufacturer'를 설정하기 위해 서버에 데이터를 제출해야합니다. 이것은 onclick, 버튼 (또는 선택한 JSF 스택이 지원한다고 가정하는 AJAX)을 통해 이루어질 수 있습니다. JSF 라이프 사이클을 익히고 빈 메소드를 호출 할 수있는시기를 알아 보는 것이 좋습니다. http://java.sun.com/javaee/5/docs/tutorial/doc/bnaqq.html – McDowell

관련 문제