我正在开发一个使用jdbc驱动程序访问PostgreSQL的项目,并通过中间件处理这些数据,最后通过jsp页面显示/更新。使用Eclipse我创建了一个动态Web项目。然后我为所有后端和中间件操作编写了代码。我可以从静态上下文访问数据库(我的意思是java源代码的主要方法)。如果我不调用任何访问数据库的方法,我也可以使用jsp中的java资源(例如显示)。但是当我尝试访问数据库时,它不起作用并且给我一个空指针异常。
<jsp:useBean id="user" class="dbActionManagement.UserData" scope="session"/>
<jsp:setProperty name="user" property="*"/>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>next page</title>
</head>
<body>
You entered<BR>
Name: <%= user.getUsername() %><BR>
Email: <%= user.getEmail() %><BR>
Age: <%= user.getAge() %><BR>
</body>
</html>
这给了我:
SEVERE:servlet [jsp]的Servlet.service()与路径的上下文 [/ GNYSweb]用root引发了异常[java.lang.NullPointerException] 导致java.lang.NullPointerException dbActionManagement.OfficerManager.getTotalPoint(OfficerManager.java:494) 在dbActionManagement.UserData.getUsername(UserData.java:28)at org.apache.jsp.NextPage_jsp._jspService(NextPage_jsp.java:80)at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)at at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:419) 在 org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:391) 在org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334) 在javax.servlet.http.HttpServlet.service(HttpServlet.java:722)at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 在 org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240) 在 org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:164) 在 org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:462) 在 org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164) 在 org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100) 在 org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:562) 在 org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 在 org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:395) 在 org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:250) 在 org.apache.coyote.http11.Http11Protocol $ Http11ConnectionHandler.process(Http11Protocol.java:188) 在 org.apache.tomcat.util.net.JIoEndpoint $ SocketProcessor.run(JIoEndpoint.java:302) 在java.util.concurrent.ThreadPoolExecutor $ Worker.runTask(未知 来自java.util.concurrent.ThreadPoolExecutor $ Worker.run(未知 来自java.lang.Thread.run(未知来源)
我正在使用的java类是UserData和方法getUserName()
public String getUsername() {
int a = new OfficerManager().getTotalPoint("a");
return new Integer(a).toString();
}
OfficerManager有一个默认构造函数,getTotalPoint是
public int getTotalPoint(String officerId){
int point = 0;
ResultSet results = null;
try {
if(DBConnection.db.isClosed()){ // problem is caused by this line
DBConnection.connect();
}
Statement sql = DBConnection.db.createStatement();
String sqlText = "select point from officers ";
sqlText += " where sicilno = '" + officerId + "'";
results = sql.executeQuery(sqlText);
} catch (SQLException e) {
e.printStackTrace();
}
if(results != null)
try {
while(results.next()){
point = (int) results.getDouble("point");
}
} catch (SQLException e) {
e.printStackTrace();
}
return point;
}
我已将postgreSQL jdbc驱动程序添加到我的构建路径中。我还在Tomcat的lib文件夹中包含了相同的jdbc驱动程序。此外,我在localhost使用Tomcat v7.0的实例,其位置是[工作区元数据]
答案 0 :(得分:1)
我理解这个问题,它基本上是我试图达到null的Connection对象。我使用静态对象访问数据库,我忘了在使用之前初始化它们。有几个解决方案,最基本的是在UserData类中编写另一个方法,名为startConnection()
public void startConnection(){
new DBConnection("myDBName", "myUserName", "myPassword");
}
并从jsp页面调用此方法
...
<body>
<% user.startConnection(); %>
Name: <%= user.getUsername() %><BR>
</body>
...
这样我可以在使用之前正确初始化我的DBConnection类实例。谢谢你的帮助。
答案 1 :(得分:0)
在创建连接之前,请避免检查数据库是否已关闭,注释掉:
//if(DBConnection.db.isClosed()){ // problem is caused by this line
DBConnection.connect();
// }
然后在使用它之后以及发生异常时关闭连接。您的例外块应更改为;
catch (SQLException e)
{
e.printStackTrace();
if((DBConnection !=null) && DBConnection.db !=null && !DBConnection.db.isClosed())
{
BConnection.db.close();
}
}
并在使用后直接在try块中关闭它。
根据经验 - 在尝试关闭连接之前,请检查连接是否为空。 尝试做这样的事情:
if((DBConnection !=null) && DBConnection.db !=null && DBConnection.db.isClosed())
{
DBConnection.connect();
}