2012-04-25 94 views
0

成功嘗試上傳文件後,請求被轉發到他的主頁,即他上傳文件的相同頁面。如果上傳成功,在轉發請求之前,設置一個屬性,告訴「是,文件已經成功上傳!」。爲什麼警報箱會一次又一次顯示?

執行用戶主頁中的以下代碼,旨在檢查用戶是否被告知成功上載嘗試。如果用戶曾經以警告框的形式看到成功消息,下次他成功上傳另一個文件時應該看到成功消息。但在第一次嘗試重新加載/刷新頁面之後,我再次看到警告框告訴用戶成功上傳嘗試,即使我從請求列表中刪除了該屬性。

片段,一個全成文件上傳嘗試後顯示成功消息給用戶

<script> 
     window.onload = function() { 
     <% message = (String)request.getAttribute("SuccessMessage"); 
      AttemptToUploadFile = (Boolean)request.getAttribute("UploadAttempt"); 
      request.removeAttribute("SuccessMessage"); // Remove the attribute so that alert box doesn't pop every time the page is refreshed 
       if(message != null) {%> 
         alert("File successfully uploaded !"); 
          <% } %> 

     } 
    </script> 

爲什麼我一次又一次地看到警告框,即使我已經刪除了特定的屬性?

回答

3

對於HTTP的工作原理以及「服務器端」和「客戶端」概念,您在某個概念上存在誤解。

請求屬性爲已有每當與特定HTTP請求關聯的HTTP響應已完成向發送響應主體(在此部分情況下,JSP生成的HTML源代碼)的客戶端發送的響應主體。

在瀏覽器中刷新/重新載入一個頁面(並且忽略瀏覽器關於數據將被重新發送的警告!)會導致原始HTTP請求數據被重新發送到服務器,因此服務器將處理整個HTTP請求一次再次設置請求屬性。明確地刪除該屬性不會解決它,並使其自己毫無意義。

我不確定功能要求是什麼。你想允許最終用戶重新發送上傳的文件嗎?爲什麼你不再顯示消息?是不是應該告誡最終用戶他/她正試圖再次發送文件,而這又是錯誤的呢?在這種情況下,請在doPost()方法中添加一個額外的檢查,其中根據磁盤上已存儲的文件或會話作用域中的某個映射驗證文件名,並讓它忽略該請求並拋出一些異常或顯示不同的信息。

String filenameOfUploadedFile = getItSomehow(); 

if (isAlreadyUploaded(filenameOfUploadedFile)) { 
    request.setAttribute("message", "Error, the file is already uploaded!"); 
} 
else { 
    // Process. 
    // ... 

    request.setAttribute("message", "File upload is successfully processed!"); 
} 

你的JSP代碼可以簡化爲:

<script> 
    <c:if test="${not empty message}"> 
     window.onload = function() { 
      alert('${message}'); 
     } 
    </c:if> 
</script> 

(雖然我個人不同意給予90年代風格的警報反饋方式)

+1

你能解釋你的意思嗎?「在瀏覽器刷新/重新加載頁面將導致原始HTTP請求數據重新發送到服務器,因此服務器將再次處理整個HTTP請求並再次設置請求屬性。「_。 **即**當遇到語句message =(String)request.getAttribute(「SuccessMessage」)時會發生什麼? – 2012-04-26 05:26:10

+0

按下F5/Ctrl + R,最後執行的HTTP請求將被重新執行。所以,如果這涉及上傳文件,該文件將被重新發送。所以,該屬性將被重新設置。等等。 – BalusC 2012-04-26 05:27:25

0

在隨後的頁面加載中,可能的消息仍然不爲空。也許你需要檢查未定義的消息或其他東西。你有沒有看過調試器,看看有什麼價值的消息? Firebug對此很有幫助。

+0

怎麼會這樣,當我有刪除了屬性? – 2012-04-25 09:41:45

+2

那麼這是顯而易見的原因! – saplingPro 2012-04-25 10:16:13

0

你的消息是在請求級別。所以在jsp上的removeAttribute沒有做任何事情,每次重新加載/刷新時都會重新出現消息。這是因爲每次刷新/重新加載時,都會創建一個新的請求。

您將需要檢查控制器端的確切位置,並在那裏設置消息並處理邏輯。

+0

你能解釋一下嗎?「這是因爲每次刷新/重新載入,都會創建一個新的請求。」# – 2012-04-25 10:14:05

+0

請求對象的範圍僅僅是從客戶機向服務器發送請求的移動直到返回響應回到客戶端。客戶端每次從服務器請求一些東西時,它實際上是一個新的新請求,它並不包含來自先前請求的任何數據。這就是爲什麼即使您在執行removeAttribute時,仍然每次刷新/重新加載頁面時,都會再次生成新請求的原因。 – Kshitij 2012-04-25 10:34:57

0

在客戶端修改請求是沒用的,因爲當你刷新頁面時,我猜你的Servlet會再次被調用並重新創建屬性。

您應該刪除服務器端的屬性(使用標誌或其他),並避免修改JSP中的請求對象。

相關問題