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);
}
其實,更具體,該servlet被正確地捕捉新的「無場」,但後續的提交後不改變價值「的家庭作業沒有」新的選擇......我看不到爲什麼會這樣。 – Lani1234 2013-02-19 16:07:40
通過查看你的代碼,它就像你已經聲明'courseNo','hwNo'和'homeworkNo'變量爲servlet屬性一樣。你應該在'doPost'函數中移動這些變量定義以避免這些問題。請參考[小服務程序如何工作?實例化,會話變量和多線程](http://stackoverflow.com/q/3106452/1065197) – 2013-02-19 21:16:52
我很抱歉,但我發現了這個問題。在通過FileItem列表的第一個循環中,只分配了courseNo。在該循環內,它還調用checkIfHWNoExists,在新的作業No值被分配之前。所以在後續的提交中,它永遠不會到達HomeworkNo被賦予新值的循環部分,並且只會檢查舊值。我會在稍後發佈更正後的代碼,以防其他人幫忙。 – Lani1234 2013-02-19 21:30:03