我试图了解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() +"\" />");%>
我将代码更改为 a
href
并在请求中传递 itemId 并在代码中使用它。
这可行,但是有点烦人,因为我知道购物车中需要删除的对象。因此,我需要传递 itemId 而不是使用该引用,这听起来更像是一个 hack。
在所有代码中:
<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;
}
完整的代码可在此处查看以供查看。
另外,我听到有人说不要在 JSP 中使用 JSF 标签,因为它不起作用或不支持。
但我一直在使用 JSP 运行这段代码,它运行良好。有人可以解释一下为什么我们不应该混合这些技术吗?什么时候应该使用它们中的任何一个?