我正在使用带有Struts的Eclipse Helios,我正在想象的是一个新手问题:对于我的生活,我无法弄清楚为什么我的jsp页面不会确认我的业务对象.java文件。
我认为它与.java类文件有关,因为我无法将它们显示在我的Library Resources标题下的IMPORTED CLASSES部分中。到目前为止,我能够做的最好的事情是将类文件作为一个单独的jar加载(当然,它仍未出现在IMPORTED CLASSES部分中)。
有谁知道为什么我的cart.jsp文件拒绝允许我引用我的Cart.java业务对象?当我尝试在下面创建Cart,LineItem和Product对象时,我得到一个空指针错误。
以下是一些片段:
webapp\WebContent\example\cart.jsp
<%@ page import="bo.*, java.util.ArrayList" %>
<%
Cart cart = (Cart) session.getAttribute("cart");
ArrayList<LineItem> items = cart.getItems();
for (LineItem item : items)
{
Product product = item.getProduct();
%>
<tr valign="top">
<td>
<form action="<%=response.encodeURL("cart")%>" method="post">
<input type="hidden" name="productCode"
value="<%=product.getCode()%>">
<input type=text size=2 name="quantity"
value="<%=item.getQuantity()%>">
<input type="submit" value="Update">
</form>
</td>
<td>
<%=product.getDescription()%>
</td>
<td>
<%=product.getPriceCurrencyFormat()%>
</td>
<td>
<%=item.getTotalCurrencyFormat()%>
</td>
<td>
<form action="<%= response.encodeURL("cart")%>" method="post">
<input type="hidden" name="productCode"
value="<%=product.getCode()%>">
<input type="hidden" name="quantity"
value="0">
<input type="submit" value="Remove Item">
</form>
</td>
</tr><% } %>
Java Resources\src\bo\Cart.java
package bo;
import java.util.*;
import java.io.Serializable;
public class Cart implements Serializable
{
private ArrayList<LineItem> items;
public Cart()
{
items = new ArrayList<LineItem>();
}
public void setItems(ArrayList<LineItem> lineItems)
{
items = lineItems;
}
etc. . . .
Java Resources\src\bo\DisplayCartServlet.java
package action;
import java.io.*;
import java.sql.SQLException;
import javax.servlet.*;
import javax.servlet.http.*;
import org.apache.struts.action.*;
import bo.*;
import dao.*;
public class DisplayCartServlet extends Action
{
public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request,
HttpServletResponse response)
throws IOException, ServletException
{
String forward = new String("success"); ;
String productCode = request.getParameter("productCode");
HttpSession session = request.getSession();
Cart cart = (Cart) session.getAttribute("cart");
if (cart == null)
{
cart = new Cart();
session.setAttribute("cart", cart);
}
int quantity = 1;
// Get product from product code
Product product=null;
try {
product = ProductDB.selectProduct(productCode);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
session.setAttribute("product", product);
// If product exists, add or remove from cart
if (product != null)
{
LineItem lineItem = new LineItem();
lineItem.setProduct(product);
lineItem.setQuantity(quantity);
if (quantity > 0)
cart.addItem(lineItem);
else
cart.removeItem(lineItem);
}
session.setAttribute("cart", cart);
return(mapping.findForward(forward));
}
}
Struts.xml声明:
<struts>
<constant name="struts.enable.DynamicMethodInvocation" value="false" />
<constant name="struts.devMode" value="false" />
<package name="example" namespace="/example" extends="struts-default">
<action name="cart" class="action.DisplayCartServlet" method="execute">
<result name="success">/example/cart.jsp</result>
</action>
</package>
. . . .
</struts>
请求action / servlet的链接:
<div id="cartLink"><a href="<s:url action="cart?productCode=XM123456"/>">Add to Cart</a></div>
答案 0 :(得分:2)
您希望购物车出现在(新)HttpSession中。鉴于存在HttpSession,因为您在tomcat / jetty中运行,并且这些servlet容器中的任何一个都将为您创建会话。
现在你在那个会话中要求购物车。你为什么期望它在那里?
Cart cart = (Cart) session.getAttribute("cart");
如果session.getAttribute(“cart”)返回null并将其存储在会话对象中,则可以创建一个。