1. 程式人生 > >response物件&重定向 詳解

response物件&重定向 詳解

2018年10月26日16:10:47 於易動


客戶端瀏覽器和伺服器: 
 請求的時候: request物件:    HttpServletRequest 
 響應的時候: response物件: HttpServletResponse 
 
 service(HttpServletRequest request, HttpServletResponse response )

這兩個引數物件,經常成對存在
 
 
 response物件:  
 1: 生命週期:
   誕生:  伺服器端接收到請求的時候,建立。 
   銷燬:  service方法執行完畢,也就是響應結束, 物件銷燬。 

生命週期很短暫,唉~
   
   
 2: 獲得: 直接使用: tomcat伺服器已經建立好。 
 
 3: 作用: 
  a: 設定響應正文: 
  b: 設定響應頭資訊: 
  c: 傳送狀態碼: 
  d: 重定向: 
  
  
  
  b: 設定響應頭資訊:  告知瀏覽器, 瀏覽器可以根據響應頭資訊進行解析文件: 
   response.setHeader("headName","headValue"); 預設頭和頭的值 都是String型別。

 
   setDateHeader(java.lang.String name, long date)  頭是String型別。 頭值Date型別。 
   
   getHeader(java.lang.String name) 返回的String型別。

 
   getHeaderNames()  獲得所有頭的名稱:

 
   getHeaders(java.lang.String name)   獲得一個頭對應多個值的情況。 

import java.io.IOException;

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

/*
 * 演示response物件的: 設定響應頭資訊: 
 * response.setHeader(); 
 */
public class AServlet 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.setCharacterEncoding("utf-8");
		response.setContentType("text/html;charset=utf-8");
		
		
		response.setHeader("content-type", "text/html;charset=gbk"); 
		
		//常見的:  和頁面重新整理相關: 
//		response.setHeader("refresh", "5");//  設定頁面5S重新整理一次。
		
//		response.setHeader("refresh", "5;http://www.baidu.com");//5S後 重新整理到百度。 
		
		//設定頁面的不快取: 
		response.setHeader("expires", "-1"); //頁面立刻過期: 
		response.setHeader("pragma", "no-cache");// 這是http1.0不快取: 
		response.setHeader("cache-control", "no-cache"); 
		
	}

}


  a: 設定響應正文:  
  方式一: 使用字元流: 
   response.getWriter(); PrintWriter;
   響應的內容: 
   (1)可以是字串型別。 
   (2)可以是html標籤。  瀏覽器能夠自動解析。  
 方式二: 使用位元組流: 
   response.getOutputStream(); OutputStream: 
   
   注意: response物件 使用字元流或者是位元組流,只能選擇其中的一個。  不能同時使用。 
   如果同時使用,就會觸發一個異常: IllegalStateException 
   

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;

/*
 * response 物件:設定響應正文: 
 *  
 *  方式一: 使用字元流: 
 *  方式二: 使用位元組流: 
 */
public class BServlet 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.setCharacterEncoding("utf-8");
		response.setContentType("text/html;charset=utf-8");
		
		//使用字元的方式: 設定響應內容: 
		PrintWriter out = response.getWriter();
		out.println("俊哥");
		out.println("<br/>");
		out.println("<font color='red' size='7'>你很帥</font>");
		
		
		
		out.close();
		
		
		//使用位元組流 設定響應體: 
		ServletOutputStream outputStream = response.getOutputStream();
		outputStream.write("俊哥 ,你真的很帥~ oh year".getBytes());
		
		outputStream.close(); 
	
	}

}


   c: 設定響應狀態碼, 和其他的API方法: 
   sendError(int sc)                             傳送一個錯誤的狀態碼; 
   sendError(int sc,String message);  傳送錯誤的狀態碼,並且帶有描述性的資訊。 
   setStatus(int code);                         給客戶端瀏覽器傳送一個狀態碼。 
   

import java.io.IOException;

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

/*
 * 設定狀態碼 和其他的API方法: 
 */
public class CServlet 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.setCharacterEncoding("utf-8");
		response.setContentType("text/html;charset=utf-8");
		
		//傳送一個錯誤的狀態碼: 
//		response.sendError(404,"你訪問的資源,存在的,當時不給看"); 
		
		response.setStatus(500); 
	}

}

 D:重定向: (重點)面試問題

訪問的是bservlet,位址列會發生變化
   特點: 
   (1)兩次請求 兩次響應。 
   (2)位址列會發生變化。  最終顯示的是重定向後的地址。 
   (3)重定向是客戶端的行為: 
   (4)重定向的地址可以是外部的資源。  
   (5)負責重定向的servlet 不要向客戶端瀏覽器傳送資料, 可能會引發異常。 
   
  使用程式碼實現: 
  實現方式一: 
     response.setStatus(302); 
     response.setHeader("location","URL"); 
     

負責重定向的servlet:

import java.io.IOException;

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

/*
 * 負責重定向的servlet: 
 */
public class DServlet 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.setCharacterEncoding("utf-8");
		response.setContentType("text/html;charset=utf-8");
		
		response.getWriter().println("這是負責重定向的Dservlet。 ");
		
		//完成重定向: 
//		response.setStatus(302); 
//		response.setHeader("location", "/javaEE-06/servlet/EServlet");// EServlet: 屬於本系統內資源。  
//		response.setHeader("location", "http://www.baidu.com");// 定向到站外的資源。 
		
		
		//使用便捷方法: 
		response.sendRedirect("EServlet"); //                   / : 相對於主機: http://locahost:8080
		// 沒有使用/開頭: 相對於當前檔案的存在位置:  建議使用/開頭。 
		
	}

}

被重定向的servlet:

import java.io.IOException;

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

/*
 * 被重定向過來的servlet。 
 */
public class EServlet 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.setCharacterEncoding("utf-8");
		response.setContentType("text/html;charset=utf-8");
		
		response.getWriter().println("我是被重定向過來的EServlet");
	}

}

 
     方式二: 完成重定向的便捷方式: 
     response.sendRedirect("location "); 

使用 /開頭       : 其中的location是相對路徑,相對於主機。

沒有使用/ 開頭:是相對於當前檔案的位置