1

我试图了解JSP 和托管 bean 交互的行为。(使用 JSF 1.2 对此进行测试)
我有一个购物车页面,其中显示了已添加到购物车中的项目列表,并在每行末尾有一个删除按钮,使用户能够从购物车中删除该特定项目。

我面临的问题是:

  1. 对于购物车页面中的每个项目,我想要一个通用的删除方法,当单击删除项目按钮时,该方法会为该对象调用。我想到了将按钮对应的数据对象的 id 值传递给backingBean.removeFromCart方法。

    但那是不可能的。因为它无法解释价值

    action="#{cartBackingBean.removeFromCart(#{cart.item.id})}"
    
  2. 我想可能我可以使用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() +"\" />");%>
    
  3. 我将代码更改为 ahref并在请求中传递 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 运行这段代码,它运行良好。有人可以解释一下为什么我们不应该混合这些技术吗?什么时候应该使用它们中的任何一个?

4

0 回答 0