1. 程式人生 > >域物件 請求轉發 請求重定向與HttpServletResponse響應

域物件 請求轉發 請求重定向與HttpServletResponse響應

域物件獲取全域性配置資訊與伺服器上檔案真實路徑

(1.域物件(在一定範圍內 儲存資訊的物件)
ServletContext 範圍:整個程式中都可以訪問到 並且只有一個(單例物件)
每個servlet都可以訪問到這個域物件

獲取ServletContext物件的方式
方式1:從ServletConfig物件中獲取
方式2:從父類中直接獲取
注意:所有的域物件都有 設定 獲取 刪除的方法
    // 方式1
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
    throws ServletException, IOException {
        // 從servletConfig物件中獲取
ServletContext application = this.getServletConfig().getServletContext(); // 新增一個數據到context域中 // 相當於新增一個鍵值對 application.setAttribute("username,"zhangsan"); } // 方式2 protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 從父類中直接獲取域物件
Object object = this.getservletContext().getAttribute("username"); System.out.println(object); (2.設定全域性配置資訊 在web.xml中進行全域性資訊的配置 在<servlet></servlet>外新增全域性資訊 <context-param> <param-name>key</param-name> <param-value>value</param-value> </context-param> // 獲取全域性配置資訊
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 獲取context ServletContext application = this.getServletContext(); // 獲取全域性配置資訊 String value = application.getInitParameter("key"); System.out.println(value); } (3.獲取伺服器上的真實路徑 並讀取 使用Conttext域物件獲取 可以獲取到伺服器上任意資源路徑 // 在工程src資料夾下建立a.properties檔案 並獲取 private void fun1() throws IOException, FileNotFoundException { // 獲取a檔案 ServletContext application = this.getservletContext(); // 獲取伺服器上的真實路徑(絕對路徑或磁碟路徑) String path = application.getRealPath("/WEB/INF?classes/a.properties"); // 讀取檔案 Properties properties = new Properties(); properties.load(new FileInputStream(path)); System.out.println(properties.getProperty("key")); }

請求轉發與請求重定向

(4.請求轉發與請求重定向
// 請求轉發:瀏覽器只是發起了一次請求 servlet內部做的請求轉發 瀏覽器並不知道
public class Test01 extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
    System.out.println("要借錢");
    System.out.println("沒有 找test02")
    // 獲取域物件
    ServletContext application = this.getServletContext();
    // 從context域中 獲取請求轉發器
    RequestDispatcher dispatcher = application.getRuquestDispatcher();
    // 進行請求轉發
    dispatcher.forward(request,response);
    System.out.println("錢已搞定");

 public class Test02 extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
    System.out.println("有錢 這是test02");
執行結果:
    要借錢
    沒有 找test02
    有錢 這是test02
    錢已搞定

// 請求重定向:發起了兩次請求(請求地址發生了變化)
   瀏覽器發起請求(請求Servlet)
   Servlet給瀏覽器一個響應
   在響應中會攜帶一個重定向響應頭(頭中有重定向的訪問地址)
   瀏覽器接到這個響應後 發現重定向響應頭 
   再一次發起請求 去訪問重定向響應頭中的地址
   // 通過新增重定向響應頭的方式 請求重定向
   public class Test03 extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
    System.out.println("要借錢");
    System.out.println("沒有 去找test04");
    // 新增重定向響應頭
    // 注意:新增 頭資訊 訪問地址的時候 需要寫明工程名
    rewponse.setHeader("location","/sh-web-servlet/test04");
    // 新增重定向狀態碼
    response.setStatus(302);
    System.out.println("借錢去了");
}
public class Test04 extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
    System.out.println(錢被借走);
執行結果:
        要借錢
        沒有 去找test04
        借錢去了
        錢被借走

伺服器響應物件

(5.HTTPServletResponse 伺服器響應物件
響應物件中有:
響應行 http/1.1 狀態碼200
響應頭 告訴瀏覽器要做什麼 例如響應給你的檔案需要下載 以什麼編碼格式解析資料
響應體 響應回瀏覽器的資料
    public void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        // 設定伺服器的編碼格式 tomcat預設的編碼格式 iso-8859-1
        // response.setCharacterEncoding("UTF-8");
        // 告訴瀏覽器要使用什麼編碼格式來檢視 新增響應頭
        // response.setHeader("Content-type","text/html;charset=UTF-8");

        // 代替以上兩句的方法
        response.setContextType("text/html;charset=UTF-8");
        // 給瀏覽器響應一句話
        // 從響應物件 HttpServletResponse 中獲取物件
        // 注意:這個流物件不是自己建立 要從響應中獲取
        PrintWriter out = response.getWrite();
        out.write("很開心");
    }
    // 重新整理響應
    private void fun1(HttpServletResponse response) throws IOException {
        // 新增重新整理頭(每秒重新整理一次)
        response.setIntHeader("refresh",1);
        // 新增隨機數
        response.getWriter().write(Math.random() + "");
    }
    // 跳轉響應
    private void fun3(HttpServletResponse response) throws IOException {
        // 設定響應的字符集
        response.seetContentType("text/html;charset=UTF-8");
        // 3秒後 跳轉一個請求地址
        response.setHeader("refresh","3;url=http://www.baidu.com");
        response.getWriter().write("3秒後 跳轉 很開心");

伺服器上下載檔案

(6.下載檔案
    使用者傳送請求 請求到訪問Servlet
    Servlet處理請求(把伺服器上的圖片 以流的形式 使用response 響應給使用者瀏覽器)
    首先 把名字為 糰子大家族.png的圖片放到工程src資料夾下
        public void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
            // 獲取伺服器上的圖片路徑
    String path = this.getServletContext().getRealPath("/WEB-INF/classes/糰子大家族.png");
            // 字串切割 獲取圖片的名字
            int index = path.lastIndexof("/");
            String filename = path.substring(index + 1);
            // 修改檔名字的字符集
            filename = new String(filename.getBytes(),"iso-8859-1");
            // 新增響應頭(需要拼接檔案的名字)
            response.setHeader("content-disposition","attachment;filename=" + filename);
            // 告訴瀏覽器檔案下載的格式 新增響應頭
            response.setHeader("content-type","image/png");
            // 從伺服器中讀取圖片 邊讀邊寫
            FineInputStream fis = new FileInputstream(path);
            // 注意: 需要獲取response當中 位元組流
            ServletOutputstream sos = response.getOutputStream();
            int len = 0;
            byte[] b = new byte[1024];
        while ((len = fis.read(b)) != -1) {
            // 響應回瀏覽器
             // 如果只是單純的把圖片響應回去
             // 瀏覽器並不知道你要幹什麼(下載或瀏覽)
             // 需要通過響應頭 通知瀏覽器  該檔案是給你下載用的
             sos.write(b, 0, len);
        }
        // 注意:自己建立的流 自己關
         fis.close();
    }