2016-02-18 3 views
0

Я просто пытаюсь установить мое соединение на свой сервлет и вывести запрос.Соединение с базой данных не работает через Servlet

Я получил эту работу при запуске по отдельному проекту с использованием того же кода, но работал как приложение Java, а не как сервлет. Водитель также находится в правильном месте.

Ниже мой код на сервлете:

package myproject; 

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 javax.servlet.ServletException; 
import javax.servlet.annotation.WebServlet; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 

/** 
* Servlet implementation class jdbc 
*/ 
@WebServlet("/jdbc") 
public class jdbc extends HttpServlet { 

    private static final long serialVersionUID = 1L; 

    /** 
    * @see HttpServlet#HttpServlet() 
    */ 
    public jdbc() { 
     super(); 
     // TODO Auto-generated constructor stub 
    } 

    /** 
    * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse 
    * response) 
    */ 
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 

    } 

    public static Connection con; 

    protected static void main(String[] argv) { 
     try { 
      connectionQuery(); 

      PreparedStatement statement = con.prepareStatement("SELECT * from Music_Categories");/*write query inside of prepared statement*/ 
      ResultSet result = statement.executeQuery(); 
      System.out.println("DataBase table accessed"); 

      while (result.next()) { 
       String retrievedid = result.getString("name"); 
       System.out.println(retrievedid); 
      } 

      con.close(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
      System.out.println(e.getMessage().toString()); 
     } 
    } 

    protected static void connectionQuery() { 
     try { 
      Class.forName("com.mysql.jdbc.Driver"); 
      con = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/newschemam?useSSL=false", "root", "root"); 
      System.out.println("Remote DB connection established"); 
     } catch (ClassNotFoundException e) { 
      e.printStackTrace(); 
      System.out.println("Remote server could not be connected"); 
     } catch (NullPointerException e) { 
      e.printStackTrace(); 
      System.out.println("Remote server could not be connected"); 
     } catch (SQLException e) { 
      e.printStackTrace(); 
      System.out.println("Remote db connection establishment error"); 
     } catch (Exception e) { 
      e.printStackTrace(); 
      System.out.println("False query"); 
     } 
    } 
} 

Заранее спасибо за какие-либо указания!

+2

Какое исключение бросает? – CrawlingKid

+1

Вы можете посмотреть этот ответ (http://stackoverflow.com/questions/28264198/connect-to-mysql-databse-from-servlet/28266708#28266708) о том, как правильно использовать JDBC в среде веб-контейнера. Также я должен отметить, что объект соединения не является потокобезопасным и должен быть получен для каждого запроса - другими словами, он не должен быть статичным или у вас будут проблемы с параллелизмом. –

ответ

0

Вы должны позвонить своему основному методу из метода doGet.

защищены недействительная doGet (HttpServletRequest запрос, HttpServletResponse ответ) бросает ServletException, IOException { Главного (нуль); }

Я бы рекомендовал переименовать основной метод доступа к защищенному ничтожной getDataFromDb() {..} Нет необходимости называть его в качестве основного метода, так как вы собираетесь использовать его в качестве сервлета.

0

Рассмотрите этот модифицированный пример, реализующий двухстороннее решение, выполняемое как приложение, так и сервлет.

Заканчивать

  • повторное использование метода запроса с разными целевыми потоками
  • использование примерочных с-ресурс, чтобы закрыть используемые ресурсы
  • не повторное соединение между несколькими потоками

Здесь находится код:

@WebServlet("/jdbc") 
public class jdbc extends HttpServlet { 

    protected static void main(String[] argv) { 
     //If called as application: Output goes to System.out 
     queryTo(System.out); 
    } 

    protected void doGet(HttpServletRequest request, HttpServletResponse response) 
      throws ServletException, IOException { 
     //Set Content-Type 
     response.setContentType("text/plain; charset=UTF-8"); 
     //If called as Servlet: Output into servlet response 
     queryTo(new PrintStream(response.getOutputStream())); 
    } 

    private static void queryTo(PrintStream out) { 
     // Use try-with-resource t o autoclose Connection, PreparedStatement and 
     // ResultSet 
     try (Connection con = connectionQuery(); 
       PreparedStatement statement = con.prepareStatement("SELECT * from Music_Categories"); 
       ResultSet result = statement.executeQuery()) { 

      // Log to out 
      out.println("DataBase table accessed"); 
      while (result.next()) { 
       String retrievedid = result.getString("name"); 
       out.println(retrievedid); 
      } 
     } catch (Exception e) { 
      //Exception to output stream as well 
      e.printStackTrace(out); 
     } 
    } 

    //Don't keep instances of that around but create fresh. 
    //A connection pool might be a good idea 
    protected static Connection connectionQuery() throws Exception { 
     // Don't need to do this since JDBC 4.0 
     // Class.forName("com.mysql.jdbc.Driver"); 
     System.out.println("Remote DB connection established"); 
     return DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/newschemam?useSSL=false", "root", "root"); 
    } 
} 
+0

Привет @Jan, спасибо за ответ. Я попытался использовать это, но он заставляет tomcat не запускаться и бросает много ошибок – jcharnockx