多次调用JSF commandButton操作

多次调用JSF commandButton操作,jsf,foreach,javabeans,Jsf,Foreach,Javabeans,我的JSF页面有问题 程序:用户可以通过输入表单来搜索比萨饼。过滤搜索是可能的,因为用户可以决定是否搜索披萨名称、披萨id或其他指定条件。程序将生成一个SQL查询,返回pizza对象并将其存储到对象列表中。JSF页面通过ui:repeat标记迭代显示pizza对象的列表。将显示比萨饼名称、比萨饼ID、显示为单选按钮的可用尺寸以及可能的数量列表。对于每个显示的比萨饼对象,都有一个“添加到购物车”按钮,用于根据所选大小和数量的参数化值将比萨饼添加到购物车 问题是:几乎所有内容都显示正确。但是,当要将

我的JSF页面有问题

程序:用户可以通过输入表单来搜索比萨饼。过滤搜索是可能的,因为用户可以决定是否搜索披萨名称、披萨id或其他指定条件。程序将生成一个SQL查询,返回pizza对象并将其存储到对象列表中。JSF页面通过ui:repeat标记迭代显示pizza对象的列表。将显示比萨饼名称、比萨饼ID、显示为单选按钮的可用尺寸以及可能的数量列表。对于每个显示的比萨饼对象,都有一个“添加到购物车”按钮,用于根据所选大小和数量的参数化值将比萨饼添加到购物车

问题是:几乎所有内容都显示正确。但是,当要将比萨饼添加到购物车时,就会出现错误。如果用户决定要比萨饼,请选择比萨饼的大小和数量,然后单击比萨饼的命令按钮“添加到购物车”。调用addToCart方法,只返回提交的参数pizzaID、chosenSize、chosenQuantity。但不知何故,该方法将被多次调用

JSF页面:

bean Pizza搜索:

豆馅饼的结果是:

正如我在之前的问题中所写的,我已经使用了ui:repeat标记,但多次调用的问题并未出现。但是我必须找到另一个解决方案来迭代我的pizza对象列表,这就是为什么我使用c:forEach。我也不想从Majorra变成MyFaces


我希望你能帮助我。谢谢

h:form标记应该在c:forEach之外。尝试使用ui:repeat和f:setPropertyActionListener来设置选定的pizza。如果我将h:form移到外部,将抛出错误。这不是我想要的。我真的想为每个显示的比萨饼添加一个购物车按钮。正如我已经提到的,ui:repeat在Majorra下有一个bug,所以我不能使用ui:repeat。看到什么错误了吗?有重复id的东西?没错。有一个错误告诉我某些ID已被使用。请尝试将varStatus=status添加到c:forEach。而不是在id的附加索引中,例如id=chosenQuantity_{status.index}
<c:forEach var="result" items="#{pizzaResults.results}">
<h:form>
   <ul>
      <li><p>Name: #{result.pizza.name}</p></li>
      <li><p>ID: #{result.pizza.pizzaID}</p></li>
      <li>
         <p>Toppings:</p>
         <ui:repeat var="topping" value="#{result.toppingList}">
            <p>#{topping.toppingName}</p>
         </ui:repeat>
      </li>
      <li>
         <p>Sizes:</p>
         <h:selectOneRadio id="chosenSize" value="#{pizzaResult.chosenSize}">
            <f:selectItems value="#{result.sizeList} var="size" itemLabel="#{size.diameter}" itemValue="#{size.sizeID}"/>
         </h:selectOneRadio>
      </li>
      <li>
         <p>Quantity:</p>
         <h:selectOneListbox id="chosenQuantity" value="#{pizzaResult.chosenQuantity}" size="1">
            <f:selectItem id="quantity1" itemLabel="1x" itemValue="1">
            <f:selectItem id="quantity2" itemLabel="2x" itemValue="2">
         </h:selectOneListbox>
      </li>
      <li>
         <h:commandButton value="add to cart" action="#{pizzaResult.addToCart(result.pizza.pizzaID)}"/>
      </li>
   </ul>
</h:form>
</c:forEach>
@ManagedBean
@SessionScoped
public class PizzaSearch {

   // variables in order to submit the search criteria
   private List<PizzaObject> results = new ArrayList<PizzaObject>();

   // methods to generate the search
   // each search result will fill/replace the list of pizza objects 'results'

   // getter and setter methods, just like
   public List<PizzaObject> getResults() {
      return results;
   }
}
@ManagedBean
@SessionScoped
public class PizzaResult {

   // injection of PizzaSearch
   @ManagedProperty(value="#{pizzaSearch}")
   private PizzaSearch pizzaSearch;

   // variables
   private List<PizzaObject> results;
   private int _chosenSize;
   private int _chosenQuantity;

   @PostConstruct
   public void initResults() {
      this.results = pizzaSearch.getResults();
   }

   // this method is being invoked multiple times
   // method to add the pizza object to the cart
   public void addToCart(int chosenPizzaID) {
      System.out.println("chosen pizza ID: " + chosenPizzaID);
      System.out.println("chosen size:     " + _chosenSize);
      System.out.println("chosen quantity: " + _chosenQuantity);
   }

   // getter and setter methods
}