<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                [TOC] # 設置響應行 設置響應行的狀態碼 ~~~ setStatus(int sc) ~~~ # 設置響應頭 ~~~ addHeader(String name, String value) addIntHeader(String name, int value) addDateHeader(String name, long date) setHeader(String name, String value) setDateHeader(String name, long date) setIntHeader(String name, int value) ~~~ 其中,add表示添加,而set表示設置 # 設置響應體 ## 響應體設置文本 ~~~ PrintWriter getWriter() ~~~ 獲得字符流,通過字符流的write(String s)方法可以將字符串設置到response 緩沖區中,隨后Tomcat會將response緩沖區中的內容組裝成Http響應返回給瀏覽器端。 關于設置中文的亂碼問題 原因:response緩沖區的默認編碼是iso8859-1,此碼表中沒有中文,可以通過 response的 設置response的編碼 ~~~ setCharacterEncoding(String charset) ~~~ 但我們發現客戶端還是不能正常顯示文字 原因:我們將response緩沖區的編碼設置成UTF-8,但瀏覽器的默認編碼是本地系 統的編碼,因為我們都是中文系統,所以客戶端瀏覽器的默認編碼是GBK,我們可以 手動修改瀏覽器的編碼是UTF-8。 我們還可以在代碼中指定瀏覽器解析頁面的編碼方式, 通過response的setContentType(String type)方法指定頁面解析時的編碼是UTF-8 ~~~ response.setContentType("text/html;charset=UTF-8"); ~~~ 上面的代碼不僅可以指定瀏覽器解析頁面時的編碼,同時也內含 setCharacterEncoding的功能,所以在實際開發中只要編寫 response.setContentType("text/html;charset=UTF-8");就可以解決頁面輸出中文亂碼問題。 ## 響應頭設置字節 ~~~ ServletOutputStream getOutputStream() ~~~ 獲得字節流,通過該字節流的`write(byte[] bytes)`可以向response緩沖區中寫入字節,在由Tomcat服務器將字節內容組成Http響應返回給瀏覽器 ## 設置緩存 設置http響應頭控制瀏覽器禁止緩存當前文檔內容 ~~~ response.setDateHeader("expries", -1); response.setHeader("Cache-Control", "no-cache"); response.setHeader("Pragma", "no-cache"); ~~~ 設置http響應頭控制瀏覽器緩存當前文檔內容 例,設置http響應頭——expires,控制瀏覽器緩存當前網頁內容一個小時 ~~~ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setDateHeader("expires", System.currentTimeMillis()+1000*3600); String data = "aaaaaaaaaaaaaaa"; response.getWriter().write(data); } ~~~ ## 定時刷新網頁 控制瀏覽器定時刷新網頁 ~~~ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setHeader("refresh", "3"); // 設置refresh響應頭控制瀏覽器每隔3秒鐘刷新一次 String data = new Random().nextInt(1000000) + ""; response.getWriter().write(data); } ~~~ 3秒后刷新到首頁(index.jsp) ~~~ // 假設程序運行到此,用戶登錄成功了 response.setCharacterEncoding("UTF-8"); response.setContentType("text/html;charset=UTF-8"); response.setHeader("refresh", "3;url='/day06/index.jsp'"); // 3秒后刷新到首頁(index.jsp) response.getWriter().write("恭喜你,登錄成功,本瀏覽器將在3秒后跳轉到首頁,如果沒有跳,請點<a href=''>超鏈接</a>"); ~~~ # 示例 ## 向頁面輸出一個片段 ~~~ //獲取流 PrintWriter writer = response.getWriter(); //通過流寫html writer.write("<h1>11</h1>"); writer.write("222"); ~~~ ## 重定向 302 ~~~ //重定向 參數:重定向的地址 response.sendRedirect("1.html"); ~~~ ![](https://box.kancloud.cn/1fbc569df14bb31476207d8972b65d6f_1894x612.png) 相對路徑在轉發時可能會失效 重定向寫絕對路徑的時候需要帶項目名,由客戶端執行 由服務器執行解析的地址,默認在前面加localhost:8080/項目名 轉發由服務器執行,不需要添加項目名 ## 設置響應頭 ~~~ response.setHeader("Content-Type", "text/html;charset=utf-8"); ~~~ # base標簽 base標簽可以讓我們把相對路徑當做絕對路徑來使用 base標簽定義前綴url和頁面中的相對地址進行拼接 會把base標簽中的url和a標簽中的url拼接 在html中的頭部寫 ~~~ <base href="http://localhost:8080/Test/" /> ~~~ 不過一般base中的url是動態獲取 ~~~ <base href="http://<%=request.getServerName() %>:<%=request.getServerPort() %><%=request.getContextPath() %>/" /> ~~~ # 文件下載 文件下載的實質就是文件拷貝,將文件從服務器端拷貝到瀏覽器端。所以文件下載需 要IO技術將服務器端的文件使用InputStream讀取到,在使用 ServletOutputStream寫到response緩沖區中 ![](https://box.kancloud.cn/b3f031d8c0fe0beec3d39f30ffb502f6_426x208.png) 上述代碼可以將圖片從服務器端傳輸到瀏覽器,但瀏覽器直接解析圖片顯示在頁面上, 而不是提供下載,我們需要設置兩個響應頭,告知瀏覽器文件的類型和文件的打開方 式。 1. 告知瀏覽器文件的類型:response.setContentType(文件的MIME類型); 2. 告示瀏覽器文件的打開方式是下載 ~~~ response.setHeader("Content-Disposition","attachment;filename=文件名稱"); ~~~ ![](https://box.kancloud.cn/2628b09282e99339438825261607c79d_461x254.png) 但是,如果下載中文文件,頁面在下載時會出現中文亂碼或不能顯示文件名的情況, 原因是不同的瀏覽器默認對下載文件的編碼方式不同,ie是UTF-8編碼方式,而火狐 瀏覽器是Base64編碼方式。所里這里需要解決瀏覽器兼容性問題,解決瀏覽器兼容 性問題的首要任務是要辨別訪問者是ie還是火狐(其他),通過Http請求體中的一 個屬性可以辨別 ![](https://box.kancloud.cn/d9395048b9c1014d72319bc734b2d755_448x36.png) 解決亂碼方法如下: ~~~ if (agent.contains("MSIE")) { // IE瀏覽器 filename = URLEncoder.encode(filename, "utf-8"); filename = filename.replace("+", " "); } else if (agent.contains("Firefox")) { // 火狐瀏覽器 BASE64Encoder base64Encoder = new BASE64Encoder(); filename = "=?utf-8?B?" + base64Encoder.encode(filename.getBytes("utf-8")) + "?="; } else { // 其它瀏覽器 filename = URLEncoder.encode(filename, "utf-8"); } ~~~ 其中agent就是請求頭User-Agent的值 ![](https://box.kancloud.cn/034e84b0909c799e777956df8c54528d_475x300.png) ## 實現思路 1. 獲取要下載的文件的絕對路徑。 2. 獲取要下載的文件名。 3. 設置content-disposition響應頭控制瀏覽器以下載的形式打開文件。 4. 獲取要下載的文件輸入流。 5. 創建數據緩沖區。 6. 通過response對象獲取OutputStream流。 7. 將FileInputStream流寫入到buffer緩沖區。 8. 使用OutputStream將緩沖區的數據輸出到客戶端瀏覽器 使用Response實現中文文件下載。 下載中文文件時,需要注意的地方就是中文文件名要使用URLEncoder.encode方法進行編碼`(URLEncoder.encode(fileName, "字符編碼"))`,否則會出現文件名亂碼 ~~~ public class ResponseDemo3 extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 1.獲取要下載的文件的絕對路徑 String path = this.getServletContext().getRealPath("/download/你好.jpg"); // 2.獲取要下載的文件名 String filename = path.substring(path.lastIndexOf("\\")+1); // 3.設置content-disposition響應頭控制瀏覽器以下載的形式打開文件,如果下載文件是中文文件,則文件名需要經過url編碼 response.setHeader("content-disposition", "attachment;filename="+URLEncoder.encode(filename, "UTF-8")); InputStream in = null; OutputStream out = null; try { // 4.獲取要下載的文件輸入流 in = new FileInputStream(path); int len = 0; // 5.創建數據緩沖區 byte[] buffer = new byte[1024]; // 6.通過response對象獲取OutputStream流 out = response.getOutputStream(); // 7.將FileInputStream流寫入到buffer緩沖區 while((len=in.read(buffer)) != -1) { // 8.使用OutputStream將緩沖區的數據輸出到客戶端瀏覽器 out.write(buffer, 0, len); } } finally { if(in != null) { try { in.close(); } catch (Exception e) { e.printStackTrace(); } } if(out != null) { try { out.close(); } catch (Exception e) { e.printStackTrace(); } } } } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } } ~~~ 文件下載注意事項:**編寫文件下載功能時推薦使用OutputStream流,避免使用PrintWriter流,因為OutputStream流是字節流,可以處理任意類型的數據,而PrintWriter流是字符流,只能處理字符數據,如果用字符流處理字節數據,會導致數據丟失。** # 細節問題 getOutputStream和getWriter方法分別用于得到輸出二進制數據、輸出文本數據的ServletOuputStream、Printwriter對象。 getOutputStream和getWriter這兩個方法互相排斥,調用了其中的任何一個方法后,就不能再調用另一方法。 例,同時調用getOutputStream()和getWriter()方法會拋: `java.lang.IllegalStateException: getOutputStream() has already been called for this response` ~~~ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.getOutputStream(); response.getWriter(); } ~~~ 雖然以上代碼你不會愚蠢的寫出來,但作為一名合格的JavaWeb開發者一定會碰到這個問題,你碰到的代碼可能是這樣的 * ResponseDemo8 ~~~ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.getOutputStream(); // response.getWriter(); this.getServletContext().getRequestDispatcher("/ResponseDemo9").forward(request, response); } ~~~ * ResponseDemo9 ~~~ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.getWriter(); } ~~~ 轉發時用到的是同一個request請求,你可能會犯以上這樣的錯誤。 Servlet程序向ServletOutputStream或PrintWriter對象中寫入的數據將被Servlet引擎從response里面獲取,Servlet引擎將這些數據當作響應消息的正文,然后再與響應狀態行和各響應頭組合后輸出到客戶端。 Serlvet的service方法結束后,Servlet引擎將檢查getWriter或getOutputStream方法返回的輸出流對象是否已經調用過close方法,如果沒有,Servlet引擎將調用close方法關閉該輸出流對象
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看