2013-02-21 73 views
0

我寫了一個servlet文件SignUp.java和幫助程序文件Updater.java。 SignUp從用戶填寫的表單收集用戶信息。然後它將信息發送到更新程序,以便更新程序使用信息更新數據庫中的表。但是當我填寫表單並點擊提交時,沒有任何變化。奇怪的是,當我編寫一個測試文件並使用它爲Updater提供一些虛擬值時,該表就被這些虛擬值更新了。 -
SignUp.java
無法通過servlets更新mysql數據庫

package com.onlineshopping.web; 

import com.onlineshopping.model.*; 
import java.util.*; 
import javax.servlet.*; 
import javax.servlet.http.*; 
public class SignUp extends HttpServlet 
{ 
public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException 
{ 
    String[] month = {"Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"}; 

    InfoHolder userInfo = new InfoHolder(); 
    userInfo.name = req.getParameter("name"); 
    userInfo.email = req.getParameter("email"); 
    userInfo.date = Integer.parseInt(req.getParameter("date")); 
    userInfo.month = Arrays.asList(month).indexOf(req.getParameter("month")) + 1; 
    userInfo.year = Integer.parseInt(req.getParameter("year")); 
    userInfo.pwd = req.getParameter("pwd"); 
    userInfo.subscribe = "n"; 
    try 
    { 
     userInfo.subscribe = req.getParameter("subscribe"); 
    } 
    catch(Exception e) 
    {} 

    Updater u = new Updater(); 
    u.update(userInfo); 
} 
} 

InfoHolder剛剛保存的信息。

Updater.java

package com.onlineshopping.model; 

import java.io.*; 
import java.sql.*; 
import java.util.*; 
public class Updater 
{ 
private static final String DRIVER = "com.mysql.jdbc.Driver"; 

private static final String CONNECTION = "jdbc:mysql://localhost/onlineshopping"; 

public void update(InfoHolder userInfo) 
{ 

    try 
    { 
     Class.forName(DRIVER); 

     Properties p = new Properties(); 
     p.put("user","****"); 
     p.put("password","****"); 

     Connection c = DriverManager.getConnection(CONNECTION,p); 

     Statement s = c.createStatement(); 

     ResultSet rs = s.executeQuery("SELECT MAX(userid)+1 FROM user_info"); 
     rs.next(); 
     int id = rs.getInt(1); 

     PreparedStatement ps = c.prepareStatement("INSERT INTO user_info VALUES (?,?,?,?,?,?,?)"); 
     ps.setInt(1,id); 
     ps.setString(2,userInfo.name); 
     ps.setString(3,userInfo.email); 
     ps.setInt(4,userInfo.date); 
     ps.setInt(5,userInfo.month); 
     ps.setInt(6,userInfo.year); 
     ps.setString(7,userInfo.subscribe); 
     ps.executeUpdate(); 

     c.close(); 
    } 

    catch(Exception e) 
    { 
     try 
     { 
      PrintWriter out = new PrintWriter(new FileWriter("err", true)); 
      out.println("Error: "+ e); 
      out.close(); 
     } 
     catch(IOException e) 
     {} 
    } 
} 
} 


test.java

import com.onlineshopping.model.*; 

public class test 
{ 

public static void main(String[] args) 
{ 
    Updater u = new Updater(); 

    InfoHolder xyz = new InfoHolder(); 
    xyz.name = "check"; 
    xyz.email = "checkmail"; 
    xyz.date = 1; 
    xyz.month = 1; 
    xyz.year = 2; 
    xyz.pwd = "pw"; 
    xyz.subscribe = "n"; 

    u.update(xyz); 
} 
} 

Updater類文件不斷拋出 - 拋出java.lang.ClassNotFoundException:com.mysql.jdbc.Driver 。但是,當我從終端運行測試類文件相同的Updater類運行平穩。

有沒有跟我CLASSPATH變量一個問題:
它具有這樣的價值 - :在/ usr/share/java目錄/的mysql.jar:/usr/share/java/mysql-connector-java-5.1。 16.jar:/usr/lib/tomcat6/lib/servlet-api.jar:類。
請幫忙。

+0

應用程序的前端是一些JSP/JSF嗎?您是否將應用程序創建爲Java EE應用程序或Java SE應用程序?:)因爲您的測試類的工作原理和servlet的事實並不符合您在使用測試類查詢數據庫時使用Java SE的事實。 – Reshi 2013-02-21 08:31:42

+0

您應該通過JNDI數據源使用連接池,而不是將連接參數硬連線到模型中。 – 2013-02-21 08:54:34

+0

@Reshi我不確定它是Java SE還是EE。我所做的只是編寫這些文件,編譯它們並使用tomcat6運行它們。從理論上講,如果測試文件可以在沒有問題的情況下運行updater文件,那麼容器tomcat6也應該可以。無論如何,你能告訴我應該如何糾正這個問題嗎? – 2013-02-21 09:56:40

回答

0

嘗試將mysql-connector-java-5.1.16.jar複製到/ usr/lib/tomcat6/lib/

+0

是的,你的答案是有效的。我想問題是,tomcat不會查看CLASSPATH變量(因爲我的類路徑變量確實提到了Driver包的路徑)來查找所有的源。它所做的就是在自己的庫中查找所需的類。但是如果你能告訴我如何讓tomcat查看classpath變量並從那裏找到軟件包,那就更好了。 – 2013-02-21 10:20:32

+0

我從來沒有需要做這樣的事情,所以我不能即時回答。嘗試查看Tomcat文檔:http://tomcat.apache.org/tomcat-7.0-doc/class-loader-howto.html – Damiano 2013-02-25 10:52:57