1. Java一個對象多次調用set方法
Java中創建一個對象object,並用List對象list的add方法保存object。
object再次調用set方法,list再次添加後會發現之前添加的內容和第二次set內容相同,第一次set的對象被覆蓋了。
這是因爲內存只創建了一次object對象,之後每次set並add,之前的object對象也會被更新。
因此當在寫代碼時,當在循環內部object調用set方法,list添加object對象時要在循環內創建object對象。這樣的object在內存中並不是獨一份了。
2. Response對象進行頁面跳轉沒有效果
if(pageEntity==null){
System.out.println("請求順序出錯,請先訪問當前項目下/ThreeTierArchitectureJSP/QueryStudentByPage");
response.sendRedirect("QueryStudentByPage");
}
判斷pageEntity爲空時,使頁面用response對象進行頁面跳轉時發現,不管怎麼改 response.sendRedirect(“QueryStudentByPage”);中的url對象都不會跳轉,進而執行後面代碼造成對pageEntity這個空對象的操作。原來是在判斷語句末尾沒加return。如下就好了
if(pageEntity==null){
System.out.println("請求順序出錯,請先訪問當前項目下/ThreeTierArchitectureJSP/QueryStudentByPage");
response.sendRedirect("QueryStudentByPage");
return;
}
3. 上傳文件提示“文件名、目錄名或卷標語法不正確”
我在代碼中使用了 FileItem.getName方法,獲取上傳文件的名字。
String fileName = fileItem.getName();
但是後端的在調用getName方法時,不同瀏覽器返回給後端的文件名也不盡相同,分爲帶絕對路徑的文件名和不帶絕對路徑的文件名這兩種。所以可能存在在A瀏覽器可以上傳成功,但是到B就報錯這種情況。自己測試過上傳的瀏覽器Microsoft Edge(帶絕對路徑的文件名),Chrome(不帶絕對路徑的文件名)。
如何做到萬無一失,每個瀏覽器都可以上傳呢?可以通過subString的方法截取字符串獲取不帶絕對路徑的文件名
fileName=fileName.substring(fileName.lastIndexOf("\\")+1);
4. 下載文件大體步驟以及出現亂碼解決
實現下載文件的話,doGet方法內先給response設置響應頭
resp.addHeader("content-Type","application/octet-stream");
resp.addHeader("content-Disposition","attachment;fileName="+ fileName);
先使用getServletContext().getResourceAsStream()方法獲得文件輸入流
InputStream inputStream = getServletContext().getResourceAsStream(fileFatherPath+fileName);
再通過resp.getOutputStream()獲得對用戶響應的輸出流後
ServletOutputStream servletOutputStream = resp.getOutputStream();
之後把 inputStream 內讀到的內容寫入到 servletOutputStream 裏就完成了下載。
之後會發現下載中文文件會出現和實際文件名字不完全相同的現象,比如下載圖片 “楊超越.jpg”,下載提示文件名卻是 _.jpg_ 這樣,這時對文件名設置響應編碼格式就好了(不同瀏覽器內核設置方式不盡相同,此方法支持瀏覽器Microsoft Edge, Chrome)
resp.addHeader("content-Disposition","attachment;fileName="+ URLEncoder.encode(fileName,"utf-8"));
最後, 覺得文章對你有用的話,右側邊欄點個打賞吧 !