2013-09-23 3 views
1

Я действительно новичок в концепциях сервлетов. просто искал некоторые теории, учился, и теперь я хочу практического опыта. все, что я хочу сделать, это создать сервлет, который может получить доступ к базе данных mysql. простую страницу JSP, которая принимает «имя» и «отметки», а затем попадает в сервлет, который в свою очередь обращается к базе данных и вводит имя и метки в базу данных.с использованием JDBC в сервлетах

Я создал базу данных и страницу JSP. Я тоже создал сервлет. У меня есть соединитель mysql в моей библиотеке, и я имею в виду его с концепцией Class.forname(). но когда я запускаю это на своем сервере (Tomcat v6.0), он дает исключение класса, не найденное для «com.mysql.jdbc.Driver». Но когда я запускаю эту часть mysql в другом проекте, который не является сервлетом (его просто простой Java-проект), он выполняется правильно и база данных также обновляется.

проблема только в том случае, если я использую этот фрагмент кода на сервере с сервлетом. я попробовал googling, и он сказал, что должен включить соединитель mysql в WEB-INF/lib из tomcat. Но я не мог найти этот путь. любые советы по этому поводу окажутся полезными для меня. заранее спасибо. :) это мой MySQL часть кода, защищен недействительным doGet (HttpServletRequest запрос, HttpServletResponse ответ) бросает ServletException, IOException {

PrintWriter out = response.getWriter(); 
    String name = request.getParameter("name"); 

    int marks = Integer.parseInt(request.getParameter("marks")); 

    try { 
     System.out.println("0"); 
     Class.forName("com.mysql.jdbc.Driver"); 

     Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/testdb123","root","root"); 

     String qr= "INSERT INTO stuinfo " + 
        "VALUES ('"+name+"',10)"; 
     System.out.println(qr); 

     System.out.println("1"); 
     Statement stmt = conn.createStatement(); 
     System.out.println("2"); 
     stmt.executeUpdate(qr); 
     System.out.println("3"); 

    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

} 

ответ

0

Servlet контейнеров, как Tomcat запустить WAR (веб-архив) файлы или папки. Стандартная структура папок в WAR является:

(ROOT) 
| 
+- (content files and folders) 
| 
+- META-INF (optional) 
| | 
| +- MANIFEST.MF (standard Java manifest file, optional) 
| | 
| +- (other files and folders, optional) 
| 
+- WEB-INF (Tomcat considers it optional for ease of use) 
    | 
    +- web.xml (the deployment descriptor) 
    | 
    +- classes (folder that contains all the classes for this web application) 
    | 
    +- lib (contains all library JARs for this application THIS IS WHAT YOU WANT) 
    | 
    +- (other files and folders, optional) 

Материала в WEB-INF/classes и баночках в WEB-INF/lib автоматически включаются в пути к классам приложения.

В папке с приложением вы должны создать папку WEB-INF, внутри которой находится папка lib и поместить туда mysql-connector-XXX.jar. Это решит проблему classpath. Контейнер сервлета автоматически не создает структуру папок.

ALTERNATIVELY, вы можете скопировать драйвер mysql-connector-XXX.jar в папку lib Tomcat. Это сделает его доступным для всех приложений.


Сказав, что, пожалуйста, рассмотреть следующие, а также:

  1. Всегда тесные связи в финальном блоке:

    Connection conn = null; 
    try { 
        ... 
        conn = // get it somehow 
    } 
    catch(/* any exception you can handle, throw or let go of the rest */) { 
        ... 
    } 
    finally { 
        // close other JDBC resources (e.g. Statements, ResultSets etc) in a similar way 
        if(conn != null) { 
         try { conn.close(); } 
         catch(Exception(ignore) {} 
        } 
    } 
    
  2. Использование DriverManager.getConnection все время будет больно производительности в реальная жизнь. После того, как вы почувствуете уверенность в себе об основах, взгляните на пул соединений и на javax.sql.DataSource. Позже, а не сейчас!

+0

большое спасибо Nikos !!!!! это сработало!!! вы сказали, что как только я буду уверен в этом, я должен взглянуть на javax.sql.DataSource для некоторого эффективного метода доступа к базе данных. могу я, пожалуйста, знать, что все я должен знать, чтобы заставить себя сделать следующий шаг? На данный момент у меня есть простая страница jsp с двумя полями - именем и метками. Отсюда, когда пользователь вводит данные, я попадаю в сервлет, который вводит эти данные в БД. теперь я пытаюсь использовать различные ограничения для структуры таблиц, таких как первичный ключ и т. д., действительно будет полезно, если мне повезет получить от вас некоторые рекомендации. –

+0

Вам следует следовать [этому примеру] (http://tomcat.apache.org/tomcat-6.0-doc/jndi-datasource-examples-howto.html). Затем вместо использования 'DriverManager.getConnection' используйте код из [this] (http://wiki.apache.org/tomcat/UsingDataSources) (материал InitialContext). Короче говоря, «DataSource» - это пул соединений. Поскольку получение соединений с БД происходит медленно, это позволяет получить несколько соединений и использовать их, сохраняя время для повторного подключения. –

+0

«В папке вашего приложения вы должны создать папку WEB-INF, внутри нее папку lib и поместить туда mysql-connector-XXX.jar. Это позволит решить проблемы с классом. Контейнер сервлета не создает автоматически папку структура. "- nikos, этот метод не работает, на самом деле я не могу добавить этот соединитель mysql в папку в моем проекте, почему это так? –