SQL数据库更新方法在JavaEE Web应用程序中不起作用

时间:2015-05-09 18:45:03

标签: java sql servlets

我的UpdateProducts方法从我的Web应用程序更新我的SQL表中的产品不起作用,我找不到原因。我真的很困惑,因为我已经复制了以前的工作示例中的代码并且刚刚更改了它连接的数据库(我已经更改了Servlet(ProductAdminController)和Model(ProductDB)中的必要代码而我无法获得这个UpdateMethod工作。数据库不包含任何会妨碍这个方法的外键,我的displayProducts / displayProduct和deleteProduct方法也可以工作。这只是我的UpdateProduct方法无法工作。每当我点击更新按钮时它会给我这个错误:

"type Exception report

 message

 description The server encountered an internal error that prevented it from fulfilling this request.

 exception

 java.lang.NullPointerException
 sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1017)
 java.lang.Double.parseDouble(Double.java:540)
 music.admin.ProductAdminController.updateProduct(ProductAdminController.java:111)
 music.admin.ProductAdminController.doPost(ProductAdminController.java:64)
 javax.servlet.http.HttpServlet.service(HttpServlet.java:644)
 javax.servlet.http.HttpServlet.service(HttpServlet.java:725)
 org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
 org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393)
 note The full stack trace of the root cause is available in the Apache Tomcat/8.0.3 logs"

我找了明显的错误,找不到任何错误。

ProductAdminController

import java.io.*;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.*;
import javax.servlet.ServletException;
import javax.servlet.http.*;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import music.business.Product;
import music.data.ProductDB;

public class ProductAdminController extends HttpServlet {


   @Override
   public void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {



    // get current action
    String action = request.getParameter("action");
    if (action == null) {
        action = "displayProducts";  // default action
    }

    String requestURI = request.getRequestURI();
    String url = "/index.jsp";
    if (action.equals("displayProducts")) {
        url = displayProducts(request, response);
    } else if (action.equals("displayProduct")) {
        url = displayProduct(request, response);
    } else if (action.equals("addProduct")) {
        url = "/product.jsp";
    } else if (action.equals("deleteProduct")) {
        url = deleteProduct(request, response);
    }
    getServletContext()
            .getRequestDispatcher(url)
            .forward(request, response);
    }

    @Override
    public void doPost(HttpServletRequest request, HttpServletResponse  response)
        throws ServletException, IOException {

    // get current action
    String action = request.getParameter("action");
    if (action == null) {
        action = "displayProducts";  // default action
    }
    String requestURI = request.getRequestURI();
    // perform action and set URL to appropriate page
    String url = "/index.jsp";
    if (action.equals("updateProduct")) {
        url = updateProduct(request, response);
    } else if (action.equals("deleteProduct")) {
        url = deleteProduct(request, response);
    }
    getServletContext()
            .getRequestDispatcher(url)
            .forward(request, response);
    }

    private String displayProducts(HttpServletRequest request,
        HttpServletResponse response) {

    List<Product> products = ProductDB.selectProducts();
    request.setAttribute("products", products);
    return "/products.jsp";
    }

    private String displayProduct(HttpServletRequest request,
        HttpServletResponse response) {

    String productCode = request.getParameter("productCode");
    Product product;
    if (productCode == null || productCode.isEmpty()) {
        product = new Product();
    } else {
        product = ProductDB.selectProduct(productCode);
    }

    request.setAttribute("product", product);
    return "/product.jsp";
    }

    private String addProduct(HttpServletRequest request,
        HttpServletResponse response) {

    return "/product.jsp";
}

private String updateProduct(HttpServletRequest request,
        HttpServletResponse response) {

    String Code = (String) request.getParameter("Code");
    String description = (String) request.getParameter("Description");
    String priceString = (String) request.getParameter("Cost");

    double price;
    try {
        price = Double.parseDouble(priceString);
        System.out.print(price);
    } catch (NumberFormatException e) {

        price = 0;
    }

    Product product = (Product) request.getAttribute("product");
    if (product == null) {
        product = new Product();
    }
    product.setCode(Code);
    product.setDescription(description);
    product.setPrice(price);
    request.setAttribute("product", product);

    String message = "";
    if (product.getPrice() <= 0) {
        message = "You must enter a positive number for the price without "
                + "any currency symbols.";
    }
    if (product.getDescription().length() == 0) {
        message = "You must enter a description for the product.";
    }
    if (product.getCode().length() == 0) {
        message = "You must enter a code for the product.";
    }
    request.setAttribute("message", message);

    String url;
    if (message.isEmpty()) {
        if (ProductDB.selectProduct(product.getCode()) != null) {
            ProductDB.updateProduct(product);
        } else {
            ProductDB.insert(product);
        }
        url = displayProducts(request, response);
    } else {
        url = "/product.jsp";
    }
    return url;
}

private String deleteProduct(HttpServletRequest request,
        HttpServletResponse response) {

    String productCode = request.getParameter("productCode");
    Product product = ProductDB.selectProduct(productCode);
    request.setAttribute("product", product);

    String url;
    String yesButton = request.getParameter("yesButton");
    if (yesButton != null) {
        ProductDB.delete(product);
        url = displayProducts(request, response);
    } else {
        url = "/confirm_product_delete.jsp";
    }
    return url;
}    
}

ProductDB类

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import music.business.Product;

/**
*
* @author J

public class ProductDB {
public static int insert(Product product) {
    ConnectionPool pool = ConnectionPool.getInstance();
    Connection connection = pool.getConnection();
    PreparedStatement ps = null;

    String query
            = "INSERT INTO Products (Code, Description, Cost) "
            + "VALUES (?, ?, ?)";
    try {
        ps = connection.prepareStatement(query);
        ps.setString(1, product.getCode());
        ps.setString(2, product.getDescription());
        ps.setDouble(3, product.getPrice());
        return ps.executeUpdate();
    } catch (SQLException e) {
        System.out.println(e);
        return 0;
    } finally {
        DBUtil.closePreparedStatement(ps);
        pool.freeConnection(connection);
    }
}

public static int updateProduct(Product product) {
    ConnectionPool pool = ConnectionPool.getInstance();
    Connection connection = pool.getConnection();
    PreparedStatement ps = null;

    String query = "UPDATE Products SET "
            + "Description = ?, "
            + "Cost = ? "
            + "WHERE Code = ?";
    try {
        ps = connection.prepareStatement(query);
        ps.setString(1, product.getCode());
        ps.setString(2, product.getDescription());
        ps.setDouble(3, product.getPrice());

        return ps.executeUpdate();
    } catch (SQLException e) {
        System.out.println(e);
        return 0;
    } finally {
        DBUtil.closePreparedStatement(ps);
        pool.freeConnection(connection);
    }
}

public static int delete(Product product) {
    ConnectionPool pool = ConnectionPool.getInstance();
    Connection connection = pool.getConnection();
    PreparedStatement ps = null;

    String query = "DELETE FROM Products "
            + "WHERE Code = ?";
    try {
        ps = connection.prepareStatement(query);
        ps.setString(1, product.getCode());

        return ps.executeUpdate();
    } catch (SQLException e) {
        System.out.println(e);
        return 0;
    } finally {
        DBUtil.closePreparedStatement(ps);
        pool.freeConnection(connection);
    }
}

public static boolean emailExists(String code) {
    ConnectionPool pool = ConnectionPool.getInstance();
    Connection connection = pool.getConnection();
    PreparedStatement ps = null;
    ResultSet rs = null;

    String query = "SELECT Code FROM Products "
            + "WHERE Code = ?";
    try {
        ps = connection.prepareStatement(query);
        ps.setString(1, code);
        rs = ps.executeQuery();
        return rs.next();
    } catch (SQLException e) {
        System.out.println(e);
        return false;
    } finally {
        DBUtil.closeResultSet(rs);
        DBUtil.closePreparedStatement(ps);
        pool.freeConnection(connection);
    }
}

   public static Product selectProduct(String productCode) {
    ConnectionPool pool = ConnectionPool.getInstance();
    Connection connection = pool.getConnection();
    PreparedStatement ps = null;
    ResultSet rs = null;

    String query = "SELECT * FROM Products "
            + "WHERE Code = ?";
    try {
        ps = connection.prepareStatement(query);
        ps.setString(1, productCode);
        rs = ps.executeQuery();
        if (rs.next()) {
            Product p = new Product();
            p.setCode(rs.getString("Code"));
            p.setDescription(rs.getString("Description"));
            p.setPrice(rs.getDouble("Cost"));
            return p;
        } else {
            return null;
        }
    } catch (SQLException e) {
        System.err.println(e);
        return null;
    } finally {
        DBUtil.closeResultSet(rs);
        DBUtil.closePreparedStatement(ps);
        pool.freeConnection(connection);
    }
}
       //This method returns null if a product isn't found.
public static Product selectProduct(long productID) {
    ConnectionPool pool = ConnectionPool.getInstance();
    Connection connection = pool.getConnection();
    PreparedStatement ps = null;
    ResultSet rs = null;

    String query = "SELECT * FROM Products "
            + "WHERE Code = ?";
    try {
        ps = connection.prepareStatement(query);
        ps.setLong(1, productID);
        rs = ps.executeQuery();
        if (rs.next()) {
            Product p = new Product();
            p.setCode(rs.getString("Code"));
            p.setDescription(rs.getString("Description"));
            p.setPrice(rs.getDouble("Cost"));
            return p;
        } else {
            return null;
        }
    } catch (SQLException e) {
        System.err.println(e);
        return null;
    } finally {
        DBUtil.closeResultSet(rs);
        DBUtil.closePreparedStatement(ps);
        pool.freeConnection(connection);
    }
}

//This method returns null if a product isn't found.
public static List<Product> selectProducts() {
    ConnectionPool pool = ConnectionPool.getInstance();
    Connection connection = pool.getConnection();
    PreparedStatement ps = null;
    ResultSet rs = null;

    String query = "SELECT * FROM Products";
    try {
        ps = connection.prepareStatement(query);
        rs = ps.executeQuery();
        ArrayList<Product> products = new ArrayList<>();
        while (rs.next()) {
            Product p = new Product();
            p.setCode(rs.getString("Code"));
            p.setDescription(rs.getString("Description"));
            p.setPrice(rs.getDouble("Cost"));
            products.add(p);
        }
        return products;
    } catch (SQLException e) {
        System.err.println(e);
        return null;
    } finally {
        DBUtil.closeResultSet(rs);
        DBUtil.closePreparedStatement(ps);
        pool.freeConnection(connection);
    }
}

}

非常感谢任何帮助!

JSP产品代码

<%@page contentType="text/html" pageEncoding="utf-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="jr" uri="/WEB-INF/murach.tld" %>

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>Product Maintenance</title>
    <link rel="stylesheet" href="<c:url value='/styles/main.css'/> ">
</head>
<body>
    <h1>Product</h1>
   <p><jr:ifEmptyMark color="blue" field=""/> marks required fields</p>

    <p><i>${message}</i></p>

    <form action="<c:url value='/productMaint'/>" 
          method="post" class="inline">
        <input type="hidden" name="action" value="updateProduct">

        <label class="pad_top">Code:</label>
        <input type="text" name="productCode" id="codeBox" value="${product.code}">
        <jr:ifEmptyMark color="blue" field="${product.code}"/><br>


        <label class="pad_top">Description:</label>
        <input type="text" name="description" 
               value="${product.description}">
        <jr:ifEmptyMark color="blue" field="${product.description}"/><br>

        <label class="pad_top">Price:</label>
        <input type="text" name="price" id="priceBox"
               value="${product.priceNumberFormat}">
        <jr:ifEmptyMark color="blue" field="${product.priceNumberFormat}"/><br>

        <label class="pad_top">&nbsp;</label>
        <input type="submit" value="Update Product" class="margin_left">
     </form>

     <form action="<c:url value='/productMaint'/>" 
          method="get" class="inline">
        <input type="hidden" name="action" value="displayProducts">
        <input type="submit" value="View Products">
     </form>

     </body>
     </html>

终于找到了我的问题!!无法相信它是如何在我的脸上,我早先没有赶上!

    String Code = (String) request.getParameter("Code");
    String description = (String) request.getParameter("Description");
    String priceString = (String) request.getParameter("Cost");

    product.setCode(Code);
    product.setDescription(description);
    product.setPrice(price);
    request.setAttribute("product", product);

应该是:

    String productCode = (String) request.getParameter("productCode");
    String description = (String) request.getParameter("description");
    String priceString = (String) request.getParameter("price");

    product.setCode(productCode);
    product.setDescription(description);
    product.setPrice(price);
    request.setAttribute("product", product);

2 个答案:

答案 0 :(得分:0)

alphaValue

我认为应该是

String query = "UPDATE Products SET "
        + "Description = ?, "
        + "Cost = ? "
        + "WHERE Code = ?";
try {
    ps = connection.prepareStatement(query);
    ps.setString(1, product.getCode());
    ps.setString(2, product.getDescription());
    ps.setDouble(3, product.getPrice());

我在更新查询中看到错误的参数

答案 1 :(得分:0)

您在updateProduct方法[ProductAdminController.java]中获得的Cost值存在问题。

看来您没有获得成本参数的任何值,&#34; price = Double.parseDouble(priceString)&#34;导致NullPointerException异常。

尝试打印值:     String priceString =(String)request.getParameter(&#34; Cost&#34;);