request&response

基本概念:html

        在調用service以前,服務器(tomcat)會將用戶的請求封裝到request對象裏面,同時也會建立一個response對象,經過service方法傳遞到咱們的Servlet中。咱們作必定的處理,將處理的結果,封裝到response中,再將response對象返回給服務器,服務器響應到客戶端。java

response:web

1.設置響應體
瀏覽器

(1) 向客戶端響應文本緩存

PrintWriter response.getWriter();tomcat

writer.write("文本") ---  向response的緩衝區中去寫服務器

注:向客戶端回寫中文數據時 亂碼 post

亂碼的緣由:response緩衝區的編碼方式是iso8859-1(西歐編碼方式)性能

解決方式:response.setContentType("text/html;charset=UTF-8");編碼

上面的代碼完成兩個設置:(1) 設置response緩衝區的編碼---response.setCharacterEncoding("UTF-8");

                                          (2) 設置瀏覽器的解碼方式----response.setHeader("Content-Type", "text/html;charset=UTF-8")

(2) 向客戶端響應字節

ServletOutputStream out = response.getOutputStream();

2.response的一些細節:

(1) response.getOutputStream()得到的流不用手動關閉 --- web容器幫咱們關閉

(2) 重定向:302+Location

response有一個重定向的方法:sendRedirect(url)

(3) response有兩個獲取流的方法 getWriter和getOutputStream 不能一塊兒使用

(4) response緩存區有大小 默認是8k  經過setBufferSize設置大小  只能向大設置

(5) resposse緩衝區的內容被真正的刷出 不能再進行轉發和重定向

    什麼狀況下 緩衝區的內容被刷出?

                response.flushBuffer();

                緩衝區的內容寫滿了

                轉發或重定向也會刷出緩衝區的內容

(6) 當進行轉發或重定向時 以前寫到response緩衝區的內容會被清空  可是寫入的頭仍然有效

servlet01.java

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

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

public class servlet01 extends HttpServlet {

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

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		// 設置響應頭
		response.setHeader("vw", "v6");
		// 追加響應頭
		response.addHeader("mu", "77");
		// 字符流響應正文,瀏覽器顯示信息
		/*
		 * PrintWriter writer = response.getWriter(); writer.print("thanks");
		 */
		// 字節流響應正文(字節流和字符流不能同時使用)
		
		  ServletOutputStream outputStream = response.getOutputStream();
		  outputStream.write("hello".getBytes());
		 
	}
}

request:

get提交方式有哪些?

直接輸入網址 、超連接<a href=""> 、<from method="get"> 、重定向  、定時跳轉 、  js的location.href

post提交方式哪些?

<form method="post">

URI與URL?

URI:全球資源標識符   能夠是絕對的,也能夠是相對的。相對的都是uri  /day10_205/request1    C:\\

URL: 全球資源定位符  URL是一種具體的URI  http://   

一、獲取請求行的數據

得到請求方式:getMethod();

得到訪問資源:getRequestURI/getRequestURL

獲取訪問的資源後面參數的字符串:getRequestQuery()

獲取客戶機的ip:getRemoteAddr()

獲取web應用的名稱:getContextPath()

二、獲取請求頭的信息

getHeader(頭的名稱)根據指定頭名稱獲取值

getHeaderNames()獲取全部的請求頭的名字

getHeaders()獲取指定的頭的全部值

getIntHeader()

getDateHeader()

Referer:該資源的訪問來源  ----- 防盜鏈

三、獲取請求體的數據

(1) request.getParameter(name的屬性值);

(2)request.getParameterNames();  能夠獲得全部的要提交標籤的name的屬性值。

(3)request.getParameterValues("hobby"); 多個屬性值 。例如checkbox 。

注:

request亂碼問題

緣由:

 咱們提交信息  =====》瀏覽器會按照utf-8的形式給咱們傳遞的信息 進行編碼======

 服務器按照iso-8859-1的的形式給咱們解碼。

解決: 

  亂碼中文 ==== 》按照iso-8859-1編碼===》 按照utf-8的格式進行解碼===》咱們提交信息 

post請求的亂碼解決方案

   request.setCharacterEncoding("utf-8");

get,post請求通用解決方式

String str1 = new String (name.getBytes("iso-8859-1"),"utf-8");

4. request對象是一個域對象

可見範圍:一次請求鏈中

setAttribute(String name,Object value)

getAttrbute(String name)

removeAttrbute(String name)

5. 請求轉發

request.getRequestDispatcher().forward(request,response);

轉發和重定向的區別?

    (1) 轉發地址不變 客戶端一次請求  重定向地址變化 兩次請求

    (2) 轉發是web應用內部的行爲 重定向是客戶端從新訪問的

    (3) 轉發的性能高一些

6.請求包含:

request.getRequestDispatcher().include(request,response);

RequestServlet01.java

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;
import java.util.Map;

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

public class RequestServlet01 extends HttpServlet {

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

	
	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		//解決request請求亂碼問題(post提交數據)
		request.setCharacterEncoding("utf-8");
		/*亂碼緣由:
		 * 咱們提交信息  =====》瀏覽器會按照utf-8的形式給咱們傳遞的信息 進行編碼======》
 			服務器按照iso-8859-1的的形式給咱們解碼。
		 * get請求方式解決亂碼方法
			String str1 = new String (name.getBytes("iso-8859-1"),"utf-8");
		 */
		//獲得用戶的請求方式
		String method = request.getMethod();
		//獲得協議
		String protocol = request.getProtocol();
		//獲得資源路徑
		 String requestURI = request.getRequestURI();
		System.out.println(method+"--"+protocol+"--"+requestURI);
		System.out.println("------------------------------------------------------");
		/*
		 * POST--HTTP/1.1--/Response_Request_test/RequestServlet01
		 */
		//協議的請求資源路徑
		StringBuffer requestURL = request.getRequestURL();
		//獲得用戶的地址
		String remoteAddr = request.getRemoteAddr();
		//獲得資源名或者項目名
		String contextPath = request.getContextPath();
		System.out.println(requestURL+"--"+remoteAddr+"--"+contextPath);
		/*
		 * http://localhost:8080/Response_Request_test/RequestServlet01
		 * --0:0:0:0:0:0:0:1
		 * --/Response_Request_test
		 */
		System.out.println("--------------------------------------");
		//根據請求頭中相應的name得到相應的請求值
		String header = request.getHeader("Host");
		System.out.println(header);
		/*
		 * localhost:8080
		 */
		//獲得全部請求頭的name值
		Enumeration headerNames = request.getHeaderNames();
		while(headerNames.hasMoreElements()){
			String nextElement = (String)headerNames.nextElement();
			System.out.println(nextElement);
		}
		/*	 
		accept
		referer
		accept-language
		user-agent
		content-type
		accept-encoding
		host
		content-length
		connection
		cache-control
		 */
		//根據用戶表單的name得到相應的值
		String username = request.getParameter("username");
		System.out.println("username:"+username);
		/*username:123*/
		//獲得咱們提交表單的標籤name的屬性值
		Enumeration<String> names = request.getParameterNames();
		while(names.hasMoreElements()){
			String key = names.nextElement();
			System.out.println(key);
		}
		/*
		username
		userpass
		 */
		//將用戶的請求的信息放到map裏面
		Map<String,String[]> map = request.getParameterMap();
		String usrname = map.get("username")[0];
		System.out.println(usrname);
		/* 123*/
		//獲得一個屬性值對應多個的值(checkbox)
		String[] values = request.getParameterValues("hobby");
		for(String value:values){
			System.out.println(value);
		}
		/*
		
		soccer
		basketball
		table tennis
		 */
	}

}
本站公眾號
   歡迎關注本站公眾號,獲取更多信息