【问题标题】:Unable to get data from db to print on browser using servlet无法使用 servlet 从 db 获取数据以在浏览器上打印
【发布时间】:2016-02-16 20:08:50
【问题描述】:

这是我编写的代码,用于使用 servlet 显示从 db 到浏览器的查询结果,

import java.io.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.sql.*;

public class DatabaseAccess extends HttpServlet{

  public void doGet(HttpServletRequest request,
                    HttpServletResponse response)
            throws ServletException, IOException
  {
      // JDBC driver name and database URL
     // static final String JDBC_DRIVER="com.mysql.jdbc.Driver";  
      final String DB_URL="jdbc:postgresql://localhost:5432/postgres";

      //  Database credentials
      final String USER = "postgres";
      final String PASS = "postgres";

      // Set response content type
      response.setContentType("text/html");
      PrintWriter out = response.getWriter();
      String title = "Database Result";
      String docType =
        "<!doctype html public \"-//w3c//dtd html 4.0 " +
         "transitional//en\">\n";
         out.println(docType +
         "<html>\n" +
         "<head><title>" + title + "</title></head>\n" +
         "<body bgcolor=\"#f0f0f0\">\n" +
         "<h1 align=\"center\">" + title + "</h1>\n");
      try{
         // Register JDBC driver
         Class.forName("org.postgresql.Driver");

         // Open a connection
         Connection conn = DriverManager.getConnection(DB_URL, USER, PASS);

         // Execute SQL query
        Statement stmt = conn.createStatement();
         String sql;
         sql = "SELECT docid,term,term_frequency,tf FROM fea2";
         ResultSet rs = stmt.executeQuery(sql);
         out.println("<h4>connected to db</h4>");

         // Extract data from result set
         while(rs.next()){
            //Retrieve by column name
            int docid  = rs.getInt("docid");
            int term_frequency = rs.getInt("term_frequency");
            String term = rs.getString("term");
            float tf = rs.getFloat("tf");

            //Display values
            out.println("ID: " + docid + "<br>");
            out.println(", Age: " + term_frequency + "<br>");
            out.println(", First: " + term + "<br>");
            out.println(", Last: " + tf + "<br>");
         }
         out.println("</body></html>");
         out.println("got data from db");
         // Clean-up environment
         rs.close();
         stmt.close();
         conn.close();
      }catch(SQLException se){
         //Handle errors for JDBC
         se.printStackTrace();
      }catch(Exception e){
         //Handle errors for Class.forName
         e.printStackTrace();
      }
   }
} 

此代码仅在浏览器上打印为“数据库结果”,而不是 fea1 表中的内容。该表存在并填充了数据。

web.xml:

<servlet>
    <servlet-name>DatabaseAccess</servlet-name>
    <servlet-class>DatabaseAccess</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>DatabaseAccess</servlet-name>
    <url-pattern>/DatabaseAccess</url-pattern>
</servlet-mapping> 

我不知道还有什么问题。我希望在浏览器上打印我的查询结果。请帮忙。关于我做错了什么有什么建议吗?

【问题讨论】:

  • 您面临的问题是什么?预期的行为是什么?你得到了什么?
  • 代码在 servlet 中能走多远?尝试添加打印语句以缩小您获得的范围。你得到什么堆栈跟踪?您正在将堆栈跟踪打印到 System.out,那么您知道如何找到它吗?如果您不确定,e.printStackTrace(out) 将堆栈打印到 servlet 响应。

标签: postgresql servlets jdbc


【解决方案1】:

没有足够的信息来编写可以解决您当前编写的问题的答案。

以下是我的建议:

  • 添加更多打印语句以帮助您缩小代码行不工作的范围
  • 不要使用e.printStackTrace()(打印到System.out)打印堆栈跟踪,而是使用e.printStackTrace(out)将堆栈跟踪直接打印到您的servlet输出

找出您在 servlet 中的进展情况是解决问题的关键。

可能是以下问题之一:

  • Class.forName() 失败,因为 postgresql 驱动程序不在您的类路径中(或对 Servlet 的类加载器不可见)
  • DriverManager.getConnection() 可能会因为 URL 不正确或用户名/密码无效而失败
  • stmt.executeQuery(sql) 可能会失败,因为您的 SQL 语法不正确或对于您连接到的数据库架构无效。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-22
    • 2018-03-10
    • 1970-01-01
    • 2017-08-12
    • 2018-04-01
    • 1970-01-01
    • 2022-10-17
    相关资源
    最近更新 更多