2016-04-26 2 views
0

Я новичок в Java EE, особенно с пулами соединений (которые я даже не начинаю понимать правильно). Я попытался создать базовый ресурс JDBC с NetBeans, с помощью нового >> ресурса JDBC. Он создал следующий GlassFish-resources.xml:Использование ресурса и сервлета JDBC от 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> 

После этого я повторно старый сервлет "MiServlet", который находится в пакете по умолчанию. Этот сервлет использовался для работы некоторое время назад с типичными практиками начала работы с сервлетами, но теперь он просто не отправит никакого ответа. Я настроил его в 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> 

Это метод сервлета 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); 
     } 
    } 

Этот простой тест должен отображаться все первый столбец пользователя с моего сервера WAMP MySQL на этом же компьютере, используя ресурс JDBC, который я ранее создал с помощью мастера NetBeans. Но все это я получаю, это пустой HTML-страницы, с не даже статического контента, записанного в сервлет (который показывает, что это даже не вызывался):

я вызываю в

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: El esquema 'PRUEBASBD' нет Existe. (схема PRUEBASBD не существует)

, если я указываю его к столу «Персона» (так как я уже выбрали эту схему в GlassFish-resources.xml, как показано ранее):

Grave : java.sql.SQLSyntaxErrorException: La tabla/vista 'PERSONA' no existe. (Таблица/вид PERSONA не существует)

ответ

1

Я изучаю Java EE прямо сейчас! и я делаю ContextConfiguration в методе «init», надеюсь, что мое упражнение будет полезным «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

Благодарим за помощь! Но это все еще не работает :(, проверьте это исключение: «Реклама: StandardWrapperValve [JdbcServlet]: Servlet.service() для сервлета JdbcServlet выбрала исключение java.lang.NullPointerException \t в JdbcServlet.doGet (JdbcServlet.java:51)" Кажется, что объект «пул» не инициализируется по методу «init». – Zerok

+0

Лучше опубликуйте свое исключение на ваш вопрос, пожалуйста;) –

+0

Мне удалось заставить его работать! Но он по-прежнему вызывает ошибки, такие как «Таблица PERSONA» не найдена (да, имя моей таблицы «persona», проверено). Это не работает, если я раньше использовал db-схему «pruebasbd». Позвольте мне уточнить вопрос. – Zerok

Смежные вопросы