在Java web app servlet中使用MySQL类
这是我第一次尝试使用servlet(以及Java本身)开发Java web应用程序。我正在尝试创建一个MySQL类,该类将处理查询、连接等,无论出于何种原因。我可以获得连接,但一旦我尝试执行一个查询,它就会给出一个在Java web app servlet中使用MySQL类,java,mysql,web-applications,Java,Mysql,Web Applications,这是我第一次尝试使用servlet(以及Java本身)开发Java web应用程序。我正在尝试创建一个MySQL类,该类将处理查询、连接等,无论出于何种原因。我可以获得连接,但一旦我尝试执行一个查询,它就会给出一个 java.lang.NullPointerException 我很确定我犯了一些新手的错误。但我不清楚它是什么 下面是SQL类 package coreservlets; import java.sql.Connection; import java.sql.DriverManag
java.lang.NullPointerException
我很确定我犯了一些新手的错误。但我不清楚它是什么
下面是SQL类
package coreservlets;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
//import com.mysql.jdbc.*;
public class DBInterface {
private static Connection conn;
private Statement statement;
public static Connection Conn() throws SQLException, ClassNotFoundException {
String url = "jdbc:mysql://localhost:3306/cmwebapp";
String user = "user";
String pw = "password";
try{
//Class.forName("com.mysql.jdbc.Driver").newInstance();
Class.forName("com.mysql.jdbc.Driver");
conn = (Connection) DriverManager.getConnection(url, user, pw);
//System.out.println(conn.getAutoCommit());
} catch (SQLException e) {
System.out.println("MySQL Connection failed.");
e.printStackTrace();
}
return conn;
}
public ResultSet Query(String query){
try{
statement = (Statement) conn.createStatement();
ResultSet rs = statement.executeQuery(query);
System.out.println(rs);
return rs;
}catch(Exception e){
System.out.println("TestServlet.java SQL connection failed.");
e.printStackTrace();
return null;
}
}
}
我想把它叫进来的班级
package internalLogic;
import coreservlets.*;
import java.io.*;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class TheWork {
private DBInterface conn;
private String param;
private ResultSet set;
public TheWork(String p){
try {
conn = (DBInterface) DBInterface.Conn();
param = "SELECT * FROM test WHERE index =" + p ;
} catch(Exception e) {
System.out.println("In TheWork ctor SQL connection or variable assignment failed.");
e.printStackTrace();
}
}
public String Execute(){
set = conn.Query(param);
System.out.println(set);
Object s = null;
String ret = "";
try{
while (set.next()) {
// Make container class for SQL result sets.
if(s instanceof String){
s = set.getObject("index");
}
if (s instanceof Integer){
s = String.valueOf(s);
}
ret += s + ", ";
}
return ret;
}catch(Exception e){
System.out.println("In TheWork Execute SQL connection or variable assignment failed.");
e.printStackTrace();
return null;
}
}
}
谢谢所有想帮我的人
Oct 29, 2013 9:51:03 AM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet [Test] in context with path [/test-app] threw exception
java.lang.NullPointerException
at internalLogic.TheWork.Execute(TheWork.java:26)
at testPackage.TestServlet.doGet(TestServlet.java:32)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:929)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1002)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:585)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
在Execute()
方法中,实例conn
可能是null
。
我认为在你的课程中:
private DBInterface conn;
应该是
private Connection conn;
在构造函数中
conn = (DBInterface) DBInterface.Conn();
应该是简单的
conn = DBInterface.Conn();
更新:(建议的上述更正无效)
在你最后的评论之后,我意识到发生了什么;真正的问题是需要从Conn()
方法返回DBInterface
的实例。
如果您使用原始代码,只更改方法Conn()
public static DBInterface Conn() throws SQLException, ClassNotFoundException {
String url = "jdbc:mysql://localhost:3306/cmwebapp";
String user = "user";
String pw = "password";
DBInterface dbInterface = new DBInterface();
try {
Class.forName("com.mysql.jdbc.Driver");
dbInterface.conn = (Connection) DriverManager.getConnection(url, user, pw);
} catch (SQLException e) {
System.out.println("MySQL Connection failed.");
e.printStackTrace();
}
return dbInterface;
}
异常发生在哪里?发布完整的堆栈跟踪。您的NPE发生在哪里?只是旁注:这部分:“从测试中选择*,其中index=“+p代码>真的很糟糕。它使您的代码在SLQ注入攻击中易受攻击。改用准备好的语句。另外,在CRUD操作完成后关闭连接。我在中添加了堆栈跟踪。我知道这对于SQL注入来说是非常糟糕的做法,但我只是想让查询工作起来,因为我只是在学习这些东西。为了避免我们计算第26行是什么?我曾经这样做过。如果我这样做,当我在工作中调用conn.Query(param)时。我得到一个错误,说我应该将它转换为DBInterface。这会删除错误,但当我运行应用程序时,我会收到以下错误:java.lang.ClassCastException:com.mysql.jdbc.JDBC4Connection无法强制转换为CoreServlet。DBInterface@scallopboat我已经更新了我的答案,希望这能解决你的问题!很抱歉打勾了。谢谢你的帮助!