2010-05-03 7 views
0

Je vous écris une servlet de base de données, tout semble bien, sauf qu'il semble y avoir une erreur dans ma connexionErreur avec connexion dans ma servlet base de données

import java.io.IOException; 
import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.PreparedStatement; 
import java.sql.ResultSet; 
import java.sql.SQLException; 
import java.sql.Statement; 
import java.util.ArrayList; 

import javax.servlet.RequestDispatcher; 
import javax.servlet.ServletContext; 
import javax.servlet.ServletException; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 

public class DBServlet3 extends HttpServlet 
{ 
    private static final long serialVersionUID = 1L; 

    @Override 
    public void init() throws ServletException 
    { 
     super.init(); 
     try 
     { 
      String jdbcDriverClass= 
       getServletContext().getInitParameter("jdbcDriverClass"); 
      if (jdbcDriverClass == null) 
       throw new ServletException("Could not find jdbcDriverClass initialization parameter"); 
      Class.forName(jdbcDriverClass); 
     } 
     catch (ClassNotFoundException e) 
     { 
      throw new ServletException("Could not load JDBC driver class", e); 
     } 
    } 

    @Override 
    protected void doGet(HttpServletRequest request, HttpServletResponse response) 
     throws ServletException, IOException 
    { 
     RequestDispatcher dispatcher= 
      request.getRequestDispatcher("/db.jsp"); 

     ServletContext application= getServletContext(); 

     ArrayList<String> names= new ArrayList<String>(); 

     try 
     { 

      Connection connection= null; 
      Statement statement= null; 
      ResultSet results= null; 

      try 
      { 
       String jdbcUrl= application.getInitParameter("jdbcUrl"); 
       String jdbcUser= application.getInitParameter("jdbcUser"); 
       String jdbcPassword= application.getInitParameter("jdbcPassword"); 

       connection= 
        DriverManager.getConnection(jdbcUrl, jdbcUser, jdbcPassword); 

       statement= connection.createStatement(); 

       results= statement.executeQuery("SELECT * FROM students"); 

       while (results.next()) 
       { 
        String name= results.getString("name"); 
        names.add(name); 
       } 
      } 
      finally 
      { 
       if (results != null) 
        results.close(); 
       if (statement != null) 
        statement.close(); 
       if (connection != null) 
        connection.close(); 
      } 
     } 
     catch (SQLException e) 
     { 
      throw new ServletException(e); 
     } 

     request.setAttribute("names", names); 

     dispatcher.forward(request, response); 
    } 

    @Override 
    protected void doPost(HttpServletRequest request, HttpServletResponse response) 
     throws ServletException, IOException 
    { 
     String sql= "INSERT INTO students VALUES (" + 
      request.getParameter("id") + ", '" + request.getParameter("name") + "')"; 

     sql= "INSERT INTO students VALUES (?, ?, ?, ?)"; 

     PreparedStatement statement= connection.prepareStatement(sql); //error on this line 

     statement.setString(1, request.getParameter("id")); 
     statement.setString(2, request.getParameter("name")); 
    } 

} 
+0

Pouvez-vous nous dire ce que l'erreur est? Que produit ce code et qu'attendez-vous? –

+0

Si vous mettez le SerialVersionID simplement pour éviter les avertissements, mettez plutôt @SuppressWarnings ("serial") juste avant la définition de votre classe –

Répondre

2

Je ne suis pas du tout clair quel est le problème spécifique est , et je voudrais éditer pour ajouter une pile. Cependant, quelques observations.

  1. vous obtenez et la fermeture d'une connexion dans votre méthode doGet(), mais vous n'avez pas dans votre méthode doPost(). Cela entraînera une erreur. Vous devriez obtenir votre connexion de manière cohérente par demande, et peut-être (plus loin) vérifier les cadres de mise en commun des connexions tels que C3P0 ou Apache DBCP.
  2. plutôt que de former SQL à partir de la construction de chaînes, consultez PreparedStatements. Ils conduiront à moins de code sujet aux erreurs et vous protéger contre les attaques par injection SQL.
  3. vous avez un serialVersionUid dans votre servlet. Avez-vous vraiment besoin de sérialiser votre servlet (je ne le soupçonne pas)?
  4. Apache DbUtils fera beaucoup de levage lourd pour vous. vanilla JDBC (par exemple, il s'occupera de la séquence resultset/statement/closing).
+0

En fait, il ne réutilise pas la connexion dans doPost(), il n'en a tout simplement pas, –

+0

. Mon erreur. Fixé. –

Questions connexes