2013-02-19 12 views
1

爲了簡單起見,我有一個包含2個選擇選項,文件上傳選項和提交按鈕的小表單的jsp文件。一個servlet接收這些值,對它們進行處理(即將文件放入數據庫),然後通過請求屬性顯示消息並將其重定向回原始的jsp頁面。如何在「重新提交」之後將新的表單參數從jsp傳遞到servlet?

我的問題是,當用戶嘗試從同一個jsp頁面上傳另一個文件時,該servlet正在接收從上次提交中選擇的選擇值,而不是新的提交嘗試。在servlet已經重定向回jsp之後,同一個用戶如何爲選擇選項上傳另一個具有不同值的文件?

同樣,如何清除從第一次提交打印的成功消息,直到另一次成功上傳發生爲止?目前,即使在用戶已經開始選擇要提交的新值之後,成功消息仍保留在頁面上。

下面是相關代碼:

JSP文件

<body > 

<h3 style="color:red">${msg4}</h3> 

<form id="uploadForm" method="post" action="UploadServlet"enctype="multipart/form-data"> 
<br /> 

<% UserBean currentUser = (UserBean)(session.getAttribute"currentSessionUser"));%> 

Course Number: 
<select name="courseNo"> 
    <option value="CS1">CS1</option> 
    <option value="CS2">CS2</option> 
</select> 
<br /> 
Assignment Number: 
<select name="hwNo" id="hwNo" > 
    <option value="1">1</option> 
    <option value="2">2</option> 
    <option value="3">3</option> 
</select> 
<br /> 
Assignment (must be a zip file): <input type="file" name="dataFile"  id="fileChooser" /><br /> 

<br /> <input type="submit" value="Upload" /> 
</form> 

<h3 style="color:red">${msg2}</h3> 

</body> 

相關servlet代碼

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
    { 
     HttpSession session = request.getSession(true); 
     UserBean currentUser = (UserBean)(session.getAttribute("currentSessionUser")); 
     String uName = currentUser.getUsername(); 


     if (!ServletFileUpload.isMultipartContent(request)) 
     {return;} 


     DiskFileItemFactory factory = new DiskFileItemFactory(); 
     factory.setSizeThreshold(THRESHOLD_SIZE); 
     factory.setRepository(new File(System.getProperty("java.io.tmpdir"))); 

     ServletFileUpload upload = new ServletFileUpload(factory); 
     upload.setFileSizeMax(MAX_FILE_SIZE); 
     upload.setSizeMax(REQUEST_SIZE); 


     try 
     { 
      List<FileItem> items = new ServletFileUpload(new DiskFileItemFactory()).parseRequest(request); 
      for (FileItem item : items) 
      { 
       if (item.isFormField()) 
       { 
        String fieldname = item.getFieldName(); 

        if(fieldname.equals("courseNo")) 
         courseNo = item.getString(); 
        if(fieldname.equals("hwNo")) 
        { 
         hwNo = item.getString(); 
         homeworkNo = Integer.parseInt(hwNo);  
        } 

       Boolean exists = checkIfHWNoExists(homeworkNo, uName); 
       if(exists) 
       { 
        request.setAttribute("msg4", "You've already made a submission for " + 
             "assignment number " + homeworkNo +"." + 
             "<br />If you need to change your submission, " + 
             "please contact your teacher."); 
        request.getRequestDispatcher("/upload.jsp").forward(request, response); 
        return; 
       } 

      } 

      if (!item.isFormField()) 
      { 
       (item.getName()).getName(); 
       File storeFile = new File(item.getName()); 
       String fileName = storeFile.getName(); 
       if(!fileName.endsWith(".zip")) 
       { 
        request.setAttribute("msg", "Must be a zip file! Try again!"); 
        request.getRequestDispatcher("/upload.jsp").forward(request, response); 
        return; 
       } 


       else 
       { 
        String mimeType = new MimetypesFileTypeMap().getContentType(storeFile); 
                  //for putting file into database 
        putFileIntoDB(uName, homeworkNo, fileName, mimeType, storeFile); 


        request.setAttribute("msg2", "File uploaded successfully!"); 
        request.getRequestDispatcher("/upload.jsp").forward(request, response); 
       } 
      } 
     } 


      //request.setAttribute("message", "Upload has been done successfully!"); 

    } 
    catch (Exception ex) 
    { 
     request.setAttribute("message", "There was an error: " + ex.getMessage()); 
    } 

    ("/message.jsp").forward(request, response); 


     } 
+0

其實,更具體,該servlet被正確地捕捉新的「無場」,但後續的提交後不改變價值「的家庭作業沒有」新的選擇......我看不到爲什麼會這樣。 – Lani1234 2013-02-19 16:07:40

+1

通過查看你的代碼,它就像你已經聲明'courseNo','hwNo'和'homeworkNo'變量爲servlet屬性一樣。你應該在'doPost'函數中移動這些變量定義以避免這些問題。請參考[小服務程序如何工作?實例化,會話變量和多線程](http://stackoverflow.com/q/3106452/1065197) – 2013-02-19 21:16:52

+0

我很抱歉,但我發現了這個問題。在通過FileItem列表的第一個循環中,只分配了courseNo。在該循環內,它還調用checkIfHWNoExists,在新的作業No值被分配之前。所以在後續的提交中,它永遠不會到達HomeworkNo被賦予新值的循環部分,並且只會檢查舊值。我會在稍後發佈更正後的代碼,以防其他人幫忙。 – Lani1234 2013-02-19 21:30:03

回答

0

的問題是在Servlet中的循環。這裏是修正後的doPost方法,因爲它完全沒有必要。

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
{ 
    String courseNo; 
    int homeworkNo; 

    HttpSession session = request.getSession(true); 
    UserBean currentUser = (UserBean)(session.getAttribute("currentSessionUser")); 
    String uName = currentUser.getUsername(); 

    if (!ServletFileUpload.isMultipartContent(request)) 
    {return;} 


    try 
    { 
     List<FileItem> items = new ServletFileUpload(new DiskFileItemFactory()).parseRequest(request); 

     courseNo = items.get(0).getString(); 
     homeworkNo = Integer.parseInt(items.get(1).getString());  
     if(checkIfHWNoExists(courseNo, homeworkNo, uName)) 
     { 
      request.setAttribute("msg4", "You've already made a submission for Course Number " + courseNo + ", "+ 
            "Assignment number " + homeworkNo +"." + 
            "<br />If you need to change your submission, " + 
            "please contact your teacher."); 
       request.getRequestDispatcher("/upload.jsp").forward(request, response); 
       return; 
      } 

     else//ok to add new HW, it doesn't exist 
     { 
      File storeFile = new File(items.get(2).getName()); 
      String fileName = storeFile.getName(); 

      if(!fileName.endsWith(".zip")) 
      { 
       request.setAttribute("msg", "Must be a zip file! Try again!"); 
       request.getRequestDispatcher("/upload.jsp").forward(request, response); 
      return; 
      } 

      else 
      { 
       String mimeType = new MimetypesFileTypeMap().getContentType(storeFile); //for putting file into database 
         putFileIntoDB(uName, courseNo, homeworkNo, fileName, mimeType, storeFile); 

       request.setAttribute("msg2", "File uploaded successfully!"); 
       request.getRequestDispatcher("/upload.jsp").forward(request, response); 
      } 
     } 

    }//try 
    catch (Exception ex) 
    { 
     request.setAttribute("msg", "There was an error: " + ex.getMessage()); 
     request.getRequestDispatcher("/upload.jsp").forward(request, response); 
     } 

} 
相關問題