Java-Servlet的請求和響應

Request 和Response 對象都是由服務器創建,管理,銷燬.  由我們來使用.

繼承體系結構:

ServletRequest(接口)<--------繼承<-------HttpServletRequest(接口)<--------實現 org.apache.catalina.connector.RequestFacade@6049a827
ServletResponse(接口)<---------繼承---  HttpServletResponse(接口)<-------------實現------org.apache.catalina.connector.ResponseFacade@3bec9d4

1.請求對象:獲取請求的消息

 

1)爲了防止編碼格式的錯誤,首先應該設置請求編碼和響應編碼.

 

//設置請求編碼和響應編碼
		request.setCharacterEncoding("utf-8");
		response.setContentType("text/html;charset=utf-8");

 

2)/獲取請求頭

 

String name = request.getHeader("username");//獲取請求頭的值
		long date  = request.getDateHeader(name);//獲取日期頭
		int i = request.getIntHeader(name);//獲取數字頭


3)獲取請求行

 

 

String method = request.getMethod();//獲取請求的方式:get/post
		String uri = request.getRequestURI();//獲取Uri
		StringBuffer url = request.getRequestURL();//獲取URL
		String addr = request.getRemoteAddr();//獲取IP地址
		String queryString = request.getQueryString();//獲取請求的參數
		String protocol = request.getProtocol();//獲取訪問的版本,瀏覽器的信息

4)獲取請求體:封裝post請求的請求參數

//獲取請求體:封裝post請求的請求參數
		BufferedReader reader = request.getReader();
		String line = reader.readLine();


5)獲取請求的參數

 

 

//獲取請求參數的不同方式
		String na = request.getParameter("username");//通過參數名稱獲取值
		String[] strings = request.getParameterValues("hobby");//通常用於複選框
		Map<String,String[]> map = request.getParameterMap();
		//遍歷map集合
		Set<String> keySet = map.keySet();
		for(String key:keySet){
			System.out.println(key);//遍歷參數名
			String[] ss = map.get(key);//獲取參數的值
			for(String v:ss){
				System.out.println(key+"="+v);
			}
		}
		Enumeration names = request.getParameterNames();//通過枚舉的方式獲取
		

6)中文亂碼的解決:post請求

 

 

//處理post請求中文亂碼的問題
		String n = request.getParameter("name");//服務器使用ISO-8859-1 的方式解碼
		byte[] bys = n.getBytes("ISO-8859-1");
		n = new String(bys,"utf-8");


7)重定向和請求轉發

 

重定向特點:兩次請求,兩次轉發;既可以訪問內部資源,也可以訪問外部資源,地址欄內的地址發生變化

請求轉發:一次請求,一次響應;只可以訪問項目內部的資源;地址欄的地址不發生改變.

 

//重定向
		//1.設置302狀態
		response.setStatus(302);
		response.setHeader("location", "http:baidu.com");
		//重定向:合二爲一
		response.sendRedirect("http:baidu.com");
		//請求轉發
		request.getRequestDispatcher("/demo1").forward(request, response);


重定向和請求轉發的區別:

1.一個web資源收到客戶端請求後,通知服務器去調用另外一個web資源進行處理,稱之爲請求轉發。

 

2.一個web資源收到客戶端請求後,通知瀏覽器去訪問另外一個web資源,稱之爲請求重定向。

3.RequestDispatcher.forward方法只能將請求轉發給同一個WEB應用中的組件;而HttpServletResponse.sendRedirect 方法還可以重定向到同一個站點上的其他應用程序中的資源,甚至是使用絕對URL重定向到其他站點的資源。
如果傳遞給HttpServletResponse.sendRedirect 方法的相對URL以“/”開頭,它是相對於整個WEB站點的根目錄;如果創建RequestDispatcher對象時指定的相對URL以“/”開頭,它是相對於當前WEB應用程序的根目錄。
調用HttpServletResponse.sendRedirect方法重定向的訪問過程結束後,瀏覽器地址欄中顯示的URL會發生改變,由初始的URL地址變成重定向的目標URL;調用RequestDispatcher.forward 方法的請求轉發過程結束後,瀏覽器地址欄保持初始的URL地址不變。

4.HttpServletResponse.sendRedirect方法對瀏覽器的請求直接作出響應,響應的結果就是告訴瀏覽器去重新發出對另外一個URL的訪問請求;RequestDispatcher.forward方法在服務器端內部將請求轉發給另外一個資源,瀏覽器只知道發出了請求並得到了響應結果,並不知道在服務器程序內部發生了轉發行爲。

 5.RequestDispatcher.forward方法的調用者與被調用者之間共享相同的request對象和response對象,它們屬於同一個訪問請求和響應過程;而HttpServletResponse.sendRedirect方法調用者與被調用者使用各自的request對象和response對象,它們屬於兩個獨立的訪問請求和響應過程。

2.響應對象:封裝響應的數據,當真正的響應之前,取出裏面的數據,給瀏覽器響應.

1)爲了防止編碼格式的錯誤,首先應該設置請求編碼和響應編碼.

 

//設置請求編碼和響應編碼
		request.setCharacterEncoding("utf-8");
		response.setContentType("text/html;charset=utf-8");

 

2)響應字符串:

 

 

//響應一個字符串'
		PrintWriter writer = response.getWriter();
		writer.write("正在請求");


3)響應一個圖片

 

 

//響應一個圖片
		String path = this.getServletContext().getRealPath("xxx.jpg");//獲取圖片的真是路徑
		//讀取文件
		FileInputStream  fis=new FileInputStream(new File(path));
		//獲取要讀的文件
		ServletOutputStream fos = response.getOutputStream();
		byte[]  by=new byte[1024];
		int len=0;
		while((len=fis.read(by))!=-1){
			fos.write(by,0,len);
			fos.flush();
		}
		//關閉資源
		fis.close();
		fos.close();

 

 

 

 

 

 

 

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