JavaWeb筆記005 request和response的常用方法

request:請求

操作請求行

格式:
	請求方式 請求資源 協議/版本
常用方法:HttpServletRequest
	掌握
		String getMethod():獲取請求方式
		String getRemoteAddr():獲取ip地址
		String getContextPath() :在java中獲取項目名稱  (例如/demo1)

	
	瞭解:
		getRequestURI():獲取的是 從項目名到參數之前的內容  /demo1/regist
		getRequestURL():獲取的帶協議的完整路徑   http://localhost/demo1/regist
		String getQueryString():get請求的所有參數   username=tom&password=123
		String getProtocol():獲取協議和版本
		
例如:請求行
	GET /demo1/row?username=tom&password=123 HTTP/1.1
	
	
	
	    //獲取 請求方式
		String m=request.getMethod();
		System.out.println("方式:"+m);
		
		//獲取請求資源
		String uri = request.getRequestURI();
		String url = request.getRequestURL().toString();
		System.out.println("uri:"+uri);
		System.out.println("url:"+url);
		
		//獲取請求參數的字符串
		String s = request.getQueryString();
		System.out.println("get請求參數:"+s);
		
		//獲取協議版本
		String p = request.getProtocol();
		System.out.println("協議:"+p);
		
		System.out.println("-------重要的----");
		
		//獲取請求的ip
		String ip = request.getRemoteAddr();
		System.out.println("ip:"+ip);
		
		//獲取項目名
		String path = request.getContextPath();
		System.out.println("項目路徑:"+path);
		
		
		輸出:
		方式:GET
        uri:/demo1/row
        url:http://localhost/demo1/row
        get請求參數:username=tom&password=123
        協議:HTTP/1.1
        -------重要的----
        ip:0:0:0:0:0:0:0:1
        項目路徑:/demo1

操作請求頭

		格式:key/value(value可以是多個值)
		常用方法:
			★String getHeader(String key):通過key獲取指定的value (一個)
			
			瞭解:
				Enumeration getHeaders(String name) :通過key獲取指定的value(多個)
				Enumeration getHeaderNames() :獲取所有的請求頭的名稱
				int getIntHeader(String key):獲取整型的請求頭
				long getDateHeader(String key):獲取時間的請求頭
		重要的請求頭:
			user-agent:瀏覽器內核 msie firefox chrome
			referer:頁面從那裏來 防盜鏈
			
			
			
	    //獲取瀏覽器內核
		String agent = request.getHeader("user-agent");
		System.out.println(agent);
		
		

操作請求參數

操作請求參數 ★
		username=tom&password=123&hobby=drink&hobby=sleep
		常用方法:
			String getParameter(String key):獲取一個值
			String[] getParameterValues(String key):通過一個key獲取多個值
			Map<String,String[]> getParameterMap():獲取所有的參數名稱和值
			
			
			
			
				//獲取username
		String username = request.getParameter("username");
		System.out.println("username:"+username);
		
		//獲取愛好 多個值
		String[] hobby = request.getParameterValues("hobby");
		System.out.println("hobby:"+Arrays.toString(hobby));
		
		//獲取所有
		System.out.println("============");
		Map<String, String[]> map = request.getParameterMap();
		for(String key:map.keySet()){
			System.out.println(key+"::"+Arrays.toString(map.get(key)));
		}
		
		輸出:
		username:tom
		---------values---------
		hobby:[drink, sleep]
		=====map=======
		username::[tom]
		password::[123]
		hobby::[drink, sleep]

請求亂碼

請求的中文亂碼:
	對於get請求:參數追加到地址欄,會使用utf-8編碼,服務器(tomcat7)接受到請求之後,使用iso-8859-1解碼,所以會出現亂碼
	對於post請求,參數是放在請求體中,服務器獲取請求體的時候使用iso-8859-1解碼,也會出現亂碼
	
	通用的方法:
		new String(參數.getBytes("iso-8859-1"),"utf-8");
	針對於post請求來說:只需要將請求流的編碼設置成utf-8即可
		request.setCharacterEncoding("utf-8");

請求轉發

域對象:
	request:
		創建:一次請求來的時候
		銷燬:響應生成的時候
		作用:
			一次請求裏面的數據
		請求轉發(請求鏈,請求串)
			request.getRequestDispatcher("內部路徑").forward(request,response);


<a href="/demo1/dis1?money=10">g_請求轉發借錢</a><br>			
			
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	System.out.println("我說:稍等");
	
	//將借錢人的姓名放入reuqest中
	request.setAttribute("username", "++");
	
	//請求轉發
	request.getRequestDispatcher("/dis2").forward(request, response);
}

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	doGet(request, response);
}

// /dis2 servlet代碼
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	System.out.println("老師曰:需要多少? 我答:"+request.getParameter("money"));
	System.out.println("老師又曰:幹嘛用啊? 我答:借給"+request.getAttribute("username"));
}

response:響應

作用:
	往瀏覽器寫東西
組成部分:
	響應行 響應頭 響應體

操作響應行

	格式:
		協議/版本 狀態碼 狀態碼說明
	狀態碼:
		1xx:已發送請求
		2xx:已完成響應
			200:正常響應
		3xx:還需瀏覽器進一步操作
			302:重定向 配合響應頭:location
			304:讀緩存
		4xx:用戶操作錯誤
			404:用戶操作錯誤.
			405:訪問的方法不存在
		5xx:服務器錯誤
			500:內部異常
	常用方法:
		setStatus(int 狀態碼):針對於 1 2 3 
		瞭解 :
			sendError(int 狀態碼):針對於 4xx和5xx
			

操作響應頭


格式:key/value(value可以是多個值)
常用的方法:
	setHeader(String key,String value):設置字符串形式的響應頭
	瞭解:setIntHeader(String key,int value):設值整形的響應頭
	瞭解:setDateHeader(String key,long value):設值時間的響應頭
	
	addHeader(String key,String value):添加置字符串形式的響應頭 之前設置過則追加,若沒有設置過則設置
	瞭解:addIntHeader(String key,int value):添加整形的響應頭
	瞭解:addDateHeader(String key,long value):添加時間的響應頭
常用的響應頭:
	location:重定向
	refresh:定時刷新
	content-type:設置文件的mime類型,設置響應流的編碼及告訴瀏覽器用什麼編碼打開
	content-disposition:文件下載
	
	重定向:	
		方式1:
			★response.sendRedirect("/demo1/loc2");
		方式2:
			response.setStatus(302);
			respooen.setHeader("location","/demo1/loc2");
			
	定時刷新:
		方案1:設置頭 refresh 昨天做過
			respooen.setHeader("refresh","秒數;url=跳轉的路徑");
		方案2:http的meta標籤
			<meta http-equiv="refresh" content="3;url=/demo1/refresh2.html">
			
// 重定向		
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	System.out.println("我說:借錢~~");
	
	System.out.println("我又說:找A老師");
	
	//方式1:理解
	//設狀態碼 302
	//response.setStatus(302);
	
	//設置響應頭
	//response.setHeader("location", "/demo1/loc2");
	
	//方式2:重要,訪問完這個servlet後,瀏覽器會跳轉到/demo2/loc2
	response.sendRedirect("/demo2/loc2");
}

操作響應體 處理響應中文亂碼:

頁面上要展示的內容
常用方法:
	Writer getWriter():字符流
	ServletOutputStream getOutputStream() :字節流
	
	自己寫的東西用字符流,其他一概用字節流.
	
處理響應中文亂碼:
	方式1:★
		response.setContentType("text/html;charset=utf-8");
	方式2:理解
		response.setHeader("content-type", "text/html;charset=utf-8");

注意:
	兩個流互斥
	當響應完成之後,服務器會判斷一下流是否已經關閉,若沒有關閉,服務器會幫我們關閉.(底層使用的緩衝流)

請求轉發和重定向區別

	重定向發送兩次請求,請求轉發一次請求
	
	重定向地址欄發生該表,請求轉發不變
	
	重定向是從瀏覽器發送,請求轉發是服務器內部
	
	重定向不存在request域對象,請求轉發可以使用request域對象
	
	重定向是response的方法,請求轉發是request的方法
	
	重定向可以請求站外資源,請求轉發不可以	
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章