【问题标题】:Can not populate database through servlet无法通过 servlet 填充数据库
【发布时间】:2015-01-08 19:39:27
【问题描述】:

我已经创建了一个 jsp 表单和一个 servlet 来使用 tomcat 在 mysql 中填充数据库,但是当我点击“提交”按钮将值传递给数据库时,它显示了表中已影响 0 行的消息。在服务器日志中,它显示空指针异常。我已将 MySQL JDBC 驱动程序以及 JSTL 1.2.2 添加到库中。 我创建了两个排除的 java 类来建立数据库连接和执行查询。

这里是servlet代码:

public class SubmitUser extends HttpServlet {

private DbUpdate dbup = new DbUpdate(); 


protected void processRequest(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {

    response.setContentType("text/html;charset=UTF-8");
    PrintWriter out = response.getWriter();

    String profession = request.getParameter("profession");
    String features = request.getParameter("features");

    String sql = "INSERT INTO test values('profession','features')";
    int i = dbup.insertValues(sql);

这是包含查询执行的 DbUpdate.java 文件

public class DbUpdate {

    private Statement st;
    private int i;
    private Connection c;

    private DbConnection dbcon = new DbConnection();


    public int insertValues(String sql){
        try {
            c = dbcon.connectDB();

            Statement st = c.createStatement();
            System.out.println("connected");
            i = st.executeUpdate(sql);
        } catch (SQLException ex) {
            Logger.getLogger(DbConnection.class.getName()).log(Level.SEVERE, null, ex);
        }
        return i;
    }

    public static void main (String[] args){
        //DbConnection dbcon =new DbConnection();
        //dbcon.connectDB();
        DbUpdate dbup = new DbUpdate();


    }

}

最后是建立连接的 DbConnection.java 文件

public class DbConnection {

    private String driver = "com.mysql.jdbc.Driver";
    private String url = "jdbc:mysql://localhost:3306/online_feedback";
    private Connection con = null;
    private Statement st;
    //private int i;


    public Connection connectDB(){
        try {
            Class.forName(driver);
            Connection con = DriverManager.getConnection(url, "root", "");
            System.out.println("Conn obj :::" + con);
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(DbConnection.class.getName()).log(Level.SEVERE, null, ex);
        } catch (SQLException ex) {
            Logger.getLogger(DbConnection.class.getName()).log(Level.SEVERE, null, ex);
        }

        return con;
    }


    public static void main (String []args){

        DbConnection db = new DbConnection();
        db.connectDB();
    }

}

我不知道出了什么问题

提前致谢

这是我在 Servlet 日志中得到的内容

SEVERE: Servlet.service() for servlet [SubmitUser] in context with path [/Feedback] threw exception
java.lang.NullPointerException
	at feedback.DbUpdate.insertValues(DbUpdate.java:32)
	at feedback.SubmitUser.processRequest(SubmitUser.java:76)
	at feedback.SubmitUser.doGet(SubmitUser.java:120)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
	at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
	at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:936)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
	at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1004)
	at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
	at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
	at java.lang.Thread.run(Thread.java:745)

【问题讨论】:

  • 你写的sql查询错误。
  • 请显示 NullPointerException 堆栈跟踪。
  • 每个班级都不需要public static void main()。因为他们没有被执行。

标签: java mysql servlets


【解决方案1】:

我将假设您进行了某种重复密钥检查。您的查询应该真正使用绑定参数,但您的 sql 可以像

// String sql = "INSERT INTO test values('profession','features')";
String sql = "INSERT INTO test values('" + profession + "','"
    + features + "')";

此时您正在插入常量professionfeatures

使用PreparedStatement,它可能看起来更像

public int insertValues(String profession, String features) {
    String sql = "INSERT INTO test values(?, ?)";
    Connection conn;
    PreparedStatement ps;
    try {
        conn = dbcon.connectDB();

        ps = conn.prepareStatement(sql);
        ps.setString(1, profession);
        ps.setString(2, features);
        return ps.executeUpdate();
    } catch (SQLException ex) {
        Logger.getLogger(DbConnection.class.getName()).log(Level.SEVERE,
                null, ex);
    } finally {
        if (ps != null) {
            try {
                ps.close();
            } catch (Exception ignored) {
            }
        }
        if (conn != null) {
            try {
                conn.close();
            } catch (Exception ignored) {
            }
        }
    }
    return 0;
}

【讨论】:

  • 该 sql 确实很奇怪,但不会导致 NullPointerException,这是此问题的根本原因。
  • 我已经尝试使用准备好的语句和所有其他相关更改,但我仍然收到带有空指针异常的 http 500 错误:(
  • @Suchini 那么你的连接可能是null。看看你是如何连接的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-02-06
  • 1970-01-01
  • 1970-01-01
  • 2019-05-02
  • 1970-01-01
  • 1970-01-01
  • 2020-11-20
相关资源
最近更新 更多