2013-03-24 83 views
0

每当我尝试从我的servlet中的ajax参数读取时,我总是收到空指针异常。 继承人的Ajax代码:servlet ajax nullpointerexception

<%@page contentType="text/html" pageEncoding="UTF-8"%> 
<%@page import="java.sql.*;" %> 
<!DOCTYPE html> 
<html> 
<head> 
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
    <script> 
     function findNext(id,label){ 
      alert(id); 
      alert(label); 
      var xmlhttp=new XMLHttpRequest(); 
      xmlhttp.onreadystatechange=function(){ 
       if(xmlhttp.readyState===4 && xmlhttp.status===200) 
        { 
         var ret=xmlhttp.responseText; 
         var prob=ret.substring(0,ret.indexOf("///")); 
         var pdesc=ret.substring(3); 
         document.getElementById("prob").innerHTML=prob; 
         document.getElementById("pdesc").innerHTML=pdesc;        
        }       
      }; 
      xmlhttp.open("POST","Servlet1",true); 
      var sendstr="pid="+id+"&labelid="+label; 
      xmlhttp.send(sendstr); 
     } 
    </script> 
</head> 
<body> 
    <% 
     Connection con; 
     Statement s; 
     ResultSet rs; 
     String sql,pid=null,prob=null,pdesc=null,yesL=null,noL=null; 


     try{ 
      Class.forName("com.mysql.jdbc.Driver"); 
      con=DriverManager.getConnection("jdbc:mysql://localhost:3306/cdt", "root", ".hack%//sign66"); 
      s=con.createStatement(); 

      sql="select * from cdt.problem where pid='1.01'"; 
      rs=s.executeQuery(sql); 
      rs.next(); 

      pid=rs.getObject("pid").toString(); 
      prob=rs.getObject("problm").toString(); 
      pdesc=rs.getObject("pdesc").toString(); 
      yesL=rs.getObject("yesL").toString(); 
      noL=rs.getObject("noL").toString(); 

     } 
     catch(Exception e){ 
      e.printStackTrace(); 
     } 
    %> 

    <!--STYLE THESE 2 <P> STATEMENTS--> 
    <p id="prob"><%=prob%></p> 
    <p id="pdesc"><%=pdesc%></p> 
    <form> 
      <input type="button" value="Yes" onclick="findNext(<%=pid%>,<%=yesL%>);"/> 
      <input type="button" value="No" onclick="findNext(<%=pid%>,<%=noL%>);"/> 
    </form> 
</body> 
</html> 

,我传递给函数的变量通过警报阅读罚款。

继承人servlet代码:

package cdt1; 

import cdt.FindNextLabelLocal; 
import java.io.IOException; 
import java.io.PrintWriter; 
import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.ResultSet; 
import java.sql.Statement; 
import javax.servlet.ServletConfig; 
import javax.servlet.ServletException; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
import javax.ejb.EJB; 

public class Servlet1 extends HttpServlet { 

Connection con; 
Statement s; 
ResultSet rs;  
@EJB private FindNextLabelLocal obj; 

@Override 
public void init(ServletConfig config) throws ServletException{ 
    try{ 
     Class.forName("com.mysql.jdbc.Driver"); 
     con=DriverManager.getConnection("jdbc:mysql://localhost:3306/cdt", "root", ".hack%//sign66"); 
     s=con.createStatement(); 

    } 
    catch(Exception e){ 
     e.printStackTrace(); 
    }    
} 

@SuppressWarnings("UnusedAssignment") 
protected void processRequest(HttpServletRequest request, HttpServletResponse response) 
     throws ServletException, IOException { 
    response.setContentType("text/html;charset=UTF-8"); 
    PrintWriter out = response.getWriter(); 
    try { 
     String pid,label,res; 
     @SuppressWarnings("UnusedAssignment") 
     float current,next; 

     current=next = 0; 
     pid=request.getParameter("pid").toString(); // pid of the question 
     label=request.getParameter("labelid").toString(); //label of the next question or solution based on button press 
     current=Float.parseFloat(pid); 
     next=Float.parseFloat(label); 

     res=obj.findNext(current,next).toString(); 
     out.write(res); 

    } 
    catch(Exception e){ 
     e.printStackTrace(); 
    } 
    finally {    
     out.close(); 
    } 
} 

@Override 
protected void doGet(HttpServletRequest request, HttpServletResponse response) 
     throws ServletException, IOException { 
    processRequest(request, response); 
} 

@Override 
protected void doPost(HttpServletRequest request, HttpServletResponse response) 
     throws ServletException, IOException { 
    processRequest(request, response); 
} 

@Override 
public String getServletInfo() { 
    return "Short description"; 
} 
} 

空例外在cdt1.Servlet1.processRequest(Servlet1.java:66)发生显示java.lang.NullPointerException 在cdt1.Servlet1.doPost(Servlet1.java :124) 第一个发生在我尝试读取第二个调用processRequest时的pid值 。 我在网上查了很多资源,展示了如何使用ajax和servlet,以及我读过的东西,我没有做错任何事情。如果任何人都能指引我走向正确的方向,那将是非常棒的。提前致谢。我使用netbeans 7.3 with glassfish 3.1.2如果这有所作为

+0

在HTML页面中写入Java代码是非常糟糕的做法。您可能会考虑使用JSTL而不是 – Pith 2013-03-24 19:22:55

+0

似乎'pid'参数实际上未被发送。也许把'?'预先添加到'sendstr'? – orique 2013-03-24 19:28:36

+0

@orique我试过了。不工作。有任何其他想法? – 2013-03-25 04:24:37

回答

1

解决了它。使用post发送数据时,需要设置内容类型的http头。 在放置请求时也需要