【问题标题】:JDBC in servletservlet 中的 JDBC
【发布时间】:2015-02-15 20:46:27
【问题描述】:

我有一个简单的表单来从user 获取数据并存储到数据库。

这是我的简单表格:

<!DOCTYPE html>
<html>
<head>
    <title> Database Insertion Form </title>
</head>
<body>

</body>
<h1>
    <center> Phonebook</center>
</h1>
<Form method=post action="DbServlet">

    <pre>
        Surname: <input type="text" name="Surname">
        Forename: <input type="text" name="Forenames">
        Phone number: <input type="text" name="PhoneNum">
    </pre>
    <br><br>
    <center><input type="submit" VALUE="Commit"></center>
</Form>
</html>

这是DbServletServlet:

@WebServlet("/DbServlet")
public class DbServlet extends HttpServlet {

    private PreparedStatement ps;
    private Connection connection;
    private String URL = "jdbc:mysql://localhost/lib";

    @Override
    public void init() throws ServletException {
        super.init();
        try {
            Class.forName("com.mysql.jdbc.Driver");
            connection = DriverManager.getConnection(URL, "root", "2323");
        } catch (SQLException e) {
            e.printStackTrace();
            System.exit(1);
        } catch (ClassNotFoundException cnfe) {
            cnfe.printStackTrace();
        }
    }

    public void doPost(HttpServletRequest request,HttpServletResponse response)
                                         throws IOException, ServletException {
        String surname, forenames, telNum;
        surname = request.getParameter("Surname");
        forenames = request.getParameter("Forenames");
        telNum = request.getParameter("PhoneNum");
        response.setContentType("text/HTML");
        PrintWriter out = response.getWriter();

        out.println("<HTML>");
        out.println("<HEAD>");
        out.println("<TITLE>Servlet + JDBC</TITLE>");
        out.println("</HEAD>");
        out.println("<BODY>");
        String query = "INSERT INTO PhoneNums"
                + " VALUES('" + surname + "','"
                + forenames + "','" + telNum + "')";

        try {
            ps = connection.prepareStatement(query);
            ps.executeUpdate();
            JOptionPane.showMessageDialog(null, "Done");
        } catch (SQLException sqle) {
            sqle.printStackTrace();
        }

        out.println("</BODY>");
        out.println("</HTML>");
        out.flush();
    }

    @Override
    public void destroy() {
        try {
            connection.close();
        } catch (Exception ex) {
            System.out.println(
                    "Error on closing database!");
            ex.printStackTrace();
            System.exit(1);
        }
    }
}

当我点击 html 格式的 submit 按钮时,什么都没有发生,甚至没有任何异常!

MySQL 连接器 jar 文件存在于 Tomcat 的 lib 文件夹中。

【问题讨论】:

  • 您是否使用 Post 方法提交表单?
  • 可以查看tomcat的日志文件找到漏掉的异常
  • 当您点击给定的提交按钮时,doPost() 方法是否被正确调用?这是一个无效的 HTML 标记 &lt;Form method=post action="DbServlet"&gt;method=post 应该是 method="post" 括在引号内。
  • 不相关但:not 在 servlet 中使用 System.exit(1)。这将关闭整个 Servlet 容器,而不仅仅是您的 Servlet。另外,您不能在 Servlet 中使用 Swing 组件 (JOptionPane)。 Servlet 没有 UI(服务器甚至可能没有图形用户界面)
  • 只是你的连接 URL "jdbc:mysql://localhost/lib" 中的一个建议,如果你连接到你的本地主机,你可以直接写 "jdbc:mysql:///lib"

标签: java servlets jdbc


【解决方案1】:

在你的表格中你写了&lt;Form method=post action="DbServlet"&gt;

你没有用你的方法名(post)写""(双引号),我猜因此没有为表单定义post方法,默认情况下它调用你的servlet的doGet()方法而不是doPost()

所以写成这样,

&lt;form method="post" action="DbServlet"&gt;

我想提出的第二个建议是:

由于您在代码中使用 PreparedStatement,因此无需为查询管理自己的 ' 单引号。

您可以在查询字符串中使用? 问号,然后再使用setXXX 方法,例如setInt()setString

String query = "INSERT INTO PhoneNums  VALUES (?, ?, ?)";
ps = connection.prepareStatement(query);
ps.setString(1, surname);
ps.setString(2, forenames);
ps.setString(3, telNum);
ps.executeUpdate();


// I believe all these three are strings

【讨论】:

  • @user3808021 但是给定的两个建议中的哪一个是赢家?知道这是结束这个问题的非常相关的信息。不适合你,适合其他来这里寻找相同问题答案的人。
  • @Gimby 你说得对,第一个解决方案解决了我的问题。
  • @Gimby 感谢您提及要点。为好的答案投票也是一个好习惯。 :p ;)
【解决方案2】:

您可能需要提交更新:

connection.commit();

当 servlet 停止服务时(可能永远不会)调用 destroy(和 connection.close())。

【讨论】:

  • 我相信连接默认是自动提交的。
  • 他不需要提交,因为他没有使用事务
猜你喜欢
  • 2012-06-25
  • 2018-11-19
  • 2015-07-17
  • 2012-03-02
  • 2014-09-09
  • 2016-06-19
  • 2014-04-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多