我的JSF页面有问题。
该计划:用户可以通过输入表单来搜索比萨饼。过滤搜索是可能的,因为用户可以决定他是否搜索比萨饼名称,比萨饼ID或其他指定标准。该程序将生成一个SQL查询,该查询返回pizza对象并将其存储到对象列表中。 JSF页面通过ui:repeat标记迭代它们来显示披萨对象列表。将显示比萨饼名称,比萨饼ID,可用尺寸(显示为单选按钮)和可能数量列表。对于每个显示的披萨对象,都有一个"添加到购物车按钮",用于在所选尺寸和数量的参数化值下将披萨添加到购物车。
问题:几乎所有内容都正确显示。但是当在购物车上添加比萨饼时,会发生错误。如果用户决定披萨,请选择它的大小和数量,然后点击比萨饼的命令按钮"添加到购物车"。调用方法addToCart()并简单地返回提交的参数(pizzaID,selectedSize,chosenQuantity)。但不知何故,该方法将被多次调用。
JSF页面:
<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>
Bean PizzaSearch:
@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;
}
}
Bean PizzaResult:
@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
}
正如我在之前的问题(JSF & ui:repeat - issue with adding an object to cart)中写的那样,我已经使用了ui:repeat标签,但没有发生多次调用的问题。但我必须找到另一个解决方案来迭代我的披萨对象列表,这就是我使用c:forEach的原因。我也不想从Majorra换到MyFaces。
我希望你能以某种方式帮助我。谢谢!