2012-10-06 49 views
0

大家好我有一个网站,讲师为实验室指派一个导师,目前我有一个导师列表,我可以点击分配,然后它将用户带到另一个有丢弃的页面他们可以选择他们想要导师教授的实验室。它应该将实验室的ID和用户的ID提交给数据库。Servlets Jsp和Null指针

目前当用户得到导师名单,他们点击一个名为“分配”链接这使导师ID起来的URL,那么他们有tutes的名单,他们可以选择,一旦我选择了和土特点击提交我得到以下错误。

说明服务器遇到内部错误(),导致它无法完成此请求。

exception 

java.lang.NumberFormatException: null 
    java.lang.Integer.parseInt(Unknown Source) 
    java.lang.Integer.parseInt(Unknown Source) 
    TutorAssign.doPost(TutorAssign.java:97) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:641) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:722) 

的sendBack方法正在运行,但doPost方法是不是和它指向哪里获得的请求参数为空行 - int user_id = Integer.parseInt(request.getParameter("id"));

我怎样才能解决这一问题?我会包括我的servlet的全部内容为更好地澄清

import java.io.IOException; 
import java.io.PrintWriter; 
import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.ResultSet; 
import java.sql.SQLException; 
import java.sql.Statement; 
import java.util.ArrayList; 

import javax.servlet.RequestDispatcher; 
import javax.servlet.ServletException; 
import javax.servlet.annotation.WebServlet; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
import javax.servlet.http.HttpSession; 

/** 
* Servlet implementation class TutorAssign 
*/ 
@WebServlet("/TutorAssign") 
public class TutorAssign extends HttpServlet { 
    private static final long serialVersionUID = 1L; 

    /** 
    * @see HttpServlet#HttpServlet() 
    */ 
    public TutorAssign() { 
     super(); 
     // TODO Auto-generated constructor stub 
    } 

    /** 
    * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) 
    */ 
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
     sendBack(request, response); 
    } 

    private void sendBack(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
     HttpSession session = request.getSession(true); 
      //Set data you want to send back to the request (will be forwarded to the page) 
      //Can set string, int, list, array etc. 
     int user_id = Integer.parseInt((String)request.getParameter("id")); 
     String sql = "SELECT l.id,s.name,l.day,l.time,l.room" + 
        " FROM subject s, lab l " + 
        " WHERE s.user_id="+(Integer)session.getAttribute("id"); 

      try{ 
      Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/wae","root",""); 
      System.out.println("got a hj"); 
      System.out.println(session.getAttribute("id")); 

       Statement stmt = con.createStatement(); 
       ResultSet res = stmt.executeQuery(sql); 
       System.out.println(res); 
       ArrayList<String> list1 = new ArrayList<String>(); 
       ArrayList<String> list2 = new ArrayList<String>(); 
       if (res.next()){ 
        do{ 
         list1.add(res.getString(1)); 
         list2.add(res.getString(2)+" "+res.getString(3)+" "+res.getString(4)+" "+res.getString(5)); 


        }while(res.next()); 
       System.out.println("Outside"); 
       String[] arr1 = list1.toArray(new String[list1.size()]); 
       String[] arr2 = list2.toArray(new String[list2.size()]); 
       System.out.println(list1); 
       request.setAttribute("res1", arr1); 
       request.setAttribute("res2", arr2); 
       request.setAttribute("user_id", user_id); 

       } 



      }catch (SQLException e) { 
      } 
      catch (Exception e) { 
      } 


      //Decides what page to send the request data to 
      RequestDispatcher view = request.getRequestDispatcher("TutorAssign.jsp"); 
      //Forward to the page and pass the request and response information 
      view.forward(request, response); 
    } 

    /** 
    * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) 
    */ 
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 


     int user_id = Integer.parseInt((String)request.getParameter("id")); 
      System.out.println(user_id); 
      int lab_id = 0; 
      System.out.println("I got a blow job"); 
      String message = null; 
      try { 
       Class.forName("com.mysql.jdbc.Driver"); 
       Connection con = 
       DriverManager.getConnection("jdbc:mysql://localhost:3306/wae","root",""); 
      System.out.println("got connection"); 
      System.out.println(user_id); 
      Statement s = con.createStatement(); 

      String sql = "INSERT INTO user_lab" + 
         " (user_id, lab_id)" + 
         " VALUES" + 
         " ('" + user_id + "'," + 
         " '" + lab_id + "')"; 

       System.out.println(sql); 
       int i = s.executeUpdate(sql); 
       if (i==1) { 
       message = "Successfully assigned a tutor."; 
       response.sendRedirect("Lecturer_labs"); 
       } 

       s.close(); 
       con.close(); 
      } 
      catch (SQLException e) { 
       message = "Error." + e.toString(); 
       boolean error = true; 
      } 
      catch (Exception e) { 
       message = "Error." + e.toString(); 
       boolean error = true; 
      } 
      if (message!=null) { 
       PrintWriter out = response.getWriter(); 
       out.println("<B>" + message + "</B><BR>"); 
       out.println("<HR><BR>"); 
      } 

      } 
// TODO Auto-generated method stub 


} 

这里是我的JSP代码

<form name ="TutorAssign" ACTION="TutorAssign" method="post"> 
     <input type="hidden" name="user_id" value="user_id"/> 
     <select name="lab_id"> 
     <% 
     for(int i=0; i<list1.length;i++) 
     { 
     out.println("<option value="+list1[i]+"> "+list2[i]+" </option>"); 

     } %> 
     </select> 
     <input type=SUBMIT value="Submit" name="Submit" /> 

     </form> 

回答

1

的问题是在这里:

<form name ="TutorAssign" ACTION="TutorAssign" method="post"> 
     <select name="labs"> 
     <% 
     for(int i=0; i<list1.length;i++) 
     { 
     out.println("<option value="+list1[i]+"> "+list2[i]+" </option>"); 

     } %> 
     </select> 

更具体地说:

<select name="labs"> 

如果你要么将名称更改为id或使用request.getParameter("labs"),你大概会得到你想要的。

+0

选择是为更改后的lab_id然后还添加,我仍然得到相同的错误 – user1393064

+0

@ user1393064我不知道你的意思...你需要做的唯一事情就是在你的JSP表单中有一个字段,它的'name'属性设置为“id”**或者**你将'name'属性的值传递给' request.getParameter'。 – MarioDS

+0

我更新了我原来的答案中的代码,请重新阅读它,因为我仍然得到相同的错误 – user1393064

2

看来,id当一个HTTP POST时没有被传递到你的servlet。你可以防止这种通过添加适当的后卫声明:

if (request.getParameter("id") == null) { 
    // handle non existance of id 
} 

id没有被传入的原因是,你不必在你的JSP形式的任何输入字段中的数值来传递。这看起来像:

<input type="hidden" name="id" value="your_id_here"/> 
+0

执行此操作时,它不打印,我把情况下,没有一个id – user1393064

+0

的所有脑干我会使用HTTP GET为“显示所有”,后为显示特定'id'信息的消息。 – Reimeus