Java Web程序設計——請求和響應(一)

Java Web程序設計——請求和響應(一)

思維導圖:
在這裏插入圖片描述

請求和響應的概述
  • 請求:在瀏覽器地址欄輸入地址,點擊回車請求服務器,這個過程就是一個請求過程。
  • 響應:服務器根據瀏覽器發送請求,返回數據到瀏覽器在網頁上進行顯示,這個過程就稱爲響應。

瀏覽器訪問Servlet的交互過程:
在這裏插入圖片描述

HttpServletResponse對象

  • 在HttpServletResponse接口中定義了向客戶端發送響應狀態碼、響應消息頭、響應消息體的方法。它的父接口是ServletResponse,在開發中通常使用HttpServletResponse。
發送狀態碼相關發方法
  • setStatus(int status)方法:用於設置HTTP響應消息的狀態碼,並生成響應狀態行。
  • sendError(int sc)方法:用於發送表示錯誤的狀態碼。
  • sendError(int sc,String sm):第一個參數表示狀態碼,第二個參數是狀態碼的描述。
    注:正常情況下,Web服務器會默認產生一個狀態碼爲200的狀態行。302:重定向;404:請求資源找不到;500:服務器代碼出現異常
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// 響應行相關的方法
		response.sendError(404,"請求資源不存在");
	}
發送響應消息頭相關方法
  1. 設置響應消息頭字段的方法:數據格式:key-value,有的是一個key,一個value,有的是一個key,多個value
  • setHeader(String key,String value):一個key,一個value
    比如:setHeader(“aa”,“AA”); setHeader(“aa”,“BB”); 最終結果:aa這個頭對應的值就是BB
  • addHeader(String key,String value):一個key,對應多個value
    比如:addHeader(“aa”,“AA”);addHeader(“aa”,“BB”);最終結果:aa這個頭對應的值就是AA和BB
protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		// 響應消息頭相關的方法
		// 在用戶名和密碼輸入錯誤的情況下,重新回到登錄頁面讓用戶重新輸入數據
		// 1.設置狀態碼
		response.setStatus(302);
		// 2.設置響應頭,完成重定向到登錄頁面
		response.setHeader("Location", "/chapter/login.html");
	}

在這裏插入圖片描述
2. 設置響應數據的長度

  • setContentLength(int src)
  1. 設置處理亂碼的方法:
  • setCharacterEncoding(String a):參數就一個碼錶格式
    比如:“utf-8”
  • setContentType(String a):參數代表響應數據的類型和碼錶格式
    比如:“text/html;charset=utf-8”
發送響應消息頭相關的方法
  • getOutputStream():通過respon向瀏覽器返回圖片、視頻等二進制數據的文件,當然也可以向瀏覽器返回文本數據
	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		// 響應體相關的方法
		// 字節流對象,向瀏覽器返回數據
		ServletOutputStream out = response.getOutputStream();
		String value = "web";
		out.write(value.getBytes());
	}
  • getWriter():通常response向瀏覽器返回文本數據,不能向瀏覽器返回圖片、視頻等二進制文件
protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		// 響應體相關的方法
		// 字符流向瀏覽器輸出數據
		PrintWriter pWriter = response.getWriter();
		String value = "web----";
		pWriter.write(value);
	}

處理字節流的中文亂碼問題

  • 字節流向瀏覽器輸出中文,可能會出現亂碼。出現亂碼的原因:服務器端的編碼格式和瀏覽器的編碼格式不一致引起的
package chapter.response;

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

/**
 * Servlet implementation class ChineseServlet
 */
public class ChineseServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
	 *      response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		// 1.處理字節流的中文亂碼問題
		String data = "中國";
		ServletOutputStream out = response.getOutputStream();
		// 2.處理亂碼:服務器端的編碼和瀏覽器端的編碼保持一致
		// 3.讓瀏覽器端的編碼也是utf-8
		response.setHeader("Content-Type", "text/html;charset=utf-8");
		//response.setContentType("text/html;charset=utf-8");
		// 4.讓服務器端的中文編碼格式是utf-8
		out.write(data.getBytes("utf-8"));
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
	 *      response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

在這裏插入圖片描述
處理字節流的中文亂碼有兩種方式:

  1. response.setHeader("Content-Type", "text/html;charset=utf-8");
  2. response.setContentType("text/html;charset=utf-8");
  • 字符流向瀏覽器輸出中文,肯定會亂碼
    亂碼形式:??,會出現問號,這個問號就表示中文的編碼格式是採用iso8859-1編碼的,這種編碼格式不支持中文
    處理原則:讓瀏覽器和服務器的編碼保持一致
    在這裏插入圖片描述
package chapter.response;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class ChineseServlet
 */
public class ChineseServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
	 *      response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		// 1.處理字符流的中文亂碼問題
		// 2.處理服務器的編碼,讓這個編碼支持中文
		response.setCharacterEncoding("utf-8");
		// 3.處理器瀏覽器端的編碼
		response.setHeader("Content-Type", "text/html;charset=utf-8");
		//response.setContentType("text/html;charset=GB18030");
		String data = "中國";
		// 4.獲取字符流
		PrintWriter pw = response.getWriter();
		pw.print(data);
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
	 *      response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

在這裏插入圖片描述

處理字符流中文亂碼有兩種方式:

  1. response.setCharacterEncoding("utf-8"); response.setHeader("Content-Type", "text/html;charset=utf-8");
  2. response.setContentType("text/html;charset=GB18030");

注:在處理字符流和字節流輸出中文亂碼時,都採用:response.setContentType("text/html;charset=utf-8");

常見的編碼格式:

  • GBK GBK18030 GB2312:這些都是支持中文的編碼格式,當然支持其他一些字符
  • utf-8:萬能碼錶格式,支持所有的字符
  • iso-88589-1:不支持中文

實現網頁定時刷新並跳轉

  • 定時跳轉:從一個註冊頁面跳轉到登錄頁面,輸入之前註冊的用戶名和密碼
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// 1.定時跳轉:需要用到Refresh響應頭
		response.setHeader("Refresh", "5;URL=/chapter/login.html");
	}

  • 定時刷新:在當前頁面的地址不發生變化,但是當前頁面自己定時刷新,頁面數據會發生變化
protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		// 定時刷新
		response.setHeader("Refresh", "5");
		response.getWriter().print(new Date());
	}

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章