日期:2014-05-20  浏览次数:20778 次

极简单的一个Web应用,Eclipse下能运行,发布到Tomcat下不能用
请教各位:

本菜完全照抄参考书(《开源编程精要15讲》第二章最后一个例子),用JDBC、Servlet和JSP,学着写了个有点MVC色彩的Web应用,其实就是一个网站登录功能啦。

由login.jsp显示表单,用户填写后将数据转交给LoginSevlet(控制器),再转交给LoginHandler类验证,LoginHandler调用DBPool类查询数据库,验证用户名和密码是否正确,并返回查询结果。数据库是用ODBC下的Access,DBPool利用JDBC查询时的一些格式字符串放到了一个db.properties文件中。

在Eclipse下运行时是没问题的,数据库查询和结果显示完全正常。只是当把这个项目发布到Tomcat下的时候,总是出现java.lang.NullPointerException异常,错误指向JDBC中的Connection对象,似乎这个数据库连接并没有正常建立,返回的是个null。这个我在Eclipse下调试的时候也遇到过,就是db.properties文件的路径没放对,放到正确的文件夹里就好了。

db.properties文件的内容:

DBDriver = sun.jdbc.odbc.JdbcOdbcDriver
Connection = jdbc:odbc:login
User =
Password =

怀疑DBPool类有错误:

public class DBPool {
String getPath() {
try {
String sDBDriver = null;
String sConnection = null;
String sUser = null;
String sPassword = null;

Properties p = new Properties();
InputStream is = getClass().getResourceAsStream("/db.properties");
p.load(is);
sDBDriver = p.getProperty("DBDriver", sDBDriver);
sConnection = p.getProperty("Connection", sConnection);
sUser = p.getProperty("User", "");
sPassword = p.getProperty("Password", "");

Properties pr = new Properties();
pr.put("user", sUser);
pr.put("password", sPassword);
pr.put("characterEncoding", "GB2312");
pr.put("userUnicode", "TRUE");

return sDBDriver;
} catch (Exception e) {
// TODO: handle exception
System.out.println(e);
//return "Error!";
}
}

尤其是这一句:InputStream is = getClass().getResourceAsStream("/db.properties"); 是不是因为它的原因,在Tomcat下没能正确加载db.properties文件,导致连接不能建立?不过在网上搜了下,这个用法似乎又是没问题的。

对了,我的Tomcat版本7.0,Eclipse版本3.6.1。还请各位不吝赐教!

------解决方案--------------------
把异常信息贴一下,应该问题不大

祝楼主好运
------解决方案--------------------
LZ 你要学会如何看错误信息,很明显你这里的错误是在chapter2.last.LoginHandler.checkLogin(LoginHandler.java:24) 你仔细看看LoginHandler.java这个类的24行,程序走到这里的时候才出现的空指针异常,你在这里做个断点,查看一下,到底是哪里有问题,无非就是检查一下参数的传递和结果的返回是否正常……
------解决方案--------------------
要么是 db.properties 的路径问题,要么就你的配置出错了,应该检查下你的配置
字符串,选中你写的字符串看看是否有多加的空格之类的。。。
------解决方案--------------------
楼主不要急,仔细看错误,控制异常很容易搞定
------解决方案--------------------
一定是路径问题,InputStream is = getClass().getResourceAsStream("/db.properties");
将db.properties放在web-inf下试试
------解决方案--------------------
在代码里加入一些trace重新编译一下再放到tomcat发布目录里去试试吧,这样应该能帮你定位到底是哪儿出的空指针
------解决方案--------------------
路径问题的话可以试试用
getClass().getClassLoader().getResourceAsStream("db.properties");
然后把db.properties放到classes下面
------解决方案--------------------
web 里使用 Thread.currentThread().getContextClassLoader().getResourceAsStream