【问题标题】:Java Servlet to handle html post dataJava Servlet 处理 html 发布数据
【发布时间】:2014-05-12 09:39:36
【问题描述】:

我正在尝试在特定 URL 上创建一个 servlet,以处理来自另一台服务器的 HTML 帖子并接收所有参数及其值并将它们插入数据库。

目前为止得到了这段代码:

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

public class QueryServlet extends HttpServlet {

@Override
public void doPost(HttpServletRequest req,HttpServletResponse res) throws IOException, ServletException
{
    String instId=req.getParameterValues("instId")[0];
    String cartId=req.getParameterValues("cartId")[0];
    String desc=req.getParameterValues("desc")[0];
    String cost=req.getParameterValues("cost")[0];
    String amount=req.getParameterValues("amount")[0];
    String currency=req.getParameterValues("currency")[0];
    String name=req.getParameterValues("name")[0];
    String transId=req.getParameterValues("transId")[0];
    String transStatus=req.getParameterValues("transStatus")[0];
    String transTime=req.getParameterValues("transTime")[0];
    String cardType=req.getParameterValues("cardType")[0];
    Connection conn = null;
    Statement stmt = null;
    PrintWriter out=res.getWriter();
    try
    {
        conn = DriverManager.getConnection(
        "jdbc:mysql://localhost:3306/orders", "root", "root");
        stmt = conn.createStatement();

        String sqlStr = "insert into orderdetails values('"+transId+"','"+instId+"','"+cartId+"','"+desc+"'"+cost+"','"+amount+"','"+currency+"','"+name+"','"+transStatus+"','"+transTime+"','"+cardType+")";

        out.println("<html><head><title>Query Response</title></head><body>");
        out.println("<h3>Thank you for your query.</h3>");
        out.println("<p>You query is: " + sqlStr + "</p>"); // Echo for debugging
        ResultSet rset = stmt.executeQuery(sqlStr);  // Send the query to the server
        }
        catch(SQLException ex)
        {
          ex.printStackTrace();       
        }
    }
}

我尝试了一些更改,但总是出错。

你能帮帮我吗?

顺便说一句,我对 Java 知之甚少,一直试图从其他人的示例和低谷指南中“破解我的方式”来做到这一点。

提前致谢


编辑:我无法登录我的开发机器 atm,因为它有问题并且已关闭,它与 Null 指针或 Null 值有关,无法给出确切的错误 atm,将尽快更新可能。

我也知道代码中的 SQL 注入,只是尝试先对其进行测试并使其工作并在我设置它之前更改代码。

【问题讨论】:

  • 你遇到了什么错误?
  • 附带说明,在 sql 查询中连接客户端接收到的值是一个很大的安全漏洞。你应该使用PreparedStatement
  • 除非您有特定的理由手动执行此操作,否则请改用 Spring MVC 并让它处理所有样板; Spring Boot 将为您处理几乎所有的配置。此外,您永远不应该使用字符串粘贴来创建任何语言的 SQL 语句;改用准备好的语句。

标签: java servlets


【解决方案1】:

那里有一些引用/逗号打断,它应该是 exevcuteUpdate。 然而,使用 PreparedStatement 很重要:

  • 更容易处理 SQL 字符串,转义字符串中的特殊字符(如撇号)
  • 您可以使用类型化参数,例如下面的 BigDecimal
  • 安全SQL injection

我使用 try-with-resources 语法关闭了stmt。

    String instId = req.getParameter("instId");
    String cartId = req.getParameter("cartId");
    String desc = req.getParameter("desc");
    String cost = req.getParameter("cost");
    BigDecimal amount = new BigDecimal(req.getParameter("amount"));
    String currency = req.getParameter("currency");
    String name = req.getParameter("name");
    String transId = req.getParameter("transId");
    String transStatus = req.getParameter("transStatus");
    String transTime = req.getParameter("transTime");
    String cardType = req.getParameter("cardType");
    Connection conn = null;
    Statement stmt = null;
    PrintWriter out = res.getWriter();
    try {
        conn = DriverManager.getConnection(
                "jdbc:mysql://localhost:3306/orders", "root", "root");

        String sqlStr = "insert into orderdetails "
                + "values(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
        try (PreparedStatement stmt = conn.prepareStatement(sqlStr)) {
            stmt.setString(1, transId);
            stmt.setString(2, instId);
            stmt.setString(3, cartId);
            stmt.setString(4, desc);
            stmt.setString(5, cost);
            stmt.setBigDecimal(6, amount);
            stmt.setString(7, currency);
            stmt.setString(8, name);
            stmt.setString(9, transStatus);
            stmt.setString(10, transTime);
            stmt.setString(11, cardType);
            int updateCount = stmt.executeUpdate();

            out.println("<html><head><title>Query Response</title></head><body>");
            out.println("<h3>Thank you for your query. " + updateCount + " record(s) updated.</h3>");
            out.println("<p>You query is: " + sqlStr + "</p>"); // Echo for debugging
            for (Enumeration<String> en = req.getParameterNames(); en.hasMoreElements();) {
                String paramName = en.nextElement();
                String paramValue = req.getParameter(paramName);
                out.println("<p>" + paramName + ": " + paramValue + "</p>"); // Echo for debugging
            }
        } // Does stmt.close()
    } catch (SQLException ex) {
        ex.printStackTrace();
    }

【讨论】:

    【解决方案2】:

    对于插入、更新或删除使用executeUpdate(),但您使用的是executeQuery()

    并且executeUpdate方法返回一个整数(受影响的行数)所以改变

    ResultSet rset = stmt.executeQuery(sqlStr);
    

    到

    int update= stmt.executeUpdate(sqlStr);
    

    也更喜欢使用PreparedStatement

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-24
      • 1970-01-01
      • 1970-01-01
      • 2013-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多