2016-04-26 6 views
0

Ich bin neu in Java EE, vor allem mit Verbindungspools (die ich nicht einmal richtig verstehe). Ich habe versucht, eine grundlegende JDBC-Ressource mit Netbeans, mit New >> JDBC Resource. Er schuf die folgenden Glassfish-resources.xml:Verwenden von JDBC-Ressource und Servlet von Netbeans

<resources> 
    <jdbc-resource enabled="true" jndi-name="jdbc/myDB" object-type="user" pool-name="miConnectionPool"> 
    <description/> 
    </jdbc-resource> 
    <jdbc-connection-pool allow-non-component-callers="false" associate-with-thread="false" connection-creation-retry-attempts="0" connection-creation-retry-interval-in-seconds="10" connection-leak-reclaim="false" connection-leak-timeout-in-seconds="0" connection-validation-method="auto-commit" datasource-classname="com.mysql.jdbc.jdbc2.optional.MysqlDataSource" fail-all-connections="false" idle-timeout-in-seconds="300" is-connection-validation-required="false" is-isolation-level-guaranteed="true" lazy-connection-association="false" lazy-connection-enlistment="false" match-connections="false" max-connection-usage-count="0" max-pool-size="32" max-wait-time-in-millis="60000" name="miConnectionPool" non-transactional-connections="false" pool-resize-quantity="2" res-type="javax.sql.DataSource" statement-timeout-in-seconds="-1" steady-pool-size="8" validate-atmost-once-period-in-seconds="0" wrap-jdbc-objects="false"> 
    <property name="URL" value="jdbc:mysql://localhost:3306/pruebasbd?relaxAutoCommit=&quot;true&quot;"/> 
    <property name="User" value="root"/> 
    <property name="Password" value="root"/> 
    </jdbc-connection-pool> 
</resources> 

Danach wird wieder verwendet ich ein altes Servlet "MiServlet", die in der Standard-Paket. Dieses Servlet hat vor einiger Zeit mit den typischen Anfangspraktiken mit Servlets gearbeitet, aber jetzt wird es keine Antwort mehr senden. Ich habe es in der web.xml konfiguriert, so dass es im URL-Muster "localhost/myProject/index" aufgerufen wird, aber nichts wird angezeigt.

Hier haben Sie den XML-config:

<servlet> 
    <servlet-name>MiServlet</servlet-name> 
    <servlet-class>MiServlet</servlet-class> 
</servlet> 

(...)

<servlet-mapping> 
    <servlet-name>MiServlet</servlet-name> 
    <url-pattern>/index</url-pattern> 
</servlet-mapping> 

Dies ist die Servlet-Methode Process jetzt. Ich hob die Teile, in denen ich versuche, meine neu erstellten JDBC-Ressource zu verwenden (ich habe ernsthaft keine Ahnung, ob ich falsch oder nicht tue!):

protected void processRequest(HttpServletRequest request, HttpServletResponse response) 
      throws ServletException, IOException { 
     try { 
      **// Context creation 
      Context initContext = new InitialContext(); 
      Context webContext = (Context) initContext.lookup("java:/comp/env"); 

      DataSource ds = (DataSource) webContext.lookup("jdbc/myDB"); 
      Connection dbCon = ds.getConnection();** 
      PreparedStatement ps = dbCon.prepareStatement("SELECT * FROM person"); 
      ResultSet rs = ps.executeQuery(); 
      String res = "BEGINNING\n"; 
      while(rs.next()){ 
       res += rs.getString(1)+"\n"; 
      } 

      response.setContentType("text/html;charset=UTF-8"); 
      try (PrintWriter out = response.getWriter()) { 
       /* TODO output your page here. You may use following sample code. */ 
       out.println("<!DOCTYPE html>"); 
       out.println("<html>"); 
       out.println("<head>"); 
       out.println("<title>Servlet MiServlet</title>"); 
       out.println("</head>"); 
       out.println("<body>"); 
       out.println("<h1>Servlet MiServlet at " + request.getContextPath() + "</h1>"); 
       out.println("<p>"+res+"</p>"); 
       out.println("</body>"); 
       out.println("</html>"); 
      } 
     } catch (NamingException ex) { 
      Logger.getLogger(MiServlet.class.getName()).log(Level.SEVERE, null, ex); 
     } catch (SQLException ex) { 
      Logger.getLogger(MiServlet.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 

Diesen einfachen Test sollte zeigen all Die erste Spalte der Person von meinem WAMP-MySQL-Server auf demselben Computer unter Verwendung der JDBC-Ressource, die ich zuvor mit dem NetBeans-Assistenten erstellt habe. Aber alles, was ich bekommen, ist dieser leere HTML-Seite, mit nicht einmal den statischen Inhalt in das Servlet geschrieben (was zeigt, dass es nicht einmal nennt sich immer):

Ich rufe bei

https://localhost:8181/PruebasJ2EE-war/index

... und ich:

<html> 
<head> 
<link rel="alternate stylesheet" type="text/css" href="resource://gre-resources/plaintext.css" title="Ajustar líneas largas"> 
</head> 
<body> 
<pre></pre> 
</body> 
</html> 

Was mache ich falsch?

edit:

Jetzt mit M-Mariscal Antwort des Code verwaltet sie zu verbinden, aber es kann immer noch keine Tabelle oder Schema finden. Wenn ich darauf, die Abfrage pruebasbd.persona:

Verursacht durch: org.apache.derby.client.am.SqlException: El esquema 'PRUEBASBD' no existe. (Schema PRUEBASBD existiert nicht)

, wenn ich es auf den Tisch "Persona" Punkt (da ich dieses Schema in der Glassfish-resources.xml bereits ausgewählt, wie zuvor angegeben):

Grave : java.sql.SQLSyntaxErrorException: La tabla/vista 'PERSONA' keine existe. (Tabelle/Ansicht PERSONA existiert nicht)

Antwort

1

Ich lerne gerade Java EE! und ich mache die ContextConfiguration auf Methode 'init', hoffe, dass meine Übung hilfreich 'Colega' ist, ich weiß nicht, ob ich dir helfe, aber ist das Beste, was ich für dich tun kann, wenn du nur mehr Code brauchst Nachfragen!;)

public class JdbcServlet extends HttpServlet { 

    private DataSource pool; 

    @Override 
    public void init(ServletConfig config) throws ServletException {   
     Context env = null; 
     try { 
      env = (Context) new InitialContext().lookup("java:comp/env"); 
      pool = (DataSource) env.lookup("sample"); //nombre en web.xml 
      if (pool == null) { 
       throw new ServletException("No se encontró el DataSource"); 
      } 
     } catch (NamingException ex) { 
      Logger.getLogger(JdbcServlet.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    }   

    @Override 
    protected void doGet(HttpServletRequest request, HttpServletResponse response) 
      throws ServletException, IOException { 

     Connection conexion = null; 
     ResultSet resultSet = null; 

     response.setContentType("text/html;charset=UTF-8"); 

     try (PrintWriter out = response.getWriter()) { 
      out.println("<h1>Lista de amigos</h1>"); 
      try {     
       conexion = pool.getConnection(); 
       Statement statement = conexion.createStatement(); 
       String sql = "SELECT * FROM personas"; 
       ResultSet res = statement.executeQuery(sql); 
       if (res.next()) {            
        do { 
         out.println("<p>Nombre: "+res.getString("nombre")+ 
           "<br/>Edad:"+res.getInt("edad")+"</p>"); 
        } while (res.next()); 
       } else { 
        out.println("<p>No hay amigos dados de alta</p>"); 
       } 
       out.println("<a href='index.html'>Volver al inicio</a>"); 
      } catch (SQLException ex) { 
       Logger.getLogger(JdbcServlet.class.getName()).log(Level.SEVERE, null, ex); 
      } finally { 
       try { 
        if (conexion != null && !conexion.isClosed()) 
         conexion.close(); 
       } catch (SQLException ex) { 
        Logger.getLogger(JdbcServlet.class.getName()).log(Level.SEVERE, null, ex); 
       } 
      } 
     } 
    } 

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

     String nombre = request.getParameter("nombre"); 
     String edad = request.getParameter("edad"); 

     if (nombre != null && edad != null) { 
      Connection conexion = null; 
      Statement statement = null; 
      try { 
       int numEdad = Integer.parseInt(edad); 
       String sql = "INSERT INTO personas VALUES('"+nombre+"',"+numEdad+")"; 
       conexion = pool.getConnection(); 
       statement = conexion.createStatement(); 
       statement.executeUpdate(sql);     
       doGet(request, response); 
      } catch (NumberFormatException | SQLException ex) { 
       Logger.getLogger(JdbcServlet.class.getName()).log(Level.SEVERE, null, ex); 
      } finally { 
       try { 
        if (conexion != null && !conexion.isClosed()) 
         conexion.close(); 
       } catch (SQLException ex) { 
        Logger.getLogger(JdbcServlet.class.getName()).log(Level.SEVERE, null, ex); 
       } 
      } 
     } 
    } 

    @Override 
    public String getServletInfo() { 
     return "Short description"; 
    }// </editor-fold> 

} 
+0

Vielen Dank für Ihre Hilfe! Aber es funktioniert immer noch nicht :(, überprüfen Sie diese Ausnahme: "Advertencia: StandardWrapper.Valve [JdbcServlet]: Servlet.service() für Servlet JdbcServlet warf Ausnahme java.lang.NullPointerException \t bei JdbcServlet.doGet (JdbcServlet.java:51)" Es scheint, dass das "Pool" -Objekt nicht auf die "init" -Methode initialisiert. – Zerok

+0

Besser posten Sie Ihre Ausnahme auf Ihre Frage bitte;) –

+0

Ich schaffte es zu arbeiten! Aber es gibt immer noch Fehler wie "Tabelle PERSONA" nicht gefunden (ja, der Name meiner Tabelle ist "persona", überprüfte es). Es funktioniert auch nicht, wenn ich vorher das DB-Schema "pruebasbd" gesetzt habe. Lassen Sie mich die Frage aktualisieren. – Zerok