2013-05-15 5 views
-1

Я понятия не имею, почему мои формы ведут себя таким образом.JSF формирует странное поведение

Это моя JSF страница:

<h:body> 
    <h:form> 
    <h:form> 
     <h:selectOneMenu value="#{productBean.product}" converter="#{productConverter}" validator="com.jsf.ProductAvailableValidator"> 
     <f:selectItems value="#{productBean.pizza}" var="pizza" itemValue="#{pizza}" itemLabel="#{pizza.name}" /> 
     <h:commandButton value="Dodaj" action="#{productBean.addToOrder(productBean.product.name)}" /></h:selectOneMenu> 
    </h:form> 
    <h:form> 
     <h:selectOneMenu value="#{productBean.product}" converter="#{productConverter}" validator="com.jsf.ProductAvailableValidator"> 
     <f:selectItems value="#{productBean.drink}" var="drink" itemValue="#{drink}" itemLabel="#{drink.name}" /> 
     <h:commandButton value="Dodaj" action="#{productBean.addToOrder(productBean.product.name)}" /></h:selectOneMenu> 
    </h:form> 
    <h:form> 
     <h:selectOneMenu value="#{productBean.product}" converter="#{productConverter}" validator="com.jsf.ProductAvailableValidator"> 
     <f:selectItems value="#{productBean.other}" var="other" itemValue="#{other}" itemLabel="#{other.name}" /> 
     <h:commandButton value="Dodaj" action="#{productBean.addToOrder(productBean.product.name)}" /></h:selectOneMenu> 
    </h:form> 
    <messages /> 
    <h:outputText value="#{productBean.order}" /> 
    <h:commandButton value="Wyczyść" action="#{ProductBean.clearOrder()}" /></h:form> 
</h:body> 

И это мой ProductBean:

@ManagedBean 
@SessionScoped 
public class ProductBean extends Connector 
{ 

    private List<Product> products; 
    private List<Product> pizza; 
    private List<Product> drink; 
    private List<Product> other; 
    boolean first = true; 
    private StringBuilder order = new StringBuilder(); 

    public String getOrder() { 
     return order.toString(); 
    } 
    private Product product; 

    public Product getProduct() { 
     return product; 
    } 
    public void setProduct(Product product) { 
     this.product = product; 
    } 
    public void addToOrder(String prod) 
    { 
     System.out.println("dodaje"); 
     if(first) 
     { 
      first = false; 
      this.order.append(prod); 
     } 
     else 
      this.order.append(" + ").append(prod); 
    } 
    public void clearOrder() 
    { 
     this.order = null; 
     first = true; 
    } 
    public void setProducts(List<Product> products) { 
     this.products = products; 
    } 
    public ProductBean() throws SQLException 
    { 
     resultSet = statement.executeQuery("SELECT * FROM dbo.products"); 
     products = new ArrayList<Product>(); 
     while(resultSet.next()) 
     { 
      product = new Product(); 
      product.setId_product(resultSet.getInt("id_product")); 
      product.setName(resultSet.getString("name")); 
      product.setCategory(resultSet.getInt("category_id")); 
      product.setIs_available(resultSet.getInt("is_available")); 
      products.add(product); 
     } 
    } 
    public Product getProductById(int id) 
    { 
     Iterator<Product> it = products.iterator(); 
     while(it.hasNext()) 
     { 
      Product prod = it.next(); 
      if(prod.getId_product() == id) 
       return prod; 
     } 
     return null; 
    } 

    public List<Product> getPizza() throws SQLException 
    { 
     Iterator<Product> it = products.iterator(); 
     pizza = new ArrayList<Product>(); 
     while(it.hasNext()) 
     { 
      Product prod = it.next(); 
      if(prod.getCategory() == 1) 
       pizza.add(prod); 
     } 
     return pizza; 
    } 
    public List<Product> getDrink() throws SQLException 
    { 
     Iterator<Product> it = products.iterator(); 
     drink = new ArrayList<Product>(); 
     while(it.hasNext()) 
     { 
      Product prod = it.next(); 
      if(prod.getCategory() == 2) 
       drink.add(prod); 
     } 
     return drink; 
    } 
    public List<Product> getOther() throws SQLException 
    { 
     Iterator<Product> it = products.iterator(); 
     other = new ArrayList<Product>(); 
     while(it.hasNext()) 
     { 
      Product prod = it.next(); 
      if(prod.getCategory() == 3) 
       other.add(prod); 
     } 
     return other; 
    } 
    public List<Product> getProducts() { 
     return products; 
    } 

} 

Я также отправить скриншот здесь, чтобы сделать код проще и быстрее провести анализ: enter image description here

Что здесь происходит, так это то, что работает только первая кнопка «Dodaj» (что означает «добавить») и правильно добавляет строку в выводную метку. Остальные из них ничего не делают. Когда я меняю заказ, снова работает только первый. Зачем?

+0

Формы вложения запрещены в HTML и, следовательно, также запрещены в JSF. – skuntsel

+0

Что вы думаете, это хорошая идея, чтобы это сделать правильно? и работает как я хочу –

+0

Попытайтесь лучше понять синтаксис HTML/HTML-элементов. В этом конкретном случае я бы сделал все это в одной форме с помощью одной кнопки заказа и будет обновлять компоненты AJAX по пути выбора. – skuntsel

ответ

1

У вас есть несколько вложенных/каскадных <h:form>, что запрещено в HTML! Либо сделайте один <h:form> и поместите все элементы в эту форму, либо сделайте несколько <h:form>, но не вложите их в каскад!

+0

, так как следует реализовать такую ​​функцию в одной форме? Мне также нужна одна основная кнопка, чтобы отправить весь заказ String в конечном итоге –

+0

используйте только один «» вокруг всех ваших тегов JSF, он выполнит задание – Manuel

+0

. Я сделал это, и это беспорядок прямо сейчас. Каждый объект из списка использует верификатор и без отдельных форм. Каждая кнопка запускает валидатор для всех selectOneMenus. Например, я хочу добавить только Coca-Cola, но это не позволит мне beacause «Pudełko na wynos» недоступен, и валидатор не может пройти мимо. –