Java response響應(yīng)體和文件下載實(shí)現(xiàn)原理
通過response 設(shè)置響應(yīng)體:
響應(yīng)體設(shè)置文本:
PrintWriter getWriter()
獲得字符流,通過字符流的write(String s)方法可以將字符串設(shè)置到response 緩沖區(qū)中,隨后Tomcat會將response緩沖區(qū)中的內(nèi)容組裝成Http響應(yīng)返回給瀏覽 器端。
關(guān)于設(shè)置中文的亂碼問題
原因:response緩沖區(qū)的默認(rèn)編碼是iso8859-1,此碼表中沒有中文,可以通過 response的setCharacterEncoding(String charset) 設(shè)置response的編碼,
但我們發(fā)現(xiàn)客戶端還是不能正常顯示文字。
原因:我們將response緩沖區(qū)的編碼設(shè)置成UTF-8,但瀏覽器的默認(rèn)編碼是本地系統(tǒng)的編碼,因?yàn)槲覀兌际侵形南到y(tǒng),所以客戶端瀏覽器的默認(rèn)編碼是GBK,我們可以手動修改瀏覽器的編碼是UTF-8。
我們還可以在代碼中指定瀏覽器解析頁面的編碼方式,通過response的setContentType(String type)方法指定頁面解析時(shí)的編碼是UTF-8。
response.setContentType("text/html;charset=UTF-8");
上面的代碼不僅可以指定瀏覽器解析頁面時(shí)的編碼,同時(shí)也內(nèi)含 setCharacterEncoding的功能,所以在實(shí)際開發(fā)中只要編寫 response.setContentType("text/html;charset=UTF-8"),就可以解決頁面輸出中文亂碼問題。
package com.oracle; import java.io.FileInputStream; import java.io.IOException; import java.net.URLEncoder; import javax.servlet.ServletException; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import sun.misc.BASE64Encoder; public class DownloadServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //服務(wù)器獲取文件名(文件名是中文的話,獲取的時(shí)候就成了亂碼了) String filename = request.getParameter("file");//??.png //get請求中---解決文件名中文亂碼問題 filename =new String(filename.getBytes("ISO-8859-1"),"UTF-8");//亂碼.png //獲取User-Agent獲取客戶端瀏覽器到底是哪個(gè)瀏覽器 String agent=request.getHeader("User-Agent"); String filenameEncoder=""; if (agent.contains("MSIE")) { // IE瀏覽器 filenameEncoder= URLEncoder.encode(filename, "utf-8"); filenameEncoder= filenameEncoder.replace("+", " "); } else if (agent.contains("Firefox")) { // 火狐瀏覽器 BASE64Encoder base64Encoder = new BASE64Encoder(); filenameEncoder= "=?utf-8?B?" + base64Encoder.encode(filename.getBytes("utf-8")) + "?="; } else { // 其它瀏覽器 filenameEncoder= URLEncoder.encode(filename, "utf-8"); } //告知瀏覽器文件的類型(響應(yīng)體) response.setContentType(getServletContext().getMimeType(filename)); //告知瀏覽器以附件的方式提供下載功能 而不是解析 response.setHeader("Content-Disposition","attachment;filename="+filenameEncoder); //服務(wù)器獲取后開始進(jìn)行復(fù)制的程序:獲取字節(jié)輸出流 ServletOutputStream sos = response.getOutputStream(); //獲取數(shù)據(jù)源的絕對路徑 String realpath = getServletContext().getRealPath("download/"+filename); //獲取字節(jié)輸入流 FileInputStream fis =new FileInputStream(realpath); //開始復(fù)制 byte[] bytes=new byte[1024]; int len=0; while((len=fis.read(bytes))!=-1){ sos.write(bytes, 0, len); } //釋放資源 fis.close(); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <a href="/WEB02/DownLoadServlet?filename=a.txt" rel="external nofollow" >a.txt</a> <a href="/WEB02/DownLoadServlet?filename=a.wmv" rel="external nofollow" >a.wmv</a> <a href="/WEB02/DownLoadServlet?filename=科比.png" rel="external nofollow" >科比.png</a> <a href="/WEB02/DownLoadServlet?filename=a.zip" rel="external nofollow" >a.zip</a> </body> </html>
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Android中通過RxJava進(jìn)行響應(yīng)式程序設(shè)計(jì)的入門指南
- JavaFX桌面應(yīng)用未響應(yīng)問題解決方案
- java實(shí)現(xiàn)響應(yīng)重定向發(fā)送post請求操作示例
- JavaWeb Refresh響應(yīng)頭代碼實(shí)例詳解
- javaweb如何實(shí)現(xiàn)請求和響應(yīng)
- java web請求和響應(yīng)中出現(xiàn)中文亂碼問題的解析
- Java Web請求與響應(yīng)實(shí)例詳解
- Java并發(fā)編程之性能、擴(kuò)展性和響應(yīng)
- 淺談Java響應(yīng)式系統(tǒng)
相關(guān)文章
Java實(shí)現(xiàn)數(shù)據(jù)庫連接的最詳細(xì)教程分享
JDBC,Java?Database?Connectivity,即Java數(shù)據(jù)庫連接,是?Java?中的一套和數(shù)據(jù)庫進(jìn)行交互的API,本文就來講講Java如何利用JDBC實(shí)現(xiàn)數(shù)據(jù)庫的連接吧2023-05-05非常適合新手學(xué)生的Java線程池優(yōu)化升級版
作者是一個(gè)來自河源的大三在校生,以下筆記都是作者自學(xué)之路的一些淺薄經(jīng)驗(yàn),如有錯(cuò)誤請指正,將來會不斷的完善筆記,幫助更多的Java愛好者入門2022-03-03java實(shí)現(xiàn)圖片無損任意角度旋轉(zhuǎn)
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)圖片無損任意角度旋轉(zhuǎn),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-02-02Spring Boot Event Bus用法小結(jié)
Spring Boot Event Bus是Spring框架中事件驅(qū)動編程的一部分,本文主要介紹了Spring Boot Event Bus用法小結(jié),感興趣的可以了解一下2023-09-09Java HashTable的原理與實(shí)現(xiàn)
Java中的HashTable是一種線程安全的哈希表實(shí)現(xiàn),它可以高效地存儲和快速查找數(shù)據(jù),本文將介紹Java中的HashTable的實(shí)現(xiàn)原理、常用方法和測試用例,需要的小伙伴可以參考一下2023-09-09利用Stream聚合函數(shù)如何對BigDecimal求和
這篇文章主要介紹了利用Stream聚合函數(shù)如何對BigDecimal求和問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-05-05