【问题标题】:Why data from the servlet is not inserted into sql database?为什么 servlet 中的数据没有插入到 sql 数据库中?
【发布时间】:2014-12-14 16:26:35
【问题描述】:
html file
<html>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
 <title>hi</title>
 </head>
  <body>
  <form action="Try.java" method="get" >
  name: <input type="text" name="name" ></input>
  <input type="submit" name="submit" value="submit" style="color: blue">
  </form>
  </body>
   </html>



servlet code
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection; 
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet; 

import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse;

 public class Try extends HttpServlet {

  private static final long
  serialVersionUID = 1L;      
  Connection con;
  Statement stm;

   public Try() {
   super();
          }


protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, 
IOException {

    res.setContentType("text/html");    
    PrintWriter out=res.getWriter();
     try {      
      String pname=req.getParameter("name");
      Class.forName("oracle.jdbc.driver.OracleDriver");
      System.out.println("driver loaded"); 
      String url="jdbc:oracle:thin:@an-PC:1525/orclg"; 
      Connection
      con=DriverManager.getConnection(url,"user","pass");
      out.println("connection"+con);    
      Statement stm=con.createStatement();  
      String sql="Insert into name(names)values('"+pname+"')";      
      stm.executeUpdate(sql);
      System.out.println("Record inserted.....");       
      con.close();
    } catch (ClassNotFoundException e) {        
      // TODO Auto-generated catch block        
      e.printStackTrace();  
    } catch (SQLException e) {
        // TODO Auto-generated catch block      
      e.printStackTrace();  }
      }

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

  }    
}
 following are the Exceptions

java.lang.ClassNotFoundException: oracle.jdbc.driver.OracleDriver 在 org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1680) 在 org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1526) 在 java.lang.Class.forName0(本机方法) 在 java.lang.Class.forName(Class.java:259) 在 Try.doGet(Try.java:41) 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:617) 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:723) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 在 org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) 在 org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) 在 org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) 在 org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103) 在 org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) 在 org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293) 在 org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:861) 在 org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:606) 在 org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489) 在 java.lang.Thread.run(Thread.java:745)

【问题讨论】:

  • 提供堆栈跟踪!
  • "Insert into name(names)values("+"'pname')",对这个字符串做 println,在 sqldeveloper(或者你用来管理你的数据库的任何东西)中执行它,看看你的查询没问题。 (错误的表?错误的属性?)
  • 你忘记提交了吗?

标签: java html servlets oracle10g


【解决方案1】:

您应该学会解释堆栈跟踪。堆栈跟踪的第一行意味着 Java 运行时找不到类 oracle.jdbc.driver.OracleDriver。 这是 Oracle JDBC 驱动程序类。

所以获取Oracle driver JAR 并将其放入您的Web 应用程序的WEB-INF/lib 文件夹中。

顺便说一句:为了防止SQL injection attacks,您永远不应该通过字符串操作使用未转义的请求参数创建 SQL。请改用准备好的语句。并且不要忘记关闭语句并提交事务。

PreparedStatement stm = con.prepareStatement("insert into name (names) values (?)");  
stm.setString(1, pname);
stm.executeUpdate();
con.commit();
stm.close();

这将自动转义引号等字符。此外,您应该在插入之前验证该值(例如,不超过 100 个字符,具体取决于名称列的长度)。

【讨论】:

    【解决方案2】:

    这句话可能是你的问题:

    String sql="Insert into name(names)values("+"'pname')"; 
    

    我认为引号应该如下:

    String sql="Insert into name(names)values('"+pname+"')"; 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-06-22
      • 1970-01-01
      • 2019-05-03
      • 1970-01-01
      • 2019-09-27
      • 1970-01-01
      • 2012-06-11
      • 2022-01-06
      相关资源
      最近更新 更多