Java 什么';我的请求有什么问题吗?
我有一个表格,上面有一个doPost:Java 什么';我的请求有什么问题吗?,java,servlets,Java,Servlets,我有一个表格,上面有一个doPost: <form id="frmData" name="frmData" action="ProcessReg" method="post"> <td>Full Name</td> <td><input type="text" id="stFullName" name="stFullName" value=""></td> 还有我的servlet: publ
<form id="frmData" name="frmData" action="ProcessReg" method="post">
<td>Full Name</td>
<td><input type="text" id="stFullName" name="stFullName" value=""></td>
还有我的servlet:
public class ProcessReg extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
PreparedStatement ps = null;
Connection con = null;
ResultSet rs = null;
Statement stmt = null;
String strName = "";
strName = request.getParameter("stFullName");
try {
DBConnect a = new DBConnect();
stmt = (Statement) DBConnect.getConnection();
rs = stmt.executeQuery("SELECT * FROM members");
我希望有人能告诉我哪里出了问题,因为在它完美运行之前,我真的很迷茫哪里出了错误
完整堆栈跟踪:
SEVERE: Servlet.service() for servlet [ProcessReg] in context with path [/Web1] threw exception
java.lang.NullPointerException
at ProcessReg.processRequest(ProcessReg.java:86)
at ProcessReg.doPost(ProcessReg.java:32)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:647)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
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:502)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1023)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:619)
和我的DBConnect.java:
public class DBConnect {
private static Connection con;
public static void createConnection(String dbUrl,String dbusername,String dbPassword){
try {
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
con = DriverManager.getConnection("jdbc:odbc:practODBC, 231, abc");
} catch (Exception ex) {
}
}
public static Connection getConnection(){
return con;
}
public static void closeConnection(){
if(con!=null){
try {
con.close();
} catch (SQLException ex) {
}
}
问题出在
ProcessReg
的第86行,您试图调用一个对象上的方法,但是您对该对象的引用==null
,因此出现错误
找到该引用,并确定它在控制流中的该点处是否为null
。如果是错误,请修复它。如果它不是一个错误,在使用它调用该对象上的方法之前,请等待将其设置为指向一个对象
更新
现在您已经发布了DBConnection的代码,很明显您的代码存在很多问题。我将尝试指出主要的方面,但作为旁白,我郑重建议在继续编写诸如servlet等相对复杂的功能之前,先复习一下Java基础知识
ProcessReg中的问题
您正在调用getConnection()
并返回con
,但尚未初始化con
,因此您只返回一个null
引用
然后,您正试图将从getConnection()
返回的连接
引用强制转换为语句
类型。这将抛出一个ClassCastException
。相反,您需要对返回的连接
对象引用调用createStatement()
DbConnect
上的所有方法都是静态的(请参见下文-您应该重构它),因此您正在实例化一个毫无意义的DbConnect对象a
,然后显然从未使用过它
DBConnect中的问题
您有一个静态字段con
,以及修改/访问它的静态方法。不要这样做。将con
设为实例变量,并将初始化塞进DBConnect构造函数中-类似如下:
public class DBConnect {
private Connection con;
public DBConnect() {
// setup con
}
public Connection getConnection() {
return con; // con is never null because it's been initialised in constructor
}
...
然后,在ProcessReg
中,实例化一个DBConnect
对象,并通过调用getConnection()
获取它所包装的Connection
对象,类似如下:
PreparedStatement ps = null;
Connection con = null;
ResultSet rs = null;
Statement stmt = null;
String strName = "";
strName = request.getParameter("stFullName");
try {
DBConnect dbConnect = new DBConnect();
con = dbConnect.getConnection();
stmt = con.createStatement();
rs = stmt.executeQuery("SELECT * FROM members");
问题是publicstaticconnection getConnection()
方法返回一个空连接,因为您从未调用createConnection()
它实际加载驱动程序并创建连接对象。在返回DBConnect
类中的con
对象之前,需要修复getConnection()
以调用createConnection()
。检查null
:
if (stmt != null) {
rs = stmt.executeQuery("SELECT * FROM members");
}
但是你的代码看起来很奇怪
调用类DBConnect的静态方法:
DBConnect.getConnection();
那么为什么要创建这个类的对象呢
DBConnect a = new DBConnect();
为什么将getConnection()
方法的返回值设置为语句的变量
类型
stmt = (Statement) DBConnect.getConnection();
您将其转换为语句的目的是什么?只有当您的方法返回对象
引用类型时,才需要它。如果返回类型是subinterface或语句的任何实现,则不需要强制转换。无法执行将连接
转换为语句
方法DBConnect.createConnection()
不使用获取的参数。它们是硬编码的
如果方法未被调用或发生异常,静态字段con
将保持null
行strName=request.getParameter(“stFullName”)中没有错误代码>,在其他地方。发布完整stacktrace。发布完整stacktrace。请发布DBConnect.getConnection()的实现。
。它必须返回null
。我已经添加了DBConnect.java。还是那个问题吗?第86行是rs=stmt.executeQuery(“从成员中选择*);好的,所以stmt
==null,即DBConnect.getConnection()
返回null,这就是您的问题。什么是DBConnect
-这是您自己的类吗?看起来很可能会返回连接
,因此您对语句的转换一旦返回一个不为null的连接
引用就会出错。请使用Connection.createStatement()
取而代之。我添加了DBConnect.java。这仍然是个问题吗?@KarenGoh这里有几个问题,需要比注释更多的空间。请查看我的更新答案:)@davnicwil试图将连接
引用转换为语句
类型将无法编译。
stmt = (Statement) DBConnect.getConnection();