1. 程式人生 > >請求轉發、重定向、包含的區別

請求轉發、重定向、包含的區別

概述

Servlet的service()方法是由Servlet容器來呼叫的,使用者不能在一個Servlet物件中直接呼叫另一個Servlet物件的servie()方法,因為一個Servlet物件無法得到另一個Servlet物件的引用。為了能夠得到另一個servlet的邏輯於是有轉發和包含。

請求轉發和包含位址列的內容都不會變化,而請求重定向位址列會發生變化,而根據request和response生命週期知道,請求轉發和包含不會建立新的request和respose只是共享資料而已,而請求重定向則會建立一個新的request和response物件,不能共享資料。

詳細概述

請求轉發

Servlet(源元件)先對客戶請求做一些預處理操作(一般是對響應頭進行處理),然後把請求轉發給其他Servlet(目標元件)來完成包括生成響應結果在內的後續操作。
  實現方法:request.getRequestDispatcher(“接收請求的Servlet 路徑”). forward(request,response)
  getRequestDispatcher(String path):該方法的返回值型別是RequestDispatcher,請求傳送器,該方法的引數是指明要接收請求的Servlet 的路徑;
  forward(ServletRequest req,ServletResponse res):該方法是RequestDispatcher 介面的方法,將請求從一個 servlet 轉發到伺服器上的另一個資源(servlet、JSP 檔案或 HTML 檔案)。此方法允許一個 servlet 對請求進行初步處理,並使另一個資源生成響應。需要傳遞兩個引數,這兩個引數是當前Servlet 的request 物件和 response 物件傳遞過去的。
  forward() 方法的處理流程:
  ● 清空用於存放響應正文(響應體)資料的緩衝區。
  ● 如果目標元件為Servlet 或JSP,就呼叫它們的service() 方法,把該方法產生的響應結果傳送到客戶端,如果目標元件為檔案系統中的靜態 html 文件,就讀去文件中的資料並把它傳送到客戶端。
  ● 由於 forward() 方法先清空用於存放響應正文資料的緩衝區,因此servlet源元件生成的響應結果不會被髮送到客戶端,只有目標元件生成的結果才會被髮送到客戶端,所以對源元件叫“留頭不留體”,目標元件為“留體不留頭”,就是說共享request和response但是源目標的輸出結果被清空,轉發目的地址的輸出才是有效輸出。
  ● 如果源元件在進行請求轉發之前,已經提交了響應結果(例如呼叫了flush 或close() 方法),那麼forward() 方法會丟擲IllegalStateException。為了避免該異常,不應該在源元件中提交響應結果,所以叫留體拋異常。

請求包含

請求包含定義:
  Servlet(源元件)把其他Servlet(目標元件)生成的響應結果包含到自身的響應結果中。
  
  實現方式:
request.getRequestDispatcher(“接收請求的Servlet 路徑”). include(request,response)

  include(ServletRequest request,ServletResponse response):該方法是RequestDispatcher 介面的方法,表示包含。它的引數同forward() 方法的引數一樣都是由當前Servlet傳遞過去的。
  包含與轉發相比,源元件與被包含的目標元件的輸出資料都會被新增到響應結果中,在目標元件中對響應狀態程式碼或者響應頭所做的修改都會被忽略,所以對源元件來說是“留頭又留體”,對目標元件為“留體不留頭”。

參考1
參考2

相關推薦

詳細的請求轉發定向的重要區別及使用場景選擇

請求轉發與重定向的區別及使用場景選擇 一、請求轉發: 伺服器行為: 因為它是程式碼與程式碼之間的資源跳轉 特點: 轉發的所有Servlet都是同一個請求,使用同一個request和response! 由最後一個Servlet完成響應體! 當前Servlet可以設

struts2中的跳轉詳解 ----“請求轉發”和“定向”之間的區別

轉載自:http://blog.163.com/shadow_wolf/blog/static/183469097201452625628798/ Struts2的ResultType和Action處理鏈  Struts2的結果型別 在struts-default.xml

請求轉發定向包含區別

概述 Servlet的service()方法是由Servlet容器來呼叫的,使用者不能在一個Servlet物件中直接呼叫另一個Servlet物件的servie()方法,因為一個Servlet物件無法得到另一個Servlet物件的引用。為了能夠得到另一個serv

response請求轉發定向

response響應物件 提供的方法: void addCookie(Cookie cookie); 伺服器向客戶端增加cookie物件 void sendRedirect(String location) throws IOException; 頁面跳轉的一種方式(重定向) void se

Web前端之cookiesession請求轉發定向

http協議的特點:稱之為無狀態, 請求與請求之間不會記錄狀態(狀態就包括請求引數等資訊) Cookie:記錄多個請求之間的聯絡,儲存伺服器狀態(實現記住使用者名稱的功能) 建立Cookie Cookie c = new Cookie("名字", "值"); 瀏覽器每個域名下能夠

ServletRequest HttpServletRequest 請求方法 獲取請求引數 請求轉發 請求包含 請求轉發定向區別 獲取請求頭欄位

ServletRequest 基本概念 JavaWeb中的 "Request"物件  實際為   HttpServletRequest  或者  ServletRequest,   兩者都為介面 伺服器接收請求後,將請求資料進行物件封裝 功能大致分類

Spring MVC溫故而知新 – 參數綁定轉發定向異常處理攔截器

單獨 UC exclude require 加載 pre buffered nts 節點 請求參數綁定 當用戶發送請求時,根據Spring MVC的請求處理流程,前端控制器會請求處理器映射器返回一個處理器,然後請求處理器適配器之心相應的處理器,此時處理器映射器會調用Spr

三十python之Flask框架(二)檢視:返回狀態碼定向狀態保持請求鉤子

一、返回狀態碼和abort函式 1.return直接返回狀態碼: return可以返回自定義的不符合http協議的狀態碼。 作用:實現前後端的資料互動。 程式碼: from flask import Flask app = Flask(__name__) @app.rou

SpringMVC篇:轉發定向圖片檔案上傳Json(jackson)

注意: 專案:war 和 專案:war  exploded 兩者並不同,idea  執行 專案:war  exploded   <dependency> <groupId>org.

web---請求轉發定向區別

如圖:左為forward的請求流程圖,右為redirect的請求流程圖 1. forward 是一次完整的請求和響應,是伺服器內控制權的轉發。可以由servlet接收請求,但把返回響應的權利通過forward給jsp來完成 2. redirect會在第一次響應返回時用狀態碼30

JSP 請求轉發定向區別

1,請求的轉發:呼叫request.getRequestDispatcher("path").forword(,)方法 2,請求的重定向:呼叫response.sendRedirect(location)方法 區別: 1,請求的轉發:位址列是最初請求的位址列 請求的重定向:地址不再是最初請求的位址列,是最後

SprinMVC轉發定向收集date資料自定義轉換器檔案上傳json資料轉換

1.專案模組圖 2.完成SpringMVC的基本搭建 pom.xml(下載jar包的檔案) <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.

請求轉發定向區別

LoginServlet: package com.test.servlet; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet

請求轉發定向區別

一、請求轉發和重定向 請求轉發:request.getRequestDispatcher(URL地址).forward(request, response) 處理流程: 客戶端傳送請求,Servlet做出業務邏輯處理。 Servlet呼叫forword()方法,伺服器

簡述請求轉發定向區別

重定向與轉發的區別:1.重定向訪問伺服器兩次,轉發只訪問伺服器一次。2.重定向可以看見目標頁面的URL,轉發只能看見第一次訪問的頁面URL,以後的工作都是有伺服器來做的。3.重定向跳轉後必須加上return,要不然頁面雖然跳轉了,但是還會執行跳轉後面的語句,轉發是執行了跳轉頁

JSP中請求轉發定向區別和中文亂碼問題解決方法

 1.請求的轉發和重定向:  1).本質區別:請求的轉發只發出了一次請求,而重定向則發出了兩次請求。  具體:    ①請求轉發:位址列是初次發出請求的地址      請求的重定向:位址列不再是初

請求轉發定向區別?以及如何使用?

重定向與請求轉發的區別 一 轉發是伺服器行為,重定向是客戶端行為。為什麼這樣說呢,這就要看兩個動作的工作流程: 轉發過程:客戶瀏覽器傳送http請求——》web伺服器接受此請求——》呼叫內部的一個方法在容器內部完成請求處理和轉發動作——》將目標資源傳送給客戶;在這裡

SpringMVC系列(九)自定義檢視定向轉發

一、自定義檢視 1. 自定義一個檢視HelloView.java,使用@Component註解交給Spring IOC容器處理 1 package com.study.springmvc.views; 2 3 import java.util.Date; 4 i

HTTP中請求轉發定向區別

1.jsp中 轉發 重定向:<%response.sendRedirect(“new.jsp”);//重定向到new.jsp%> 2.servlet中 request.getRequestDispatcher(“new.jsp”).forwa

jsp學習之——關於請求轉發定向的形象理解

本質 url 博文 客戶端 style 讓我 esp 方法 rect 1.重定向:是屬於客戶端行為,實現方法:response.sendRedirect() 從本質上講等同於兩次請求,前一次的請求對象不會保留,在瀏覽器上的直觀表現是——地址欄的URL地址會改變。 2.請求轉