2012-10-06 133 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