[記錄]Java使用中的問題

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"));

最後, 覺得文章對你有用的話,右側邊欄點個打賞吧 !

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章