首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 程式設計入門

HttpServletResponse 核心 API 實戰:文件下載、編碼控制、頁面跳轉與 BeanUtils 應用

     編輯:Java 程式設計入門

文件下載標準實現


public void fileDownload(HttpServletResponse response) throws Exception {
    ServletContext ctx = getServletContext();
    String path = ctx.getRealPath("/download/awf.jpg");
    String filename = path.substring(path.lastIndexOf("\\") + 1);
    
    // 中文文件名 UTF-8 編碼 (RFC 5987 標準更推薦 filename*=UTF-8''...)
    response.setHeader("Content-Disposition", 
        "attachment;filename=" + URLEncoder.encode(filename, "UTF-8"));
    
    try (InputStream in = new FileInputStream(path);
         OutputStream out = response.getOutputStream()) {
        byte[] buffer = new byte[1024];
        int len;
        while ((len = in.read(buffer)) > 0) {
            out.write(buffer, 0, len);
        }
    } // try-with-resources 自動關閉
}

關鍵點:Content-Disposition: attachment 強制下載而非瀏覽器打開;輸出流用 response.getOutputStream(),不可與 getWriter() 混用。

BeanUtils 簡化對象填充


// Map → Bean (鍵匹配屬性名)
BeanUtils.populate(bean, map); 

// Bean → Map / Bean → Bean
BeanUtils.copyProperties(destBean, srcBean);

依賴 commons-beanutils,自動處理類型轉換,極大簡化表單數據綁定。

轉發 vs 重定向:Response 行為差異

特性轉發重定向
請求次數1 次2 次
Request/Response共享同一對象新對象
瀏覽器地址欄不變改變
Response 狀態200302

頁面跳轉三種模式

1. Meta 標籤延遲跳轉 (配合轉發)


String meta = ""
            + "點這裡跳轉";
getServletContext().setAttribute("message", meta);
getServletContext().getRequestDispatcher("/message.jsp").forward(req, resp);

2. Response Header Refresh (無需轉發)


response.setHeader("refresh", "3;url=/webTwo/index.jsp");
response.getWriter().write("登錄成功,3秒後跳轉...");

3. JavaScript 跳轉 (最靈活)


response.getWriter().write("");

Response 編碼控制:雙重保障


// 方式一:分別設置 (推薦理解原理)
response.setCharacterEncoding("UTF-8");        // 1. 設置輸出流編碼
response.setHeader("Content-Type", "text/html;charset=UTF-8"); // 2. 告訴瀏覽器解碼方式

// 方式二:一行搞定 (內部調用上述兩行)
response.setContentType("text/html;charset=UTF-8");

核心原則:程序輸出編碼 = 瀏覽器解碼編碼,否則亂碼。

緩存控制與 Session 有效期


// 禁止緩存 (安全頁面必加)
response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate");
response.setHeader("Pragma", "no-cache");
response.setDateHeader("Expires", 0);

// 設置 Session 超時 (10分鐘) - 實際由 Session API 控制
// response.setDateHeader("Expires", System.currentTimeMillis() + 1000*60*10); // 這行針對 HTTP 緩存,非 Session

輸出流選擇指南

  • getOutputStream():二進制數據(文件、圖片、PDF)
  • getWriter():文本數據(HTML、JSON、XML),內部用 PrintWriter
  • 互斥:調用其一後不可調用另一個,否則 IllegalStateException

最佳實踐清單

  1. 下載文件:Content-Disposition + OutputStream + try-with-resources
  2. 編碼:統一 response.setContentType("text/html;charset=UTF-8") 作為第一行
  3. 跳轉:業務成功用重定向 (PRG 模式) 防重複提交;錯誤頁用轉發保留請求數據
  4. 緩存:動態頁面禁用緩存,靜態資源配置長期緩存
  5. 流關閉:Servlet 容器自動管理,手動關閉反而可能干擾容器
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved