循环遍历jsp中的列表,并在单击时传递相应对象的id

时间:2013-03-28 19:31:44

标签: jsp jsf managed-bean jsf-1.2

我正在尝试理解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. 我将代码更改为href并在请求中传递了itemId并在代码中使用了该字母。
    这可行,但它有点烦人,因为我知道购物车中需要删除的对象。因此,我不需要使用该引用,而是需要传递itemId,这听起来更像是黑客。

  4. 所有代码:

    <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运行此代码,它工作正常。有人可以解释为什么我们不应该混合使用这些技术?什么时候应该使用其中任何一个?

0 个答案:

没有答案