JSP と Managed Bean の相互作用の動作を理解しようとしています。(JSF 1.2を使用してこれをテストします)
カートに追加されたアイテムのリストを表示するカートページと、各行の最後にある削除ボタンを使用して、ユーザーがその特定のアイテムをカートから削除できるようにします。
私が直面した問題は次のとおりです。
カート ページのすべてのアイテムに対して、アイテムの削除ボタンがクリックされたときにそのオブジェクトに対して呼び出される共通の削除メソッドが必要でした。ボタンの対応するデータ オブジェクトの id 値を
backingBean.removeFromCart
メソッドに渡すことを考えました。しかし、それは不可能でした。値を解釈できなかったので
action="#{cartBackingBean.removeFromCart(#{cart.item.id})}"
InputHidden
タグを使用して、ボタンのクリック時に削除機能に itemId を渡すことができると思いました。しかし、これでもうまくいきませんでした。カート オブジェクトを取得すると、jspで null であることが判明しました。
<%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 を渡す必要があります。これはハックのように聞こえます。
すべてのコードについて:
<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 を使用してこのコードを実行しており、正常に動作します。なぜこれらのテクノロジーを混在させてはいけないのか、誰か説明してもらえますか? そして、いつそれらのいずれかを使用する必要がありますか?