2013-05-20 7 views
0

webshop을 개발 중이며 backing bean의 JSF 구성 요소에서 입력 값을 가져 오는 데 문제가 있습니다. 데이터베이스 테이블에서 레코드를 동적으로로드하는 데이터 테이블이 있습니다. 사용자가 구매하려는 항목의 양을 선택하고 단추를 클릭하여 쇼핑 카트에 추가 할 수있게하려고합니다. 나는 dropdownbox를 사용하여 사용자가 값을 선택할 수있게하지만 어떤 값이 선택 되더라도 내 backing bean에서 얻는 값은 항상 1입니다. 도움이 될 것입니다. 여기 backing bean에서 JSF 구성 요소 값을 검색 할 수 없습니다.

는 JSF 페이지

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 

<html xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:ui="http://java.sun.com/jsf/facelets" 
    xmlns:h="http://java.sun.com/jsf/html" 
    xmlns:f="http://java.sun.com/jsf/core" 
    xmlns:p="http://primefaces.org/ui"> 

<ui:composition template="/WEB-INF/templates/basictemplate.xhtml"> 
    <ui:define name="content"> 
     <h:form id="form"> 
      <p:dataTable var="necklace" value="#{necklaceBean.necklaces}" paginator="true" rows="10" id="necklaceTable" binding="#{necklaceBean.dataTableNecklaces }" 
       paginatorTemplate="{FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink}"> 

       <f:facet name="header"> 
        Kettingen 
       </f:facet> 

       <p:column headerText="Foto" id="picture"> 
        <p:lightBox styleClass="imagebox"> 
         <h:outputLink value="#{necklace.picture }" title="#{necklace.productId }"> 
          <h:graphicImage url="#{necklace.picture }" width="175" height="116"/> 
         </h:outputLink> 
        </p:lightBox> 
       </p:column> 

       <p:column headerText="Omschrijving" id="description"> 
        <p> 
         #{necklace.description} 
        </p> 
        <p> 
         Prijs: #{necklace.price} Euro 
        </p> 
        <p> 
         <p:selectOneMenu value="#{necklaceBean.amount}">  
          <f:selectItem itemLabel="1" itemValue="1" /> 
          <f:selectItem itemLabel="2" itemValue="2" /> 
          <f:selectItem itemLabel="3" itemValue="3" /> 
          <f:selectItem itemLabel="4" itemValue="4" /> 
          <f:selectItem itemLabel="5" itemValue="5" /> 
          <f:selectItem itemLabel="6" itemValue="6" /> 
          <f:selectItem itemLabel="7" itemValue="7" /> 
          <f:selectItem itemLabel="8" itemValue="8" /> 
          <f:selectItem itemLabel="9" itemValue="9" /> 
          <f:selectItem itemLabel="10" itemValue="10" /> 
         </p:selectOneMenu> 
         X 
         <p:commandButton value="Toevoegen aan winkelwagentje" action="#{necklaceBean.addNecklaceToShoppingCart}" 
          disabled="#{necklace.soldOut}" ajax="false" /> 
        </p> 
       </p:column> 
      </p:dataTable> 
     </h:form> 
    </ui:define> 
</ui:composition> 
</html> 

을위한 코드입니다 그리고 여기에 백업 빈의 :

import java.util.List; 

import org.primefaces.component.datatable.DataTable; 

import be.petitefolie.site.controller.controllerobjects.Product; 
import be.petitefolie.site.controller.controllerobjects.ProductType; 

public class NecklaceBean extends ProductBean { 

    private List<Product> necklaces; 
    private int amount; 
    private DataTable dataTableNecklaces; 

    public NecklaceBean(){ 

     necklaces = super.listProductsByPoductType(ProductType.NECKLACE); 

    } 

    public List<Product> getNecklaces() { 
     return necklaces; 
    } 

    public void setNecklaces(List<Product> necklaces) { 
     this.necklaces = necklaces; 
    } 

    public int getAmount() { 
     return amount; 
    } 

    public void setAmount(int amount) { 
     this.amount = amount; 
    } 

    public DataTable getDataTableNecklaces() { 
     return dataTableNecklaces; 
    } 

    public void setDataTableNecklaces(DataTable dataTableNecklaces) { 
     this.dataTableNecklaces = dataTableNecklaces; 
    } 

    public String addNecklaceToShoppingCart(){ 

     super.addProductToShoppingCart((Product)this.dataTableNecklaces.getRowData(), amount); 

     return null; 
    } 

} 

답변

1

문제는 당신이 당신의 테이블의 각 행의 구성 요소에 하나의 빈을 결합하는 것입니다 . 여러 행이 있고 처음에 드롭 다운 상자에서 3을 선택하고 "장바구니에 추가"를 누르면 드롭 다운 상자에서 1이 선택된 다른 행이 있으면 콩이 1로 업데이트됩니다 (현명하게 : 첫째로 그것은 첫 번째 행에 따라 3으로 업데이트되고, 두 번째 행에 따라 1로 업데이트됩니다.

나는 이것이 귀하의 문제의 근원이라고 믿습니다. 의 List<Product>List<ProductPurchase>

class ProductPurchase{ 
    Necklace necklace; 
    int amount; 
} 

변화 necklace.amount에 목록 값 드롭 다운을 결합하고 action="#{necklaceBean.addToShoppingCart(necklace)"에 "장바구니에 추가"의 동작을 설정 :

하나의 솔루션과 같은 객체를 생성하는 것입니다.

+0

답장을 보내 주셔서 감사합니다. 이 작업 방식은 실제로 예상되는 동작을 제공합니다. 그러나 이전에이 webshop (JSF 1.2를 사용)의 이전 버전에서이 방식으로 작업했기 때문에 약간 혼란 스럽습니다. 문제없이 작동했습니다. 지금 JSF 2.1 facelets을 사용하고 있으며 문제가 지금 막 나타난 것처럼 보입니다. 이것이 JSF 2의 새로운 작업 방식과 관련이 있을까요? – Wouter

+0

@Wouter 저는 작업 버전에서 뭔가 다른 것이 틀림 없다고 생각합니다. 예를 들어 아약스를 사용하여 단일 행에서 구성 요소 만 전송하는 경우이 방법이 효과가 있었을 것입니다. 코드 없이는 말하기 어렵습니다. – dratewka