2015-01-10 2 views
-1

Я пытаюсь выполнить простую программу сервлетов (в eclipse10.0 oracle10g, tomcat6.0), извлечение данных из table.but, я не могу сделать .checked с многими форумами n мой код, но все же я получаю то же самое..плз помочь мне. мой кодINFO: запуск сервера в 1054 мс java.sql.SQLException: ORA-00904: «USHA»: недопустимый идентификатор

entermail.html 

<body> 
    <form action="getdata"> 
    <p> Plz enter Your name ID Below to get your Details</p> 
    <input type="text" name="uname" > 
    <input type="submit" value="[email protected]"> 

    </form> 
    </body> 

<servlet> 
    <servlet-name>MyServletdb</servlet-name> 
    <servlet-class>com.myservlets.demo.Servletdb</servlet-class> 
    </servlet> 

    <servlet-mapping> 
    <servlet-name>MyServletdb</servlet-name> 
    <url-pattern>/getdata</url-pattern> 
    </servlet-mapping>  
    <welcome-file-list> 
    <welcome-file>enteremail.html</welcome-file> 
    </welcome-file-list> 
</web-app> 




public class Servletdb extends HttpServlet { 

    private static final long serialVersionUID = 1L; 
    Connection con; 
    Statement st; 
    ResultSet rs; 
    PrintWriter out; 
    String s1="jdbc:oracle:thin:@localhost:1521:XE",name; 
    String s2="system"; 
    String s3="orclpass"; 

    public void init(ServletConfig sc) throws ServletException { 
     // DB connection code 
     try{ 
      Class.forName("oracle.jdbc.driver.OracleDriver"); 
      con=DriverManager.getConnection(s1,s2,s3); 
      st=con.createStatement(); 
      super.init(sc); 

     } 
     catch (Exception e) { 
      // TODO: handle exception 
      e.printStackTrace(); 
     } 
    } 

    public void doGet(HttpServletRequest request, HttpServletResponse response) 
      throws ServletException, IOException { 
     try{ 
     response.setContentType("text/html"); 
     out = response.getWriter(); 
     name=request.getParameter("uname"); 
     rs=st.executeQuery("select *from details where FIRSTNAME="+name+""); 

     out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">"); 
     out.println("<HTML>"); 
     out.println(" <HEAD><TITLE>A Servlet</TITLE></HEAD>"); 
     out.println(" <BODY>"); 
     while(rs.next()){ 
      out.println(rs.getString(1)+" "+rs.getString(2)+" "+rs.getString(3)+" "+rs.getString(4)); 
     } 
     out.println(" </BODY>"); 
     out.println("</HTML>"); 
     out.flush(); 
     out.close(); 
     rs.close(); 
     }catch (Exception e) { 
      // TODO: handle exception 
      e.printStackTrace(); 
     } 
    } 

    public void destroy() { 
     super.destroy(); // Just puts "destroy" string in log 
     try{ 
      st.close(); 
      con.close(); 

     }catch (Exception e) { 
      // TODO: handle exception 
      e.printStackTrace(); 
     } 
    } 

} 
    Finally I have table in orcl DB is : 
details: FIRSTNAME LASTNAME ADDRESS EMAILID 

Ошибка: INFO: запуск сервера в 1080 мс java.sql.SQLException: ORA-00904: "USHA": недопустимый идентификатор

at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112) 
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:331) 
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:288) 
at oracle.jdbc.driver.T4C8Oall.receive(T4C8Oall.java:743) 
at oracle.jdbc.driver.T4CStatement.doOall8(T4CStatement.java:207) 
at oracle.jdbc.driver.T4CStatement.executeForDescribe(T4CStatement.java:790) 
at oracle.jdbc.driver.OracleStatement.executeMaybeDescribe(OracleStatement.java:1038) 
at oracle.jdbc.driver.T4CStatement.executeMaybeDescribe(T4CStatement.java:830) 
at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1133) 
at oracle.jdbc.driver.OracleStatement.executeQuery(OracleStatement.java:1273) 
at com.myservlets.demo.Servletdb.doGet(Servletdb.java:48) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:617) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) 
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) 
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) 
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) 
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) 
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298) 
at org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:859) 
at org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:579) 
at org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:1555) 
at java.lang.Thread.run(Thread.java:619) 

ответ

2

Это проблема:

// BROKEN (will give query such as "select * from details where FIRSTNAME=Jon" 
rs=st.executeQuery("select *from details where FIRSTNAME="+name+""); 

Я подозреваю, что вы означало добавить одну цитату по стоимости name, так что where пункта будет что-то вроде where FIRSTNAME='Jon' как это:

// WARNING: DO NOT USE (keep reading) even though it works in simple cases 
rs = st.executeQuery("select *from details where FIRSTNAME='" + name + "'"); 

... но это еще не хорошего способа решения этой проблемы, потому что она уязвима для SQL injection attacks. Вместо этого следует использовать подготовленное заявление - открыть соединение, а затем использовать:

PreparedStatement query = 
    conn.prepareStatement("select * from details where FIRSTNAME=?"); 
query.setString(1, name); 
ResultSet results = query.executeQuery(); 
... 

Обратите внимание, что я хотел бы открыть соединение отдельно по каждому запросу и закрыть его, когда вы сделали (с примеркой с-ресурсами), используя пул соединений для повышения эффективности. Это более чистое, чем попытка совместного использования единого соединения между несколькими потоками.

Дополнительную информацию об использовании подготовленных инструкций см. В разделе JDBC tutorial on PreparedStatement.