1. 程式人生 > >第二十六章:Servlet下

第二十六章:Servlet下

HttpServletRequest類
a)HttpServletRequest類有什麼作用。
HttpServletRequest類它的作用是。每次只要有請求進來 。Tomcat伺服器就會把請求的協議內容封裝到HttpServletRequest物件中。
我們主要是從Request類中獲取請求的資訊。它表示了請求的全部資訊。

b)HttpServletRequest類的常用方法
i.getRequestURI() 獲取請求請求資源地址
ii.getRequestURL() 獲取請求的絕對路徑(又叫統一資源定位符)
iii.getRemoteHost() 獲取客戶端的ip地址

localhost做為ip訪問得到0:0:0:0:0:0:0:1

127.0.0.1 做為ip訪問得到 127.0.0.1
iv.getHeader() 獲取請求頭
v.getParameter() 獲取請求的引數
vi.getParameterValues() 獲取請求引數(多個值)
vii.getMethod() 獲取請求的方式GET或POST
==========域物件================
viii.setAttribute(key, value); 儲存資料
ix.getAttribute(key); 獲取資料
================================
x.getRequestDispatcher() 獲取請求轉發物件
xi.getCookies() 獲取Cookie物件
xii.getSession() 獲取Session物件

reqeust常用API:

protected void doGet(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		// i.getRequestURI() 獲取請求請求資源地址
		System.out.println(request.getRequestURI());
		// ii.getRequestURL() 獲取請求的絕對路徑
		System.out.println(request.getRequestURL());
		// iii.getRemoteHost() 獲取客戶端的ip地址
		System.out.println(request.getRemoteHost());
		// iv.getHeader() 獲取請求頭
		System.out.println(request.getHeader("User-Agent"));
		System.out.println(request.getHeader("Host"));
		// vii.getMethod() 獲取請求的方式GET或POST
		System.out.println(request.getMethod());
}

c)如何獲取請求引數(重要)
頁面的表單:


使用者名稱:

密碼:

興趣愛好:
C++
C
Visual Basic
JavaScript





Servlet程式的程式碼:

public class ParameterServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		// 獲取請求引數,使用者名稱資訊
		String username = request.getParameter("username");
		// 獲取請求引數,密碼資訊
		String password = request.getParameter("password");
		// 獲取興趣愛好
		String[] hobbies = request.getParameterValues("hobby");
		System.out.println("使用者名稱:" + username);
		System.out.println("密碼:" + password);
		// Arrays.asList 把陣列轉換對應的List集合
		if (hobbies != null) {
			System.out.println("興趣愛好:" + Arrays.asList(hobbies));
		}
	}
}

d)GET請求的中文亂碼解決
第一種方案:

1、先把收到的請求引數以iso-8859-1進行編碼
2、再以UTF-8進行解碼

// 獲取請求引數,使用者名稱資訊
		String username = request.getParameter("username");		
//		1、先把收到的請求引數以iso-8859-1進行編碼
		byte[] bytes = username.getBytes("iso-8859-1");
//		2、再以UTF-8進行解碼
	username= new String(bytes, "UTF-8");

第二種方案:
找到Tomcat伺服器的配置檔案server.xml配置檔案,找到Connector標籤,新增URIEncoding=“UTF-8”

<Connector URIEncoding="UTF-8" connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>

e)POST請求的中文亂碼解決
第一種方案(不推薦使用):

//		1、先把收到的請求引數以iso-8859-1進行編碼
		byte[] bytes = username.getBytes("iso-8859-1");
//		2、再以UTF-8進行解碼
		username= new String(bytes, "UTF-8");

第二種方案(推薦使用):

// 解決post中文亂碼終極方案
// 一定要在呼叫getParameter方法之前才有效
request.setCharacterEncoding("UTF-8");

f)請求的轉發(在jsp的時候使用)
在這裡插入圖片描述
g)Base標籤的作用
在這裡插入圖片描述
h)Web中的相對路徑和絕對路徑
相對路徑:
./ 當前目錄
…/ 上一級目錄
資源名 相當於./資源名 ./可以省略
絕對路徑:
http://ip:port/工程名/資源名
在實際專案開發中,不允許簡單的使用相對路徑!!!
實際專案開發中,只能使用絕對路徑 或 base+相對

i)web中/斜槓的不同意義

斜槓/ 就是表示一個絕對路徑。
/ 在html頁面上,被瀏覽器解析得到是:http://ip:prot/
/ 在伺服器程式碼上。表示: http://ip:port/工程名/
在web.xml中配置url-pattern /hello ====>>>> http://ip:port/工程名/hello
請求轉發request.getRequestDispatcher("/a/b/c.html") 表示http://ip:port/工程名/a/b/c.html
servletContext.getRealPath(“/”); =====>>>>>> 表示到http://ip:prot/工程名/
伺服器程式碼中的特殊情況:
response.sendRedirect(“/”); =====>>>> 表示到埠號http://ip:prot/

6.HttpServletResponse類
a)HttpServletResponse類的作用
httpServletResponse類,表示響應。所有響應的http協議都可以通過HttpServletResponse類去進行設定。
每次請求進來都會建立一個Request物件,也會建立一個Response物件。Tomcat伺服器負責建立。
b)兩個輸出流的說明。
響應有兩種流,一種是字元流,一種是位元組流。
response.getOutputStream() 位元組流 檔案下載使用
response.getWriter() 字元流 回傳字串資訊(使用頻率最高)
你使用了位元組流,就不能使用字元流,
你使用字元流,就不能使用位元組流。
兩個流同時使用就會出現如下異常:
在這裡插入圖片描述
c)如何往客戶端回傳資料

 protected void doGet(HttpServletRequest request,
    			HttpServletResponse response) throws ServletException, IOException {
    		// 往客戶端回傳字串資料
    		// 1、先獲取字元流
    		PrintWriter writer = response.getWriter();
    		// 2、呼叫字元流的write方法輸出字串
    		writer.write("this is the content of response!!!");
    }

d)響應的亂碼解決
第一種方案(不推薦使用):

// 設定響應的字符集為UTF-8,設定了伺服器支援中文輸出
		response.setCharacterEncoding("UTF-8");
		// ISO-8859-1 是預設的字符集,它不支援中文
		System.out.println( response.getCharacterEncoding() );
		// 設定響應頭,Content-Type,
		// text/html; 表示返回的是html內容。
		// charset=UTF-8	告訴客戶端使用UTF-8字符集檢視 
	response.setHeader("Content-Type", "text/html; charset=UTF-8");

第二種方案是(推薦使用):

 // 同時設定伺服器和客戶端都使用UTF-8字符集,
		// 並且還設定了響應頭
		// 必須在獲取流物件之前呼叫
	response.setContentType("text/html; charset=UTF-8");

e)如何設定響應頭和響應狀態碼

protected void doGet(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		System.out.println("請求進來 了,這是Response1");
		// 設定響應狀態碼302
		response.setStatus(302);
		// 設定響應頭
		response.setHeader("Location", "http://localhost:8080/day07/response2");
}

f)請求重定向

//也是請求重定向(推薦)
	response.sendRedirect("http://localhost:8080/day07/response2");

請求重定向的特點:
在這裡插入圖片描述
請求轉發和重定向的對比
在這裡插入圖片描述