我的request.getParameter(abc)出了什么问题?

时间:2013-09-22 10:44:41

标签: 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>

我收到HTTP 500错误,而Tomcat日志指出遇到request.getParameter部分的行是问题所在。

java.lang.NullPointerException
ProcessReg.processRequest(ProcessReg.java:86)
ProcessReg.doPost(ProcessReg.java:32)
javax.servlet.http.HttpServlet.service(HttpServlet.java:647)
javax.servlet.http.HttpServlet.service(HttpServlet.java:728)

我的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) {
        }
    }

3 个答案:

答案 0 :(得分:0)

问题出在ProcessReg的第86行,您试图在对象上调用方法,但是您对该对象的引用== null,因此NullPointerException

找到该引用,并确定控制流中该点的null是否为错误。如果是错误,请修复此问题。如果它不是错误,请等到您将其设置为指向对象,然后再使用它来调用该对象上的方法。

更新

现在您已经发布了DBConnection的代码,很明显您的代码存在许多问题。我将尝试指出主要的,但作为一个旁边,我认真地建议刷新Java基础here,然后再编写相对复杂的功能,如Servlets等。

ProcessReg

中的问题

您正在呼叫getConnection()并返回con,但尚未初始化con,因此您只需返回null引用。

然后,您尝试将从Connection返回的getConnection()引用转换为Statement类型。这将抛出ClassCastException。相反,您需要在返回的createStatement()对象引用上调用Connection

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对象,并通过调用Connection抓取它包装的getConnection()对象,类似于:

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");

答案 1 :(得分:0)

问题是public static Connection getConnection()方法返回一个空连接,因为你永远不会调用实际加载驱动程序并创建连接对象的createConnection()。在getConnection()课程中返回createConnection()对象之前,您需要先修复con以致电DBConnect

答案 2 :(得分:0)

检查null

if (stmt != null) {
    rs = stmt.executeQuery("SELECT * FROM members");
}

但你的代码看起来很奇怪。

  1. 您调用DBConnect类的静态方法:

    DBConnect.getConnection();
    

    那你为什么要创建这个类的对象?

    DBConnect a = new DBConnect();
    
  2. 为什么将getConnection()方法的返回值设置为Statement类型的变量?

    stmt = (Statement) DBConnect.getConnection();
    
  3. 您将其投放到Statement的目的是什么?仅当您的方法返回Object引用类型时才需要它。如果返回类型是子接口或Statement的任何实现,则无需进行强制转换。并且无法执行ConnectionStatement的投射。

  4. 方法DBConnect.createConnection()不使用参数。他们是硬编码的。

  5. 如果尚未调用方法或发生异常,静态字段con将保持null