我正在尝试理解JSP和托管bean交互的行为。 (使用JSF 1.2来测试这个)
我有一个购物车页面,显示添加到购物车的商品列表和每行末尾的删除按钮,使用户可以从购物车中删除该特定商品。
我遇到的问题是:
对于购物车页面中的每个商品,我想要一个常用的移除方法,当点击移除商品按钮时,该方法会被调用。
我想把按钮的相应数据对象的id值传递给backingBean.removeFromCart
方法。
但那是不可能的。因为它无法解释价值
action="#{cartBackingBean.removeFromCart(#{cart.item.id})}"
我想我可以使用InputHidden
标签,并在按钮点击时将itemId传递给我的删除功能。
但即使这样也没有用。当我获得购物车对象时,它在jsp中被证明是空的。
<%CartData cart = (CartData) request.getAttribute("cart"); if(cart != null) out.println("<input type=\"Hidden\" id =\"itemId\" name=\"itemId\" value =\""+cart.getItem().getId() +"\" />");%>
我将代码更改为href
并在请求中传递了itemId并在代码中使用了该字母。
这可行,但它有点烦人,因为我知道购物车中需要删除的对象。因此,我不需要使用该引用,而是需要传递itemId,这听起来更像是黑客。
所有代码:
<f:view>
<h:form id="search">
<h:panelGrid bgcolor="skyblue" border="3">
<c:if test="${not empty cartBackingBean.cartData}">
<c:forEach var="cart" items="#{cartBackingBean.cartData}">
<h:panelGroup rendered="#{!cartBackingBean.invalidAccess}">
<h:graphicImage value="#{cart.item.imageUrl}" height="60" width="300"/>
</h:panelGroup>
<h:panelGroup rendered="#{!cartBackingBean.invalidAccess}">
<h:outputText value="#{cart.item.name}">
</h:outputText>
</h:panelGroup>
<h:panelGroup rendered="#{!cartBackingBean.invalidAccess}">
<a href="RemoveItemFromCart.view?itemId=${cart.item.id}" style="color: blue; font-style: italic;border: green; ">Remove item from cart</a>
</h:panelGroup>
<!-- Didn't Work -->
<%
CartData cart = (CartData) request.getAttribute("cart");
if(cart != null)
out.println("<input type=\"Hidden\" id =\"itemId\" name =\"itemId\" value =\""+ cart.getItem().getId() +"\" />");
%>
<!-- <h:commandButton value="Remove from Cart" id="submit2" action="#{cartBackingBean.removeFromCart}" /> -->
</c:forEach>
</c:if>
<h:panelGroup style="display:block; text-align:center" rendered="#{!cartBackingBean.invalidAccess}">
<div class="search">
<h:commandButton value="Add to Order" id="submit1" action="#{cartBackingBean.addToOrder}"/>
<h:commandButton image="images/submit.gif" value="Save Cart" id="submit" action="#{cartBackingBean.saveCart}"/>
</div>
</h:panelGroup>
</h:panelGrid>
</h:form>
</f:view>
支持Bean 代码:
您可以参考此行
// This is unnecessary code which I could've avoided if I can pass the exact cart object from UI.
这是我想避免的。
public String removeFromCart()
{
Long itemId = -1L;
if((Connection.getRequest().getParameter("itemId") != null
&& Long.parseLong(Connection.getRequest().getParameter("itemId").toString()) >= 0))
{
itemId = Long.parseLong(Connection.getRequest().getParameter("itemId").toString());
}
if(itemId < 0L && (Connection.getRequest().getAttribute("itemId") != null
&& Long.parseLong(Connection.getRequest().getAttribute("itemId").toString()) >= 0))
{
itemId = Long.parseLong(Connection.getRequest().getAttribute("itemId").toString());
}
if(itemId < 0L && (Connection.getRequest().getSession().getAttribute("itemId") != null
&& Long.parseLong(Connection.getRequest().getSession().getAttribute("itemId").toString()) >= 0))
{
itemId = Long.parseLong(Connection.getRequest().getSession().getAttribute("itemId").toString());
}
this.clearError();
if(itemId == -1L)
{
this.setError("Could not delete as item was not found");
return Constants.ERROR;
}
// This is unnecessary code which I could've avoided if I can pass the exact cart object from UI.
if(!Util.isNullList(getCartData()))
{
for(CartData cart : this.cartData)
{
if(cart.getItemId() == itemId)
{
cart.setItem(null);
Connection.getCurrentDBSession().delete(cart);
break;
}
}
}
this.setError(Constants.EMPTY_STRING);
Util.removeBean("cartBackingBean");
Connection.getRequest().getSession().setAttribute(Constants.FORWARD_MESSAGE_TO_NEXT_BB, "Item removed from Cart Successfully!!");
return Constants.CART;
}
{strong>完整代码可通过here查看。
另外,我听说有人说不要在JSP中使用JSF标签,因为它不起作用或支持 但我一直在使用JSP运行此代码,它工作正常。有人可以解释为什么我们不应该混合使用这些技术?什么时候应该使用其中任何一个?