2014-01-28 4 views
0

Мой проект содержит 4 класса. У меня нет идеи, почему она не работает.JSP + JDBC issue

класс ConnectionManager:

import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.SQLException; 

public class ConnectionManager { 

private static ConnectionManager instance = null; 

private final String USERNAME = "root"; 
private final String PASSWORD = ""; 
private final String CONN_STRING ="jdbc:mysql://localhost:3306/jdbc"; 

private Connection conn = null; 

private ConnectionManager(){ 

} 

public static ConnectionManager getInstance(){ 
    if(instance==null){ 
     instance = new ConnectionManager(); 
    } 
    return instance; 
} 

private boolean openConnection(){ 
    try { 
     conn = DriverManager.getConnection(CONN_STRING, USERNAME, PASSWORD); 
    } catch (SQLException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    return true; 
} 

public Connection getConnection(){ 
    if(conn==null){ 
     if(openConnection()){ 
      System.out.println("Connection Opened"); 
      return conn; 
     } 
     else 
      return null; 
    } 
    return conn; 
} 

public void close(){ 
    System.out.println("Closing Connection"); 
    try { 
     conn.close(); 
    } catch (SQLException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    conn=null; 
} 
} 

DBManager класс:

import java.sql.Connection; 
import java.sql.PreparedStatement; 
import java.sql.SQLException; 

public class DbManager { 

private static Connection conn = ConnectionManager.getInstance().getConnection(); 

public static void Insert(GetsSets set) throws ClassNotFoundException, SQLException{ 
    Class.forName("com.mysql.jdbc.Driver"); 

    String sql = "INSERT INTO register (fname,lname,gender,state,email,password,age,address,skill) VALUES (?,?,?,?,?,?,?,?,?)"; 

    PreparedStatement pstmt = conn.prepareStatement(sql); 
    pstmt.setString(1, set.getFname()); 
    pstmt.setString(2, set.getLname()); 
    pstmt.setString(3, set.getGender()); 
    pstmt.setString(4, set.getState()); 
    pstmt.setString(5, set.getEmail()); 
    pstmt.setString(6, set.getPassword()); 
    pstmt.setString(7, set.getAge()); 
    pstmt.setString(8, set.getAddress()); 
    pstmt.setString(9, set.getSkill()); 
    pstmt.executeUpdate(); 

    ConnectionManager.getInstance().close(); 
} 
} 

GetSets класс:

public class GetsSets { 

private String fname; 
private String lname; 
private String gender; 
private String email; 
private String state; 
private String password; 
private String age; 
private String address; 
private String skill; 
private int id; 


public String getFname() { 
    return fname; 
} 
public void setFname(String fname) { 
    this.fname = fname; 
} 
public String getLname() { 
    return lname; 
} 
public void setLname(String lname) { 
    this.lname = lname; 
} 
public String getGender() { 
    return gender; 
} 
public void setGender(String gender) { 
    this.gender = gender; 
} 
public String getEmail() { 
    return email; 
} 
public void setEmail(String email) { 
    this.email = email; 
} 
public String getState() { 
    return state; 
} 
public void setState(String state) { 
    this.state = state; 
} 
public String getPassword() { 
    return password; 
} 
public void setPassword(String password) { 
    this.password = password; 
} 
public String getAge() { 
    return age; 
} 
public void setAge(String age) { 
    this.age = age; 
} 
public String getAddress() { 
    return address; 
} 
public void setAddress(String address) { 
    this.address = address; 
} 
public String getSkill() { 
    return skill; 
} 
public void setSkill(String skill) { 
    this.skill = skill; 
} 
public int getId() { 
    return id; 
} 
public void setId(int id) { 
    this.id = id; 
}} 

и сервлет:

import java.io.IOException; 
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; 

@WebServlet("/RegServlet") 
public class RegServlet extends HttpServlet { 
private static final long serialVersionUID = 1L; 

StringBuilder csvSkills = new StringBuilder(); 

public RegServlet() { 
    super(); 
    // TODO Auto-generated constructor stub 
} 

/** 
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse 
*  response) 
*/ 
protected void doGet(HttpServletRequest request, 
     HttpServletResponse response) throws ServletException, IOException { 
    // TODO Auto-generated method stub 
} 

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

    String fname = request.getParameter("txtFName"); 
    String lname = request.getParameter("txtLName"); 
    String gender = request.getParameter("rdoGender"); 
    String email = request.getParameter("txtEmail"); 
    String password = request.getParameter("txtPassword"); 
    String state = request.getParameter("cboStates"); 
    String age = request.getParameter("cboAge"); 
    String address = request.getParameter("txtAddress"); 
    String skill[] = request.getParameterValues("chkSkills"); 

    for (String skills : skill) { 
     if (csvSkills.length() > 0) { 
      csvSkills.append(","); 
      csvSkills.append(skills); 
     } 
     String csvSkill = csvSkills.toString(); 

     GetsSets sets = new GetsSets(); 

     sets.setFname(fname); 
     sets.setLname(lname); 
     sets.setGender(gender); 
     sets.setEmail(email); 
     sets.setPassword(password); 
     sets.setState(state); 
     sets.setAge(age); 
     sets.setAddress(address); 
     sets.setSkill(csvSkill); 

     try { 
      DbManager.Insert(sets); 
     } catch (ClassNotFoundException | SQLException e) { 
      System.out.println("blad w RegServlet"); 
      e.printStackTrace(); 
     } 
    } 

} 

} 

Я получаю следующее сообщение об ошибке:

INFO: запуск сервера в 1171 мс java.sql.SQLException: Нет подходящей водитель найдено для JDBC: MySQL: // локальный: 3306/JDBC
в java.sql.DriverManager.getConnection (Unknown Source)
в java.sql.DriverManager.getConnection (Unknown Source)

(...)

на java.lang.Thread.run (Unknown Source)

Подключение Открытый

java.lang.ClassNotFoundException: com.mysql.jdbc.Driver
в org.apache .catalina.loader.WebappClassLoader.loadClass (WebappClassLoader.java:

на org.apache.catalina.loader.WebappClassLoader.loadClass (WebappClassLoader.java:1547)

на java.lang.Class.forName0 (Native Method)

Я также создал другой класс в рамках одного проекта, простой JDBC + тот же Databse и она прекрасно работает (без JSP и сервлетов). - доказывает, что разъем mysql реализован в библиотеке правильно. я прав?. Также этот класс читает таблицу из localhost. Я не знаю, что случилось. Я хотел подключить сервлет с БД.

мой проект в затмении: http://i.imgur.com/D4o3EU6.jpg

+1

Очевидно, что драйвер JDBC отсутствует. Вам нужно добавить библиотеку JDBC MySQL в путь к классу проекта. Получите это отсюда: http://dev.mysql.com/downloads/connector/j – qqilihq

+0

Добавлен драйвер JDBC. проверьте скриншот, пожалуйста. Или, может быть, его добавили неправильно? – user3160441

+0

Решил ли мой вопрос вашу проблему? – Mani

ответ

1

Вы должны добавить драйвер .jar файл в классе пути или вы можете непосредственно вставить файл в папку WEB_INF/lib.

+0

Драйвер JDBC добавлен. Проверьте скриншот, пожалуйста, или, может быть, его добавленный неверный? – user3160441

1

java.lang.ClassNotFoundException: com.mysql.jdbc.Driver четко заявляет, что класс com.mysql.jdbc.Driver не может быть найден. Этот класс находится в контейнере драйвера, предоставленном моим Mysql. Просто загрузите его из Интернета (если у вас его еще нет) и добавьте его в сервер приложений lib или web inf lib.

+0

Добавлен драйвер JDBC. Проверьте скриншот, пожалуйста. Или, может быть, его добавленный неверный? – user3160441

+0

@ user3160441, какой сервер приложений вы используете? вы открываете WAR или EAR и проверяете, доступна ли банку внутри? – user1339772

+0

Я использую Tomcat. Когда я экспортирую в WAR, а затем извлекаю файл войны, у меня нет библиотеки внутри ... вот экспорт http: // www. sendpace.com/file/ack3iz – user3160441

0

Согласно его снимку экрана, я думаю, что он уже добавляет банку.

0

Добавить Class.forName в статическом блоке в ConnectionManager как этот

static { 
    try { 
     Class.forName("com.mysql.jdbc.Driver"); 
    } catch (ClassNotFoundException e) { 
     e.printStackTrace(); // remove this and add appropriate log 
    } 
} 

И Удалите Class.forName от метода вставки (вы не требуется). Вы должны зарегистрировать класс перед DriverManager искать связи (OpenConnection())

Сохраняя соединение как статические не является хорошей практикой


private static Connection conn = ConnectionManager.getInstance().getConnection(); 

удалить это и двигаться, чтобы вставить метод как это.

public static void Insert(GetsSets set) throws ClassNotFoundException, SQLException{ 
Class.forName("com.mysql.jdbc.Driver"); 
Connection conn = null; 

try { 
     conn = ConnectionManager.getInstance().getConnection(); 
String sql = "INSERT INTO register (fname,lname,gender,state,email,password,age,address,skill) VALUES (?,?,?,?,?,?,?,?,?)"; 

PreparedStatement pstmt = conn.prepareStatement(sql); 
pstmt.setString(1, set.getFname()); 
pstmt.setString(2, set.getLname()); 
pstmt.setString(3, set.getGender()); 
pstmt.setString(4, set.getState()); 
pstmt.setString(5, set.getEmail()); 
pstmt.setString(6, set.getPassword()); 
pstmt.setString(7, set.getAge()); 
pstmt.setString(8, set.getAddress()); 
pstmt.setString(9, set.getSkill()); 
pstmt.executeUpdate(); 
} catch (Exceptione) { 
e.printStackTrace(); 
}finally{ 
    ConnectionManager.getInstance().close(); // if possible pass the connection instance to close in DbManager 
    } 

} 
+0

Вы добавили Class.forName в статический блок? или Измените способ вставки, как указано, он должен работать. если openconnection (переменная init происходит до статического блока, она не работает). – Mani

+0

Большое спасибо за большой ответ. Я следил за вашими шагами, кроме второй строки (не добавил Class.forName ....) мой результат: Ошибка на странице: HTTP Status 500 - и журналы: – user3160441

+0

журналы: java.lang.ClassNotFoundException: com.mysql.jdbc.Driver (...) java.sql.SQLException: Нет подходящего драйвера найдено JDBC: MySQL: // локальный: 3306/JDBC (...) java.lang.NullPointerException \t в (DbManager.java:21) \t в (R egServlet.java:69) (...) java.lang.NullPointerException \t в ConnectionManager.close (ConnectionManager.java:64) \t в DbManager.Insert (DbManager.java:35) (...) \t в java.lang.Thread.run (Неизвестный источник) Открытое соединение Заключительное соединение – user3160441

1

Вы должны поместить файл банку в WEB_INF/lib/ папку (просто скопировать вставить банку в эту папку), а затем использовать встроенные пути. После этого вы можете увидеть свою добавленную банку в web app libraries под номером Libraries раздел, который я сейчас не вижу на вашем скриншоте :)