problemer med Webshop i JSP/Servlet
Jeg får følgende fejl når jeg prøvet at tilføje en bogtype Exception report
message
description The server encountered an internal error () that prevented it from fulfilling this request.
exception
java.lang.NullPointerException
test.ShoppingServlet.doPost(ShoppingServlet.java:50)
javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
note The full stack trace of the root cause is available in the Apache Tomcat/5.0.28 logs.
Jeg har følgende klasser og jsp dokumenter. Fatter ikke hvad problemet kan være
ShoppingServlet
package test;
import java.util.*;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import test.dbConnect;
import java.net.*;
import java.sql.*;
import java.util.ArrayList;
public class ShoppingServlet extends HttpServlet {
public void init(ServletConfig conf) throws ServletException {
super.init(conf);
}
public void doPost (HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
HttpSession session = request.getSession(false);
if (session == null) {
response.sendRedirect("http://localhost:8080/minApp/error.html");
}
Vector buylist = (Vector)session.getValue("shopping.shoppingcart");
String action = request.getParameter("action");
if (!action.equals("CHECKOUT")) {
if (action.equals("DELETE")) {
String del = request.getParameter("delindex");
int d = (new Integer(del)).intValue();
buylist.removeElementAt(d);
} else if (action.equals("ADD")) {
//any previous buys of same cd?
boolean match=false;
Book aBook = getBook(request);
if (buylist==null) {
//add first cd to the cart
buylist = new Vector(); //first order
buylist.addElement(aBook);
} else { // not first buy
for (int i=0; i< buylist.size(); i++) {
Book book = (Book) buylist.elementAt(i);
if (book.getIsbn().equals(aBook.getIsbn())) {
book.setAntal(book.getAntal()+aBook.getAntal());
buylist.setElementAt(book,i);
match = true;
} //end of if name matches
} // end of for
if (!match)
buylist.addElement(aBook);
}
}
session.putValue("shopping.shoppingcart", buylist);
String url="/jsp/shopping/showBookSpec.jsp";
ServletContext sc = getServletContext();
RequestDispatcher rd = sc.getRequestDispatcher(url);
rd.forward(request, response);
} else if (action.equals("CHECKOUT")) {
float total =0;
for (int i=0; i< buylist.size();i++) {
Book anOrder = (Book) buylist.elementAt(i);
float pris= anOrder.getPris();
int antal = anOrder.getAntal();
total += (pris * antal);
}
total += 0.005;
String amount = new Float(total).toString();
int n = amount.indexOf('.');
amount = amount.substring(0,n+3);
request.setAttribute("amount",amount);
String url="/jsp/shopping/Checkout.jsp";
ServletContext sc = getServletContext();
RequestDispatcher rd = sc.getRequestDispatcher(url);
rd.forward(request,response);
}
}
private Book getBook(HttpServletRequest request) {
try {
dbConnect dbc = new dbConnect();
Connection con = dbc.getConnection();
Statement stmt = con.createStatement();
String myBook = request.getParameter("isbn");
String antal = request.getParameter("antal");
ResultSet rs = stmt.executeQuery("SELECT isbn, forfatter, titel, pris FROM boeger WHERE isbn = '" + myBook + "'");
Book book = new Book();
book.setForfatter(rs.getString(2));
book.setTitel(rs.getString(3));
book.setIsbn(rs.getString(1));
book.setPris((new Float(rs.getFloat(4))).floatValue());
book.setAntal((new Integer(antal)).intValue());
return book;
} catch (Exception e) {
return null;
}
}
}
Beanen Book, medlem af samme package
package test;
public class Book {
String forfatter;
String titel;
String isbn;
float pris;
int antal;
public Book() {
forfatter="";
titel="";
isbn="";
pris=0;
antal=0;
}
public void setForfatter(String forfatter) {
this.forfatter = forfatter;
}
public String getForfatter() {
return forfatter;
}
public void setTitel(String titel) {
this.titel = titel;
}
public String getTitel() {
return titel;
}
public void setIsbn(String isbn) {
this.isbn = isbn;
}
public String getIsbn() {
return isbn;
}
public void setPris(float pris) {
this.pris = pris;
}
public float getPris() {
return pris;
}
public void setAntal(int antal) {
this.antal = antal;
}
public int getAntal() {
return antal;
}
}
XML dokumentet til selve Tomcat for at den kan finde de forskellige servlets
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
<servlet>
<servlet-name>ShoppingServlet</servlet-name>
<servlet-class>test.ShoppingServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ShoppingServlet</servlet-name>
<url-pattern>/ShoppingServlet</url-pattern>
</servlet-mapping>
</web-app>
Min showBookSpec.jsp der får en bog fra nogle andre servlets Denne virke, men kan godt være den poster forkert data til ShoppingServletten. Alle JSP sider ligger i tomcattes webapps bibliotek under minApp/jsp/shopping mens servletsne og beanerne ligger under minApp/WEB-INF/classes/test
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<%@ page session="true" %>
<html>
<head>
<title>Genre Liste</title>
</head>
<body>
<jsp:useBean id="showBook" scope="request" class="java.util.ArrayList"/>
<jsp:useBean id="search" scope="request" class="java.lang.String"/>
<jsp:useBean id="searchnone" scope="request" class="java.lang.String"/>
<%
if(search.equals("done")) {
%>
<%
if(showBook.size()==0) {
%>
Bogen blev ikke fundet
<%
}
for(int i = 0; i < showBook.size(); i++) {
test.bog bog = (test.bog)showBook.get(i);
%>
<br/>
<table cellspacing="2" cellpadding="2" border="0">
<tr>
<td>Forfatter:</td>
<td><%=bog.getForfatter()%></td>
</tr>
<tr>
<td>Titel:</td>
<td><%=bog.getTitel()%></td>
</tr>
<tr>
<td>Genre:</td>
<td><%=bog.getGenre()%></td>
</tr>
<tr>
<td>Forlag:</td>
<td><%=bog.getForlag()%></td>
</tr>
<tr>
<td>Beskrivelse:</td>
<td><%=bog.getBeskrivelse()%></td>
</tr>
<tr>
<td>ISBN</td>
<td><%=bog.getIsbn()%></td>
</tr>
</table>
<br/>
Valgt Bog
<br/>
<br/>
<form name="shoppingForm" action="ShoppingServlet" method="POST">
<select name=book>
<option><%=bog.getIsbn()%></option>
</select>
<br/>
<br/>
Valgt Antal
<br/>
<input type="text" name="antal" SIZE="3" value=1>
<input type="hidden" name="action" value="ADD">
<input type="submit" name="Submit" value="Tilføj">
</form>
<%
}
}
%>
<%if(searchnone.equals("none")) {
%>
Den valgte søgekreterier er ikke mulig!
<%
}
%>
<jsp:include page="/jsp/shopping/Cart.jsp" flush="true" />
</body>
</html>
Der ud over har jeg cart.jsp
<%@ page session="true" import="java.util.*, test.Book" %>
<%
Vector buylist = (Vector) session.getValue("test.shoppingcart");
if (buylist != null && (buylist.size() > 0)) {
%>
<center>
<table border="0" cellpadding="0" width="100%" bgcolor="#FFFFFF">
<tr>
<td><b>Tittel</b></td>
<td><b>Forfatter</b></td>
<td><b>Isbn</b></td>
<td><b>Pris</b></td>
<td><b>Antal</b></td>
<td></td>
</tr>
<%
for (int index=0; index < buylist.size();index++) {
Book anOrder = (Book) buylist.elementAt(index);
%>
<tr>
<td><b><%= anOrder.getForfatter %></b></td>
<td><b><%= anOrder.getTitel() %></b></td>
<td><b><%= anOrder.getIsbn() %></b></td>
<td><b><%= anOrder.getPris() %></b></td>
<td><b><%= anOrder.getAntal() %></b></td>
<td>
<form name="deleteForm" action="ShoppingServlet" method="POST">
<input type="submit" value="Delete">
<input type="hidden" name= "delindex" value='<%= index %>'>
<input type="hidden" name="action" value="Slet">
</form>
</td>
</tr>
<% } %>
</table>
<p>
<form name="checkoutForm" action="ShoppingServlet" method="POST">
<input type="hidden" name="action" value="CHECKOUT">
<input type="submit" name="Checkout" value="Til kassen">
</form>
</center>
<% } %>
Samt CheckOut.jsp
<%@ page session="true" import="java.util.*, shopping.Book" %>
<html>
<head>
<title></title>
</head>
<body bgcolor="#33CCFF">
<center>
<table border="0" cellpadding="0" width="100%" bgcolor="#FFFFFF">
<tr>
<td><b>Forfatter</b></td>
<td><b>Titel</b></td>
<td><b>Isbn</b></td>
<td><b>Pris</b></td>
<td><b>Antal</b></td>
<td></td>
</tr>
<%
Vector buylist = (Vector) session.getValue("shopping.shoppingcart");
String amount = (String) request.getAttribute("amount");
for (int i=0; i < buylist.size();i++) {
Book anOrder = (Book) buylist.elementAt(i);
%>
<tr>
<td><b><%= anOrder.getForfatter() %></b></td>
<td><b><%= anOrder.getTitel() %></b></td>
<td><b><%= anOrder.getIsbn() %></b></td>
<td><b><%= anOrder.getPris() %></b></td>
<td><b><%= anOrder.getAntal() %></b></td>
</tr>
<%
}
session.invalidate();
%>
<tr>
<td> </td>
<td> </td>
<td><b>TOTAL</b></td>
<td><b>$<%= amount %></b></td>
<td> </td>
</tr>
</table>
<p>
<a href="/jsp/shopping/showBookSpec.jsp">Køb mere</a>
</center>
</body>
</html>
Hvis der ønskes mere kode for hvordan showBookSpec får en bog kan dette mailes
