2014-11-08 166 views
0

我无法在数据库中创建表格。代码似乎没有任何错误,但不输出任何内容。我试着调试它,似乎问题是连接或声明对象,我认为...创建表格并写入Servlet

如果有人可以帮助,这将是有益的,谢谢。

import java.io.IOException; 
import java.io.PrintWriter; 
import javax.servlet.ServletException; 
import javax.servlet.annotation.WebServlet; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
import java.sql.*; 
import java.util.logging.Level; 
import java.util.logging.Logger; 
import sun.jdbc.odbc.JdbcOdbcDriver; 

/** 
* @author 
*/ 
@WebServlet(urlPatterns = {"/FoodServlet"}) 
public class FoodServlet extends HttpServlet { 

    private Connection con; 
    private Statement stmt; 
    private ResultSet rs; 
    private PreparedStatement pstmt; 

    //Servlet initialization method creates con/stmt objects and loads jdbc drivers 
    @Override 
    public void init() throws ServletException { 
     try { 
      new JdbcOdbcDriver(); 
      String url = "jdbc:odbc:Food"; 
      String user = ""; 
      String password = ""; 
      con = DriverManager.getConnection(url, user, password); 
      stmt = con.createStatement(); 

     } catch (SQLException e) { 
      e.printStackTrace(); 
      System.exit(1); 
     } 
    } 

    /** 
    * Processes requests for both HTTP <code>GET</code> and <code>POST</code> 
    * methods. 
    * 
    * @param request servlet request 
    * @param response servlet response 
    * @throws ServletException if a servlet-specific error occurs 
    * @throws IOException if an I/O error occurs 
    * @throws java.sql.SQLException 
    */ 
    protected void processRequest(HttpServletRequest request, HttpServletResponse response) 
      throws ServletException, IOException, SQLException { 
     response.setContentType("text/html;charset=UTF-8"); 
     try (PrintWriter out = response.getWriter()) { 

      //delete the database 
      stmt.executeUpdate("DROP TABLE IF EXISTS Foods"); 

      //set up the database 
      stmt.executeUpdate("CREATE TABLE Foods (ItemID Integer PRIMARY KEY AUTOINCREMENT, ItemName VARCHAR(20), Likes Integer)"); 
      stmt.executeUpdate("INSERT INTO Foods VALUES ('Ice Cream', 0)"); 
      stmt.executeUpdate("INSERT INTO Foods VALUES ('Hamburger', 0)"); 
      stmt.executeUpdate("INSERT INTO Foods VALUES ('Pizza', 0)"); 

      //set likeValues for data storage 
      int likeValue; 

      //set strings for queries and update statements 
      String query = "SELECT Likes FROM Foods WHERE ItemName = ?"; 
      String update = "UPDATE Foods SET Likes = ? WHERE ItemName = ?"; 

      //set food to request parameter from html 
      String food = request.getParameter("food"); 

      //get current likes and increase by one, store in 'likeValue' 
      pstmt = con.prepareStatement(query); 
      pstmt.setString(1, food); 
      rs = pstmt.executeQuery(); 
      likeValue = rs.getInt(1) + 1; 

      //write updated 'likeValue' to the database 
      pstmt = con.prepareStatement(update); 
      pstmt.setInt(1, likeValue); 
      pstmt.setString(2, food); 
      pstmt.executeUpdate(); 

      //output the data from the database 
      rs = stmt.executeQuery("SELECT ItemID, ItemName, Likes FROM Foods"); 
      out.println("ItemID ItemName Likes"); 
      while (rs.next()) { 
       out.print(rs.getInt(1) + "\t\t" + rs.getString(2) + "\t\t" 
         + rs.getInt(3)); 
      } 

     } finally { 

     } 
    } 

    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code."> 
    /** 
    * Handles the HTTP <code>GET</code> method. 
    * 
    * @param request servlet request 
    * @param response servlet response 
    * @throws ServletException if a servlet-specific error occurs 
    * @throws IOException if an I/O error occurs 
    */ 
    @Override 
    protected void doGet(HttpServletRequest request, HttpServletResponse response) 
      throws ServletException, IOException { 
     try { 
      processRequest(request, response); 
     } catch (SQLException ex) { 
      Logger.getLogger(FoodServlet.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 

    /** 
    * Handles the HTTP <code>POST</code> method. 
    * 
    * @param request servlet request 
    * @param response servlet response 
    * @throws ServletException if a servlet-specific error occurs 
    * @throws IOException if an I/O error occurs 
    */ 
    @Override 
    protected void doPost(HttpServletRequest request, HttpServletResponse response) 
      throws ServletException, IOException { 
     try { 
      processRequest(request, response); 
     } catch (SQLException ex) { 
      Logger.getLogger(FoodServlet.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 

    /** 
    * Returns a short description of the servlet. 
    * 
    * @return a String containing servlet description 
    */ 
    @Override 
    public String getServletInfo() { 
     return "Short description"; 
    }// </editor-fold> 

} 
+0

为什么要在请求处理方法中设置db? – MGorgon 2014-11-08 03:04:15

+0

它是如何从我的教授那里学到的。另外,netbeans自动创建进程请求,以便使用GET或POST发送表单数据并不重要。 – GrizzlySol 2014-11-08 03:14:09

+0

这段代码不会编译 - try块必须有catch或finally子句 – MGorgon 2014-11-08 03:17:26

回答

1

因此,经过很多工作,我发现连接对象是第一个问题,我不知道我是如何解决这个问题的...然后我有一个空指针异常的问题,我通过将我的exceuteUpdate()到一个if语句中,该语句从html页面检查一个值。然后我有一个错误,涉及不正确的拼写与我的表值之一。

这是更新后的代码,现在可以工作,它不漂亮,但它的工作原理。谢谢大家的帮助!

import java.io.IOException; 
import java.io.PrintWriter; 
import java.sql.DriverManager; 
import java.sql.*; 
import java.util.logging.Level; 
import java.util.logging.Logger; 
import javax.servlet.ServletException; 
import javax.servlet.annotation.WebServlet; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
import sun.jdbc.odbc.*; 

/** 
* 
* @author 
*/ 
@WebServlet(urlPatterns = {"/FoodServlet"}) 
public class FoodServlet extends HttpServlet { 

    private Connection con; 
    private Statement stmt; 
    private ResultSet rs; 
    private PreparedStatement pstmt; 
    private DatabaseMetaData dbmd; 

    //Servlet initialization method creates con/stmt objects and loads jdbc drivers 
    public void init() throws ServletException { 
     try { 
      new JdbcOdbcDriver(); 
      String url = "jdbc:odbc:Java3DB"; 
      String user = ""; 
      String pword = ""; 
      con = DriverManager.getConnection(url, user, pword); 
      stmt = con.createStatement(); 
     } catch (SQLException e) { 
      e.printStackTrace(); 
      System.exit(1); 
     } 
    } 

    /** 
    * Processes requests for both HTTP <code>GET</code> and <code>POST</code> 
    * methods. 
    * 
    * @param request servlet request 
    * @param response servlet response 
    * @throws ServletException if a servlet-specific error occurs 
    * @throws IOException if an I/O error occurs 
    * @throws java.sql.SQLException 
    */ 
    protected void processRequest(HttpServletRequest request, HttpServletResponse response) 
      throws ServletException, IOException, SQLException { 
     response.setContentType("text/html;charset=UTF-8"); 
     PrintWriter out = response.getWriter(); 
     try { 
      //open html tags 
      out.println("<!DOCTYPE html>"); 
      out.println("<html>"); 
      out.println("<head>"); 
      out.println("<title>FoodServlet</title>"); 
      out.println("</head>"); 
      out.println("<body>"); 

      //set up the table 
      createTable(); 

      //set strings for queries and update statements 
      String update = "UPDATE Foods SET likes = (likes + 1) WHERE itemName = ?"; 

      //set foodValue to request parameter from html 
      String foodValue = null; 
      foodValue = request.getParameter("food"); 
      //update only if there is a value stored in the food parameter 
      if (foodValue != null) { 
       //out.println(foodValue); 
       pstmt = con.prepareStatement(update); 
       pstmt.setString(1, foodValue); 
       pstmt.executeUpdate(); 
      } 

      //output the data from the database 
      rs = stmt.executeQuery("SELECT itemID, itemName, likes FROM Foods"); 
      out.println("ItemID&nbsp&nbspItemName&nbsp&nbspLikes <BR>"); 

      while (rs.next()) { 
       out.print(+rs.getInt(1) + "&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp" 
         + rs.getString(2) + "&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp" 
         + rs.getInt(3) + "<br>"); 
      } 

      out.println("</body>"); 
      out.println("</html>"); 
     } catch (SQLException e) { 
      e.printStackTrace(); 
      out.print(e.getMessage()); 
     } 
    } 

    //destroy method to close the servlet 
    public void destroy() { 
     try { 
      stmt.close(); 
      con.close(); 
     } catch (SQLException ex) { 
      Logger.getLogger(FoodServlet.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 

    public void createTable() throws SQLException { 
     dbmd = con.getMetaData(); 
     rs = dbmd.getTypeInfo(); 
     //checks for the Foods table, create only if not table is found 
     if (rs.next() == false) { 
      //set up the database 
      stmt.executeUpdate("CREATE TABLE Foods (itemID INTEGER, itemName VARCHAR(20), likes Integer)"); 
      stmt.executeUpdate("INSERT INTO Foods VALUES (1, 'IceCream', 0)"); 
      stmt.executeUpdate("INSERT INTO Foods VALUES (2, 'Hamburger', 0)"); 
      stmt.executeUpdate("INSERT INTO Foods VALUES (3, 'Pizza', 0)"); 
     } 
    } 

// <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code."> 
    /** 
    * Handles the HTTP <code>GET</code> method. 
    * 
    * @param request servlet request 
    * @param response servlet response 
    * @throws ServletException if a servlet-specific error occurs 
    * @throws IOException if an I/O error occurs 
    */ 
    @Override 
    protected void doGet(HttpServletRequest request, HttpServletResponse response) 
      throws ServletException, IOException { 
     try { 
      processRequest(request, response); 
     } catch (SQLException ex) { 
      Logger.getLogger(FoodServlet.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 

    /** 
    * Handles the HTTP <code>POST</code> method. 
    * 
    * @param request servlet request 
    * @param response servlet response 
    * @throws ServletException if a servlet-specific error occurs 
    * @throws IOException if an I/O error occurs 
    */ 
    @Override 
    protected void doPost(HttpServletRequest request, HttpServletResponse response) 
      throws ServletException, IOException { 
     try { 
      processRequest(request, response); 
     } catch (SQLException ex) { 
      Logger.getLogger(FoodServlet.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 

    /** 
    * Returns a short description of the servlet. 
    * 
    * @return a String containing servlet description 
    */ 
    @Override 
    public String getServletInfo() { 
     return "Short description"; 
    }// </editor-fold> 

} 
0

我可以看到你在几个地方使用了相同的Statement(stmt),这不是一个好习惯。 对每个执行的查询使用一个语句,并在finally {}块内正确关闭它以避免连接/资源问题。

我还怀疑你的查询没有选择任何数据库。它只是使用“富”表,但它位于何处(数据库)?不应该是“databaseName.foo”..?

使用正确的try/catch/finally结构并关闭其中的所有使用语句,resultSets和连接。

按照上述步骤,让我们知道您的问题仍然存在或您得到的任何异常。

+0

我试过关闭所有的语句,但它有助于这种情况。我注意到,如果我使用这个程序在我用于其他程序的数据库中创建表,它也不起作用。我将我的代码与我以前的工作进行了比较,结果没有区别... – GrizzlySol 2014-11-10 01:42:22

+0

[Microsoft] [ODBC Microsoft Access Driver]查询值和目标字段的数目不相同。 我得到这个从堆栈跟踪打印。不知道这是否有帮助。 – GrizzlySol 2014-11-10 03:23:45

0

Oracle doc很明显提到,不要在servlet init()中调用System.exit方法。所以,请评论一下。

并且您正在指定表格名称在url jdbc:odbc:Foods中,而Foods是您的表名称。它应该是jdbc:odbc:DATABSE_NAME。所以init()抛出一个异常,因为它无法找到数据库食品,它去捕捉块,它遇到System.exit。它阻止了加载servlet。这就是为什么你无法看到任何错误。因为servlet甚至没有加载。由于init()不投掷ServletExceptionUnavailableException。那么肯定例外的是SQLException,它被catch块处理。

对不起。我一直保留这个错误,否则它会使你的评论无关紧要。

我目前的观察表明,您忘记了在 rs = pstmt.executeQuery();之后致电rs.next()。抛出异常,因为RESULTSET指针未正确放置。尝试拨打rs.next()

代码中的另一个错误做法是,您在try块后没有使用catch(){}。如果你使用它,你应该打印这个异常,它不应该是空白的。这就是你没有得到任何例外情况的原因。即使你的finally{}是空的。要么不要使用catch(){},要么在使用它时打印一些信息。

+0

注释掉system.exit没有帮助。数据库名称是Food,而表名是Foods,所以这不应该是错误的原因。此外,servlet会加载,但它会加载空白页面,因为代码不会从数据库中检索数据,因为没有表格。 – GrizzlySol 2014-11-10 01:09:48

+0

@GrizzlySol你现在可以检查我的答案。我想你错过了rs.next()。 – 2014-11-10 10:55:26

+0

我最近尝试过使用catch和finally语句,而我的结果没有任何变化。另外,我在while循环中使用rs.next()。 这似乎是更新数据库的问题,它应该在if语句中。我会尽快更新。 – GrizzlySol 2014-11-10 17:57:03