2016-04-26 30 views
0

我是Java EE的新手,尤其是連接池(我甚至沒有正確理解)。我試圖用Netbeans和New >> JDBC Resource創建一個基本的JDBC資源。它創建了以下與GlassFish resources.xml中使用Netbeans的JDBC資源和servlet

<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> 

在此之後,我再用一個老的servlet, 「MiServlet」,這是在默認的包。這個servlet過去常常和Servlet一起開始工作,但現在它不會發送任何響應。我已經在web.xml中配置了它,所以它在URL模式「localhost/myProject/index」處被調用,但沒有顯示。

在這裏,你有XML配置:

<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> 

這是servlet的processRequest方法現在。我強調了在那裏我試圖用我的新創建的JDBC資源的部分(我嚴重不知道,如果我做錯了或不!):

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); 
     } 
    } 

這個簡單的測試應該顯示全部使用我以前使用NetBeans嚮導創建的JDBC資源,在同一臺計算機上從我的WAMP MySQL服務器獲取人員的第一列。但我得到的,這是空的HTML頁面,使用甚至沒有寫在servlet(這表明它甚至沒有獲取調用)的靜態內容:

我致電

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

...我得到:

<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> 

我在做什麼錯?

編輯:

與M-元帥答案的代碼

現在,它管理的連接,但它仍然無法找到任何表或模式。如果我點查詢pruebasbd.persona:

造成的:org.apache.derby.client.am.SqlException:薩爾瓦多esquema 'PRUEBASBD' 沒有existe。 (架構PRUEBASBD不存在)

如果將它指向表「角色」(因爲我已經選擇在GlassFish-resources.xml中該模式如前所示):

格雷夫斯:java.sql.SQLSyntaxErrorException:La tabla/vista'PERSONA'no existe。 (表/視圖PERSONA不存在)

回答

1

我正在學習Java EE!我正在做方法'init'上的ContextConfiguration,希望我的練習能夠幫助'colega',我不知道我是否在幫助你,但是我可以爲你做的最好的,如果你需要更多的代碼請求!;)

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

謝謝你的幫忙!但它仍然不工作:(檢查此異常:「Advertencia:StandardWrapperValve [JdbcServlet]:servlet.service()for servlet JdbcServlet拋出異常 java.lang.NullPointerException \t at JdbcServlet.doGet(JdbcServlet.java:51)」看起來「池」對象沒有在「初始化」方法初始化。 – Zerok

+0

更好地發佈你的問題的例外,請;) –

+0

我設法讓它工作!但它仍然會拋出錯誤,如「Table PERSONA」未找到(是的,我的表名是「persona」,檢查它)。如果我之前放置了數​​據庫模式「pruebasbd」,它也不起作用。讓我更新這個問題。 – Zerok