# 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頭信息。並且地址欄最終看到的地址是和第一次請求地址不同的,地址欄已經發生了變化。
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);
}
}
請求轉發和重定向的區別
請求轉發和重定向比較
兩者都可以進行跳轉,根據實際需求選取。
代碼演示:
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>