请帮助我,我是servlet的新手 我尝试初始化init方法的值并在之后使用它们 但我得到了nullpointerexception 这是我的classe Hello它包含2个方法init()和jdbcinfo() 我需要一次获得数据库连接
package com.Ws;
//imports..
public class Hello extends HttpServlet {
public static Connection con;
@Override
public void init() throws ServletException
{
try {
Class.forName("net.sourceforge.jtds.jdbc.Driver");
con =DriverManager.getConnection("jdbc:jtds:sqlserver://localhost:6543/Dbname","user","");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("--printStackTrace--"+e);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("--printStackTrace2--"+e);
}
}
}
//I get nullpointerexception here con = null
public String jdbcInfo(String req) {
PreparedStatement statementT;
try {
connection =con;
PreparedStatement statement = connection.prepareStatement(req);
ResultSet result = statement.executeQuery();
while (result.next()) {
///
}
}
catch (Exception e) {
e.printStackTrace();
System.out.println("exception: Serveur base de donnée indosponnible");
}
if (res == "1")
return res;
else
return "false";
}
}
我的web.xml
<servlet>
<servlet-name>Hello</servlet-name>
<servlet-class>com.Ws.Hello</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
答案 0 :(得分:0)
@ geert3是正确的。您不希望创建连接并将其保存在servlet的init()
方法的字段中。 Servlet是单个数据库可以处理来自多个线程的请求,因此所有字段都应该引用深度不可变且线程安全的对象。 Connection
个对象是不存在的。
相反,您应该使用database connection pool。不要构建自己的连接池代码;那里有many choices out。如果在应用程序服务器中运行代码,则应用程序服务器可能具有内置数据库池支持。
至于代码的特殊问题,解决问题的最佳方法是查看打印的堆栈跟踪。
答案 1 :(得分:0)
//我在这里得到nullpointerexception con = null
如果类连接con
的实例变量未初始化,则它可以为null。现在怎么可能这样:
在这一行
Class.forName("net.sourceforge.jtds.jdbc.Driver");
如果您的类路径中没有jar文件,则此行将抛出ClassNotFoundException
,在这种情况下,它会在不执行此行的情况下从try块中出现
con =DriverManager.getConnection("jdbc:jtds:sqlserver://localhost:6543/Dbname","user","");
在这种情况下,您的con
将为空
因此,只需检查jar文件是否实际存在于类路径中