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() 混用。
// Map → Bean (鍵匹配屬性名)
BeanUtils.populate(bean, map);
// Bean → Map / Bean → Bean
BeanUtils.copyProperties(destBean, srcBean);
依賴 commons-beanutils,自動處理類型轉換,極大簡化表單數據綁定。
| 特性 | 轉發 | 重定向 |
|---|---|---|
| 請求次數 | 1 次 | 2 次 |
| Request/Response | 共享同一對象 | 新對象 |
| 瀏覽器地址欄 | 不變 | 改變 |
| Response 狀態 | 200 | 302 |
String meta = ""
+ "點這裡跳轉";
getServletContext().setAttribute("message", meta);
getServletContext().getRequestDispatcher("/message.jsp").forward(req, resp);
response.setHeader("refresh", "3;url=/webTwo/index.jsp");
response.getWriter().write("登錄成功,3秒後跳轉...");
response.getWriter().write("");
// 方式一:分別設置 (推薦理解原理)
response.setCharacterEncoding("UTF-8"); // 1. 設置輸出流編碼
response.setHeader("Content-Type", "text/html;charset=UTF-8"); // 2. 告訴瀏覽器解碼方式
// 方式二:一行搞定 (內部調用上述兩行)
response.setContentType("text/html;charset=UTF-8");
核心原則:程序輸出編碼 = 瀏覽器解碼編碼,否則亂碼。
// 禁止緩存 (安全頁面必加)
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),內部用 PrintWriterIllegalStateExceptionContent-Disposition + OutputStream + try-with-resourcesresponse.setContentType("text/html;charset=UTF-8") 作為第一行