【问题标题】:Why does request.getParameter() method returns null?为什么 request.getParameter() 方法返回 null?
【发布时间】:2015-10-10 02:39:14
【问题描述】:

我有一个将表单发布到 Java servlet 的静态 HTML 文档。然后,servlet 获取表单的值并将它们转发到 SQL 数据库。但是,问题是当我确定该值不为空时,数据库声称该值为空。

这是表格:

<form method="post" action="Handler" target="_blank" enctype="multipart/form-data">
  <div class="row uniform 50%">
    <div class="6u 12u(mobilep)">
      <input type="text" name="name" id="name" placeholder="Username" />
    </div>
    <div class="6u 12u(mobilep)">
      <input type="email" name="email" id="email" placeholder="Email" />
    </div>
  </div>
  <div class="row uniform 50%">
    <div class="6u 12u(mobilep)">
      <input type="password" name="password" id="password" placeholder="Password" />
    </div>
  </div>
  <div class="row uniform 50%">
    <div class="12u">
      <textarea name="bio" id="bio" placeholder="Describe yourself" maxlength="200" rows="3"></textarea>
    </div>
  </div>
  <div class="row uniform">
    <div class="12u">
      <ul class="actions align-center">
        <li><input type="submit" value="Send Message" /></li>
      </ul>
    </div>
  </div>
</form>

这里是servlet代码:

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // TODO Auto-generated method stub
    Connection c = null;
    PrintWriter op = response.getWriter();
    response.setContentType("text/html");

    try{
        Class.forName("com.mysql.jdbc.Driver");
        c = DriverManager.getConnection(DB_URL, "root", "root");
    }catch(Exception s){
        op.println("<html>");
        op.println("<body><h1><strong>"+ "Error: "+ s +"</strong></h1></body>");
        op.println("</html>");
    }

    String username = request.getParameter("name");
    String email = request.getParameter("email");
    String pass = request.getParameter("password");
    String bio = request.getParameter("bio");
    String proPicName = "false";
    Long time = System.currentTimeMillis();
    String sysTime = time.toString();

    Statement stmt = null;

    try{
        stmt = c.createStatement();
        stmt.execute("USE dvlpr;");
        stmt.execute("INSERT INTO user_tbl (username, email, password, bio, pro_pic, last_on, date_created)" + " VALUES ("+username+", "+email+", "+pass+", "+bio+", "+proPicName+", "+sysTime+", "+sysTime+");");


        op.println("<html>");
        op.println("<body><h1><strong>Connection made! Username: " + username+ " Email: " + email+ " Your account has been created. We'll keep your password private, too. Thanks!</strong></h1>");
        op.println("</body>");
        op.println("</html>");
    }catch(Exception s){
        op.println("<html>");
        op.println("<body><h1><strong>"+ "Error: "+ s +"</strong></h1></body>");
        op.println("</html>");
    }

}

错误代码如下:

错误:com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException:列“用户名”不能为空

为什么返回 null?

【问题讨论】:

  • 切换到使用PreparedStatements,您的问题可能会消失。 (否则每个值都需要用单引号括起来 ('))
  • 您是否在调试器中检查过“用户名”?它是设置还是空?顺便说一下,@MickMnemonic 对 PreparedStatements 的看法是正确的。
  • 你真的知道request.getParameter 返回的是null吗?还是您假设这是因为数据库抛出错误?
  • @MickMnemonic 我会试试这个。但是,我必须问有什么区别?它是否以某种方式更好地针对查询进行了优化?
  • 您还泄漏了数据库连接。完成后您应该关闭它们。

标签: java html mysql http servlets


【解决方案1】:

参数没问题。由于语法原因,查询未正确执行。值本身需要用引号括起来,因此应该如下所示:

VALUES('"+username+"',....

如您所见,我在双引号之前和之后添加了一个',因此' 将成为结果字符串的一部分。 就像在任何其他 SQL 插入中一样,您会执行 VALUES('MyUsername', 'MyPassword',...);

此外,您可能希望使用一种执行方法而不是 2,所以它会是:

stmt.execute("USE dvlpr; INSERT INTO....");

" VALUES之前也不需要+

【讨论】:

  • 尽管这个答案在实践中“修复”了问题,但(唯一)正确的方法是通过参数化 SQL(即使用PreparedStatement)。还记得Bobby Tables吗?
猜你喜欢
  • 1970-01-01
  • 2012-01-15
  • 1970-01-01
  • 2012-06-13
  • 1970-01-01
  • 1970-01-01
  • 2014-09-21
  • 2010-12-19
  • 1970-01-01
相关资源
最近更新 更多