Страница JSP не подтверждает мой тип данных - PullRequest
1 голос
/ 09 августа 2011

Я использую Eclipse Helios со Struts и у меня возникла проблема с новичком: я не мог понять, почему моя страница jsp не распознает файл .java моего бизнес-объекта.

Я думаю, что это как-то связано с файлами классов .java, так как я не смог их отобразить в разделе ИМПОРТ. КЛАССОВ под моим заголовком Библиотечные ресурсы. Лучшее, что я смог сделать до сих пор, - это загрузить файлы классов в виде отдельного jar-файла (который, конечно, до сих пор не отображается в разделе «ИМПОРТИРОВАННЫЕ КЛАССЫ»).

Кто-нибудь знает, почему мой файл 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>

Ссылка, которая запрашивает действие / сервлет:

 <div id="cartLink"><a href="<s:url action="cart?productCode=XM123456"/>">Add to Cart</a></div> 

1 Ответ

2 голосов
/ 09 августа 2011

Вы ожидаете, что корзина будет присутствовать в (новой) HttpSession.Учитывая, что HttpSession существует, потому что вы работаете в tomcat / jetty, и любой из этих контейнеров сервлетов создаст для вас сеанс.

Теперь вы запрашиваете корзину в этом сеансе.Почему вы ожидаете, что он там будет?

Cart cart = (Cart) session.getAttribute("cart");

Вы можете создать его, если session.getAttribute ("cart") вернет null и сохранить его в вашем объекте сеанса.

...