2015-11-02 5 views
-2

В настоящее время я работаю над веб-приложением, и он не работает. Ниже приведен код, который у меня есть для сервлета и класса Java. Я проверил код, который обеспечивает подключение к базе данных, и я знаю, что это правильно. Я считаю, что что-то не так с сервлетом или классом Java.JSP Servlet Web Application

Здесь ошибка я получаю:

HTTP Status 500 - 

type Exception report 

message 

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

exception 

java.lang.NullPointerException 
    music.data.ConnectionPool.freeConnection(ConnectionPool.java:41) 
    music.data.ProductDB.selectProducts(ProductDB.java:159) 
    music.admin.ProductAdminController.displayProducts(ProductAdminController.java:74) 
    music.admin.ProductAdminController.doGet(ProductAdminController.java:36) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:618) 
    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) 

Это Java Servlet:

package music.admin; 

import java.io.IOException; 
import java.util.ArrayList; 
import javax.servlet.ServletException; 
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 { 

    /* Comment this method out when using this class with a database 
    * instead of a text file. 
    */ 
    //@Override 
    //public void init() { 
     //ProductIO.init(getServletContext() 
       // .getRealPath("/WEB-INF/products.txt")); 
    //} 

    @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 
     } 

     // perform action and set URL to appropriate page 
     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 
     } 

     // 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) { 

     ArrayList<Product> products = (ArrayList) 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 productCode = (String) request.getParameter("productCode"); 
     String description = (String) request.getParameter("description"); 
     String priceString = (String) request.getParameter("price"); 

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

     Product product = (Product) request.getAttribute("product"); 
     if (product == null) { 
      product = new Product(); 
     } 
     product.setCode(productCode); 
     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.exists(product.getCode())) { 
       ProductDB.updateProduct(product); 
      } else { 
       ProductDB.insertProducts(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.removeProduct(product); 
      url = displayProducts(request, response); 
     } else { 
      url = "/confirm_product_delete.jsp"; 
     } 
     return url; 
    }  
} 

Вот Java Класс:

package music.data; 

import java.sql.*; 
import java.util.*; 

import music.business.Product; 

public class ProductDB 
{ 
    //This method returns null if a product isn't found. 
    public static Product selectProduct(String productCode) 
    { 
     ConnectionPool pool = ConnectionPool.getInstance(); 
     Connection connection = pool.getConnection(); 
     PreparedStatement ps = null; 
     ResultSet rs = null; 

     String query = "SELECT * FROM Product " + 
       "WHERE ProductCode = ?"; 
     try 
     { 
      ps = connection.prepareStatement(query); 
      ps.setString(1, productCode); 
      rs = ps.executeQuery(); 
      if (rs.next()) 
      { 
       Product p = new Product(); 

       p.setCode(rs.getString("ProductCode")); 
       p.setDescription(rs.getString("ProductDescription")); 
       p.setPrice(rs.getDouble("ProductPrice")); 
       return p; 
      } 
      else 
      { 
       return null; 
      } 
     } 
     catch(SQLException e) 
     { 
      System.out.println(e); 
      return null; 
     } 
     finally 
     { 
      DBUtil.closeResultSet(rs); 
      DBUtil.closePreparedStatement(ps); 
      pool.freeConnection(connection); 
     } 
    } 

    //This method will return 0 if productID isn't found. 
    public static int selectProductID(Product product) 
    { 
     ConnectionPool pool = ConnectionPool.getInstance(); 
     Connection connection = pool.getConnection(); 
     PreparedStatement ps = null; 
     ResultSet rs = null; 

     String query = "SELECT ProductID FROM Product " + 
       "WHERE ProductCode = ?"; 
     try 
     { 
      ps = connection.prepareStatement(query); 
      ps.setString(1, product.getCode()); 
      rs = ps.executeQuery(); 
      rs.next(); 
      int productID = rs.getInt("ProductID"); 
      return productID; 
     } 
     catch(SQLException e) 
     { 
      System.out.println(e); 
      return 0; 
     } 
     finally 
     { 
      DBUtil.closeResultSet(rs); 
      DBUtil.closePreparedStatement(ps); 
      pool.freeConnection(connection); 
     } 
    } 

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

     String query = "SELECT * FROM Product " + 
       "WHERE ProductID = ?"; 
     try 
     { 
      ps = connection.prepareStatement(query); 
      ps.setInt(1, productID); 
      rs = ps.executeQuery(); 
      if (rs.next()) 
      { 
       Product p = new Product(); 
       p.setCode(rs.getString("ProductCode")); 
       p.setDescription(rs.getString("ProductDescription")); 
       p.setPrice(rs.getDouble("ProductPrice")); 
       return p; 
      } 
      else 
      { 
       return null; 
      } 
     } 
     catch(SQLException e) 
     { 

      System.out.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 ArrayList<Product> selectProducts() 
    { 
     ConnectionPool pool = ConnectionPool.getInstance(); 
     Connection connection = pool.getConnection(); 
     PreparedStatement ps = null; 
     ResultSet rs = null; 

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



public static void insertProducts(Product product) 
    { 
     ConnectionPool pool = ConnectionPool.getInstance(); 
     Connection connection = pool.getConnection(); 
     PreparedStatement ps = null; 
     ResultSet rs = null; 

     String query = "INSERT INTO product (ProductCode, ProductDescription, ProductPrice)" 
       + "VALUES" 
       + "('"+product.getCode()+"','"+product.getDescription()+"','"+product.getPriceNumberFormat()+"');"; 
     try 
     { 
      ps = connection.prepareStatement(query); 
      ps.execute(query); 


     } 
     catch(SQLException e) 
     { 
      System.out.println(e); 

     } 
     finally 
     { 
      DBUtil.closeResultSet(rs); 
      DBUtil.closePreparedStatement(ps); 
      pool.freeConnection(connection); 
     } 
    } 

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



     String query = "UPDATE product SET productDescription ='"+product.getDescription()+"',"+"ProductPrice='"+product.getPriceNumberFormat()+"' WHERE ProductCode='"+product.getCode()+"';"; 

     try 
     { 
      ps = connection.prepareStatement(query); 
      ps.execute(query); 
      //rs = ps.executeQuery(); 


     } 
     catch(SQLException e) 
     { 
      System.out.println(e); 

     } 
     finally 
     { 
      DBUtil.closeResultSet(rs); 
      DBUtil.closePreparedStatement(ps); 
      pool.freeConnection(connection); 
     } 
    } 


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

     String query = "SELECT productCode FROM Product " + 
       "WHERE ProductCode = ?"; 
     try { 
      ps = connection.prepareStatement(query); 
      ps.setString(1, productCode); 
      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 void removeProduct(Product product) 
    { 
     ConnectionPool pool = ConnectionPool.getInstance(); 
     Connection connection = pool.getConnection(); 
     PreparedStatement ps = null; 
     ResultSet rs = null; 

     String query = "DELETE FROM product WHERE ProductCode='"+product.getCode()+"';"; 
     try 
     { 
      ps = connection.prepareStatement(query); 
      ps.execute(query); 


     } 
     catch(SQLException e) 
     { 
      System.out.println(e); 

     } 
     finally 
     { 
      DBUtil.closeResultSet(rs); 
      DBUtil.closePreparedStatement(ps); 
      pool.freeConnection(connection); 
     } 
    } 

} 

Вот код Пул подключений:

package music.data; 


import java.sql.*; 
import javax.sql.DataSource; 
import javax.naming.InitialContext; 
import javax.naming.NamingException; 

public class ConnectionPool { 

    private static ConnectionPool pool = null; 
    private static DataSource dataSource = null; 

    private ConnectionPool() { 
     try { 
      InitialContext ic = new InitialContext(); 
      dataSource = (DataSource) ic.lookup("java:/comp/env/jdbc/music"); 
     } catch (NamingException e) { 
      System.out.println(e); 
     } 
    } 

    public static synchronized ConnectionPool getInstance() { 
     if (pool == null) { 
      pool = new ConnectionPool(); 
     } 
     return pool; 
    } 

    public Connection getConnection() { 
     try { 
      return dataSource.getConnection(); 
     } catch (SQLException e) { 
      System.out.println(e); 
      return null; 
     } 
    } 

    public void freeConnection(Connection c) { 
     try { 
      c.close(); 
     } catch (SQLException e) { 
      System.out.println(e); 
     } 
    } 
} 

DBUtil Класс

package music.data; 

import java.sql.*; 

public class DBUtil 
{ 
    public static void closeStatement(Statement s) 
    { 
     try 
     { 
      if (s != null) 
       s.close(); 
     } 
     catch(SQLException e) 
     { 
      e.printStackTrace(); 
     } 
    } 

    public static void closePreparedStatement(Statement ps) 
    { 
     try 
     { 
      if (ps != null) 
       ps.close(); 
     } 
     catch(SQLException e) 
     { 
      e.printStackTrace(); 
     } 
    } 

    public static void closeResultSet(ResultSet rs) 
    { 
     try 
     { 
      if (rs != null) 
       rs.close(); 
     } 
     catch(SQLException e) 
     { 
      e.printStackTrace(); 
     } 
    } 
} 
+1

проверить подключение к базе данных? – soorapadman

+0

Что это за класс ConnectionPool? это какая-то библиотека? –

+0

Я проверил соединение с базой данных и класс ConnectionPool. Они оба работают. – milliehol

ответ

0

Из Вашего вопроса и при условии кода, я думаю, есть несколько моментов, которые можно было бы вернуться, чтобы увидеть, если мы имеем любой вопрос там.

  1. Вы использовали Class DBUtil для закрытия объекта результатов и оператора.

    • DBUtil не является стандартным классом. Вероятно, использование DBUtils из apache было бы лучшей альтернативой. Учитывая, что DBUtil, похоже, не имеет стандартной реализации, обеспечить реализацию DBUtil вместе с другими классами.

    • Кроме того, симметрия теряется при использовании DButil для закрытия набора результатов и оператора, но некоторые другие средства для закрытия соединения. Я бы предложил использовать DBUtils.close() или closequietly() для закрытия соединения.

  2. Кроме того, в вашей реализации первоначальный размер пула подключений кажется неясным. Явным образом устанавливая пул на большее число с помощью ds.setInitialPoolSize().

    • Кроме того, если вы хотите, установите максимальный размер и предпочтительный пакет.

Делать это следует в основном решить проблему, или дать ясность относительно этого вопроса.

+0

Sendhilkumar, я включил пример класса DBUtil. Похоже, что он не будет работать для закрытия пула соединений. Где я должен поместить код ds.setInitialPoolSize()? Должен ли я разместить это заявление в начале класса Connection Pool? Спасибо за вашу помощь. – milliehol

+0

Я бы повторил использование класса DBUtils, поскольку он обеспечивает больше функциональности, чем ваша реализация DBUtil, а также является стандартом. –

+0

Для установки начального размера пула обратитесь к разделу «Настройка свойств пула соединений» [здесь] (http://docs.oracle.com/cd/B28359_01/java.111/e10788/optimize.htm) –

0

Теперь, когда вы разместили код, проблема очень ясна: вы получаете исключение NullPointerException, потому что пытаетесь вызвать close() по нулевому соединению.

Почему соединение null?

Поскольку метод GetConnection() возвращает нуль:

try { 
     return dataSource.getConnection(); 
    } catch (SQLException e) { 
     System.out.println(e); 
     return null; 
    } 

В приведенном выше коде, вы пытаетесь получить соединение из DataSource, и если DataSource сигналы, которые вы не можете получить, бросая исключение, вы в основном игнорируете исключение и вместо этого возвращаете null.

Результат: вместо того, чтобы получить ясное SQLException, объясняющее, почему вы не можете получить соединение с DataSource, позднее вы получите непонятное NullPointerException, в несвязанный метод, который ничего не говорит о реальной проблеме.

Не делайте этого. Если вы действительно не хотите иметь дело с проверенным SQLException при вызове getConnection(), тогда оберните SQLException в исключение времени выполнения. После этого у вас будет четкое сообщение и индикация отслеживания стека, что и где проблема на самом деле:

try { 
     return dataSource.getConnection(); 
    } catch (SQLException e) { 
     throw new RuntimeSQLException(e); 
    } 

public class RuntimeSQLException extends RuntimeException { 
    public RuntimeSQLException(Throwable cause) { 
     super(cause); 
    } 
} 
+0

Это решило мою проблема! Благодарю. Мне не хватало библиотеки в моей программе. – milliehol