Response響應過程
- 在發送一個請求時,會找到
引擎
tomcat
- 引擎會找到對應的
應用
web
- 并且會建立
對象和
request
對象
response
- 找到應用後,會執行應用的
再去根據
web.xml
的内容建立
url-patten
對象
Servlet
- 并且會調用
對象的
Servlet
方法,并且把建立的
Service
對象和
request
對象傳入到方法當中
response
- 拿到
對象後,自己可以往響應當中寫入一些自己給用戶端的内容
response
- 通過
的方式進行寫入
response.getwrite().wirte("寫的内容")
- 寫的内容,是存到一個
緩沖區當中
response
- 當方法執行結束之後,
就會從
tomcat
緩沖區當中取出存儲的資料
response
- 取出你存儲的資料同時,它自己還會自動的往裡面添加一些伺服器相關的資訊進去
- 是以響應給浏覽器時,可以看到除了自己寫的内容,還會有一些伺服器相關的資訊
流程圖

學習Response
- 學習如何通過
設定響應行,響應頭,響應體即可
response
設定響應行
response.setStatus(200);
設定響應頭
-
代表添加新的内容
add
方法名 | 作用 |
addHeader(String name,String value) | 添加字元串請求頭 |
addIntHeader(String name,int value) | 添加數字請求頭 |
addDateHeader(String name,date) | 添加日期請求頭 |
response.addHeader("name", "BNTang");
response.addIntHeader("age", 23);
response.addDateHeader("birthDay",new Date().getTime());
- set 代表設定,更改已經存在的内容
方法名 | 作用 |
setHeader(String name,String value) | 設定字元串請求頭 |
setIntHeader(String name,int value) | 設定數字請求頭 |
setDateHeader(String name,Date value) | 設定日期請求頭 |
response.setHeader("name", "BNTang");
response.setIntHeader("age", 23);
response.setDateHeader("birthDay",new Date().getTime());
- 添加兩個相同的
name
重定向
- 什麼是重定向:到伺服器當中去找
Servlet1
-
當中沒有這個資源,告訴你去找
Servlet1
Servlet2
- 再去發送一個請求到
Servlet2
重定向的狀态碼
- 重定向的狀态碼是:302
重定向的特點
- 要通路兩次伺服器
- 第一次通路是人為的去通路
- 第二次是自動的通路
- 浏覽器位址欄會發生變化
設定重定向
- 設定響應碼
response.setStatus(302);
- 設定響應頭
response.setHeader("location", "/bntang/servlet2");
封裝的重寫向
- 每次都要設定狀态碼,和
比較麻煩
location
- 内部提供了一個封裝好了的一個方法
response.sendRedirect("/bntang/servlet2");
定時重新整理重定向
response.setHeader("refresh", "5;url=https://www.cnblogs.com/BNTang/");
- 5:代表
5秒
- url 的值為 5秒後要去跳轉的位址
設定響應體
通過write的方式來寫
- 格式如下:
response.getwrite().wirte(“要寫的内容”)
- 預設情況下寫的中文内容會亂碼
- 把寫的内容存到緩存區中使用的是
的編碼的方式進行存儲的
ISO8859-1
-
不支援中文,是以會亂碼
ISO8859-1
- 在存之前可以設定存放的編碼,如下:
response.setCharacterEncoding("UTF-8");
- 告知浏覽器使用的是
編碼的方式,如下:
utf-8
response.setHeader("Content-Type", "text/html;charset=UTF-8");
- 設定寫出的内容如下:
response.getWriter().write("小灰灰");
- 上面的代碼隻需要寫第二句就行,tomcat 看到設定了為
的編碼
utf-8
- 它在存資料的時候也會使用
的編碼
utf-8
- 使用封裝的寫法,如下:
response.setContentType("text/html;charset=UTF-8");
- 測試的方式就行自己啟動伺服器在浏覽器當中請求
即可驗證
Servlet
通過OutPutStream的方式來寫
FileInputSteam
方法名 | 作用 |
read | 讀取一個位元組 |
read(byte[] b) | 一次讀取多個位元組,并存放到數組 b 中 |
-
:讀取一個位元組,讀取的結果是一個 int 類型的 assic 碼
read
- 讀取到檔案結尾的時候,傳回的是一個
,讀取方式如下:
-1
FileInputStream fileInputStream = new FileInputStream("BNTang.txt");
System.out.println(fileInputStream.read());
-
:上面是一次一滴一滴給你,這種是一次裝一桶水再給你,傳回的是讀取了幾個位元組
read(byte[] b)
byte[] bytes = new byte[10];
int count = fileInputStream.read(bytes);
System.out.println(Arrays.toString(bytes));
- 讀取全部的資料,代碼如下:
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
FileInputStream fileInputStream = new FileInputStream("BNTang.txt");
byte[] bytes = new byte[5];
int len = 0;
while ((len = fileInputStream.read(bytes)) > 0) {
System.out.println(new String(bytes, 0, len));
}
fileInputStream.close();
}
- 之前讀的代碼也記得需要關閉流,釋放資源
FileOutputSteam
- 一下的方法是進行寫出用的我這裡就不示範了,同上
方法名 | 作用 |
write() | 一次性寫一個字元 |
write(buffer) | 一次性寫多個字元 |
write(buffer,0,len) | 一次性寫指定個數的字元 |
-
注意點
response
-
和
getWrite()
不能同時調用
getOutputSteam