Servlet p4 HttpServletResponse對象

来源:https://www.cnblogs.com/zh-Note/archive/2023/07/02/17512699.html
-Advertisement-
Play Games

# HttpServletResponse對象 ## 基本介紹 ​ Web伺服器收到客戶端的http請求,會針對每次請求,分別創建一個用於**代表請求**的 request對象 和**代表響應**的 response對象。 ​ request 和 response對象 代表請求和響應:**獲取客戶瑞 ...


HttpServletResponse對象

基本介紹

​ Web伺服器收到客戶端的http請求,會針對每次請求,分別創建一個用於代表請求的 request對象 和代表響應的 response對象。

​ request 和 response對象 代表請求和響應:獲取客戶瑞數據,需要通過request對象;向客戶端輸出數據需要通過response對象

​ HttpServletResponse的主要功能用於伺服器對客戶端的請求進行響應,將Web伺服器處理後的結果返回給
客戶端。service(O方法中形參接收的是HttpServletResponse介面的實例化對象,這個對象中封裝了向客戶端發
送數據、發送響應頭,發送響應狀態碼的方法。

響應數據

​ 接收客戶端請求後,可以通過 HttpServletResponse對象 直接進行響應,響應時需要獲取輸出流。

有兩種形式:

  • getWriter():獲取字元流(只能響應字元)

    //獲取字元輸出流
    PrintWriter writer = resp.getWriter();
    //輸出數據
    writer.write("hello");
    
  • getOutputStream():獲取位元組流(能響應一切數據)

    //獲取位元組輸出流
    ServletOutputStream outputStream = resp.getOutputStream();
    //輸出數據
    outputStream.write("hi".getBytes());
    

註意:二者不能同時使用,因為resp對象只能響應一次,再次調用就不存在了。

響應亂碼問題

​ 在響應中,如果我們響應的內容中含有中文,則可能出現亂碼。這是因為伺服器響應的數據也會經過網路傳輸,f伺服器端有一種編碼方式,在客戶端也存在一種編碼方式,當兩端使用的編碼方式不同時則出現亂碼。

  • getWriter()字元亂碼問題

    ​ 對於getWriter()獲取到的字元流,響應中文必定出亂碼,由於伺服器端在進行編碼時預設會使用1S0-8859-1格式的編碼,該編碼方式並不支持中文。

    要解決該種亂碼只能在伺服器端告知伺服器使用一種能夠支持中文的編碼格式,比如我們通常用的"UTF-8"。

    response.setcharacterEncoding("UTF-8");

    此時還只完成了一半的工作,要保證數據正確顯示,還需要指定客戶端的解碼方式。

    response.setHeader("content-type","text/html;charset=UTF-8");

    兩端指定編碼後,亂碼就解決了。一句話:保證發送端和接收端的編碼一致。

    //設置服務端的編碼
    response.setcharacterEncoding("UTF-8");
    //設置客戶端的響應類型及編碼
    response.setHeader("content-type","text/html;charset-UTF-8");
    //得到字元輸出流
    Printwriter writer response.getwriter();
    writer.write("<h2>你好</h2>");
    

    以上兩端編碼的指定也可以使用一句替代,同時指定伺服器和客戶端

    response.setcontentType("text/html;charset=UTF-8");

  • getOutputStream()字元亂碼問題

    ​ 對於getOutputStream(0方式獲取到的位元組流,響應中文時,由於本身就是傳輸的位元組,所以此時可能出現亂碼,也可能正確顯示。當伺服器端給的位元組恰好和客戶端使用的編碼方式一致時,則文本正確顯示,否則出現亂
    碼。無論如何我們都應該準確掌握伺服器和客戶端使用的是那種編碼格式,不能留下不確定因素,以確保數據正確顯示。

    直接指定客戶端和伺服器使用的編碼方式一致

    response.setHeader("content-type","text/html;charset-UTF-8");

    //設置客戶端的編碼及響應類型
    Servletoutputstream out response.getoutputstream();
    response.setHeader("content-type","text/html;charset=UTF-8");
    out.write("<h2></h2>".getBytes("UTF-8"))
    

重定向

​ 重定向是一種伺服器指導,客戶端的行為。客戶端發出第一個請求,被伺服器接收處理後,伺服器會進行響應,在響應的同時,伺服器會給客戶端一個新的地址(下次請求的地址response.sendRedirect(url:),當客戶端接收到響應後,會立刻、馬上、自動根據伺服器給的新地址發起第二個請求,伺服器接收請求並作出響應,重定向完成。

從描述中可以看出重定向當中有兩個請求存在,並且屬於客戶端行為。

//重定向跳轉到servlet05
response.sendRedirect("s05");

通過觀察瀏覽器我們發現第一次請求獲得的響應碼為302,並且含有一個location頭信息。並且地址欄最終看到的地址是和第一次請求地址不同的,地址欄已經發生了變化。

1686970195001

1686970116673

servlet04代碼:

package com.xxxx.servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * @author: 86199
 * @date: 2023/6/17 10:36
 * Description: 重定向
 * 存在兩次請求
 * 地址欄會發生改變
 * request對象不共用
 */
@WebServlet("/s04")
public class Servlet04 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("Servlet04....");

        // 接收參數
        String uname = req.getParameter("uname");
        System.out.println("servlet04 uname = " + uname);

        //重定向跳轉到05
        resp.sendRedirect("s05");
    }
}

servlet05代碼:

package com.xxxx.servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * @author: 86199
 * @date: 2023/6/17 10:36
 * Description: 重定向
 */
@WebServlet("/s05")
public class Servlet05 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("Servlet05....");

        // 接收參數,無法拿到,畢竟s04和s05之間也沒有共用req對象
        String uname = req.getParameter("uname");
        System.out.println("servlet05 uname = " + uname);
    }
}

請求轉發和重定向的區別

請求轉發和重定向比較

1686972065928

兩者都可以進行跳轉,根據實際需求選取。

代碼演示:

package com.xxxx.servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * @author: 86199
 * @date: 2023/6/17 10:36
 * Description: 重定向和請求轉發的區別
 * 1. 請求轉發的地址欄不會發生改變,重定向的地址欄會發生改變
 * 2. 請求轉發只有一次請求,重定向有兩次請求
 * 3. 請求轉發時request對象可以共用,重定向不能共用
 * 4. 請求轉發是服務端的行為,重定向是客戶端行為
 * 5. 請求轉發時的地址只能是當前站點下的(當前項目)資源,重定向時地址可以是任意地址
 */
@WebServlet("/s06")
public class Servlet06 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("Servlet06....");

        // 接收參數
        String uname = req.getParameter("uname");
        System.out.println(uname);

        //設置request域對象
        req.setAttribute("upwd", "123456");

        //請求轉發
        req.getRequestDispatcher("index.jsp").forward(req, resp);

        //重定向
//        resp.sendRedirect("index.jsp");
        //重定向跳轉到百度
//        resp.sendRedirect("http://www.baidu.com");

        //請求轉發到百度,404找不到
//        req.getRequestDispatcher("http://www.baidu.com");
    }
}

index.jsp文件代碼:

<%--
  Created by IntelliJ IDEA.
  User: 86199
  Date: 2023/6/16
  Time: 11:11
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>$Title$</title>
  </head>
  <body>
  <%--    Java腳本段--%>
  <%
    //獲取參數
    String uname = request.getParameter("uname");
    //獲取request作用域
    String upwd = (String) request.getAttribute("upwd");

    //輸出內容
    out.print(uname);
    out.print("================");
    out.print(upwd);
  %>
  </body>
</html>


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • # 前言 最近針對java項目的部署方式進行整理,jenkins/tomcat/windows工具/linux腳本/web部署平臺等等 發現war包通過tomcat部署比較繁瑣,等待時間長,配置規則複雜對於小白很不友好,也難以接入到自定義的部署工具/平臺中 之前開發的Jar包部署平臺是servlet ...
  • 數組索引是指在`numpy`數組中引用特定元素的方法。`numpy`的數組索引又稱為`fancy indexing`,比其他編程語言的索引強大很多。 # 1. 選取數據 numpy的索引除了像其他語言一樣選擇一個元素,還可以間隔著選取多個元素,也可以用任意的順序選取元素。 比如一維數組: ```py ...
  • urllib+BeautifulSoup爬取並解析2345天氣王歷史天氣數據 網址:[東城歷史天氣查詢_歷史天氣預報查詢_2345天氣預報](https://tianqi.2345.com/wea_history/71445.htm) ![image-20230702161423470](https ...
  • # 數列分段 Section II ## 題目描述 對於給定的一個長度為N的正整數數列 $A_{1\sim N}$,現要將其分成 $M$($M\leq N$)段,並要求每段連續,且每段和的最大值最小。 關於最大值最小: 例如一數列 $4\ 2\ 4\ 5\ 1$ 要分成 $3$ 段。 將其如下分段: ...
  • 本文通過閱讀Spring源碼,分析Bean實例化流程。 # Bean實例化入口 上一篇文章已經介紹,Bean實例化入口在AbstractApplicationContext類的finishBeanFactoryInitialization方法: ```java protected void fini ...
  • # 1、Java常用插件實現方案 ## 1.2、serviceloader方式 serviceloader是java提供的spi模式的實現。按照介面開發實現類,而後配置,java通過ServiceLoader來實現統一介面不同實現的依次調用。而java中最經典的serviceloader的使用就是J ...
  • **原文鏈接:** [Go 語言 context 都能做什麼?](https://mp.weixin.qq.com/s/7IliODEUt3JpEuzL8K_sOg) 很多 Go 項目的源碼,在讀的過程中會發現一個很常見的參數 `ctx`,而且基本都是作為函數的第一個參數。 為什麼要這麼寫呢?這個參 ...
  • POM( Project Object Model,項目對象模型 ) 是 Maven 工程的基本工作單元,它是一個 XML 文件,包含了項目的基本信息,用於描述項目如何構建,聲明項目依賴等等。執行任務或目標時,Maven 會在當前目錄中查找並讀取 POM,獲取所需的配置信息,然後執行目標。 1、基本 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...