亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Servlet中RequestDispatcher的原理是什么

發布時間:2021-06-15 14:37:38 來源:億速云 閱讀:148 作者:Leah 欄目:編程語言

這篇文章給大家介紹Servlet中RequestDispatcher的原理是什么,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。

RequestDispatcher簡介

RequestDispatcher 代表請求的派發者。它有2個動作:forward 和 include 。客戶端對于任何一個請求,可以根據業務邏輯需要,選擇不同的處理辦法:

1、請求的是誰,誰就自己處理并響應,例如請求的是一個html,則web瀏覽器顯示的就是這個HTML的內容。

2、使用RequestDispatcher讓其它的資源參與進來,協同完成的響應,這就是RequestDispatcher的主要作用。

RequestDispatcher 有一個特點,就是瀏覽器上顯示的URL是最先請求的目標資源的URL,不會因為使用了forward、include方法而改變。因此forward和include的調用對于用戶來說是透明的。

RequestDispatcher 實質是一個接口,有2個方法分別代表這2個動作。下面一 一介紹。

 public interface RequestDispatcher
{
  public void forward(ServletRequest request, ServletResponse response)
      throws ServletException, IOException;

  public void include(ServletRequest request, ServletResponse response)
      throws ServletException, IOException;
}

RequestDispatcher.forward(request, response)

這個方法將請求從一個 Servlet or JSP目標資源 上 轉發到服務器上的另一個資源(servlet、JSP 文件或 HTML 文件,這些資源必須是當前Web上下文中的),讓其它的資源去生成響應數據。

例如用戶請求的是目標資源A,A接受到請求后,轉發到B,真正產生響應數據是被轉發的資源B,而A只是起個引導轉發作用。瀏覽器的地址欄不會變,依然是A的URL。

這個方法可以允許被請求的目標資源做一些準備工作后,再讓轉發的資源去響應請求。例如下面的例子1。

注意事項:  

1、在目標資源中調用forward方法時,必須保證此響應沒有提交。也就是不要使用 ServletResponse 對象的輸出流對象,因為即便你寫入了數據到響應緩沖區,最后也會被清空,如果緩沖區數據被刷新提交(out.flush),還會拋出IllegalStateException異常。

2、對于forward方法傳遞的request對象:雖然我們從調用上看,好像是將request對象傳遞給轉動的資源上去了,但是我發現目標資源使用的request對象和轉發的資源使用的request對象不是同一個request對象,因為分別從這2個request中獲取RequestURL,發現是不一樣的。但是在目標資源request提取的Paramter 和 Attribute   ,在轉發后的資源的request對象中,依然都可以提取到,且是相同的。所以,二者只是在請求路徑相關的屬性上不同,其它API調用返回的都是一樣的。

3、在forward語句的前后,都不應該有響應輸出的語句,應該會被忽略。

例子1:一個簡單的 MVC演示。Servlet充當控制器,轉發到view層的jsp。

User.java

public class User{
   private String name;
   private int age;
   public String getName(){
      return name ;
   }
   public void setName( String name ){
      this .name = name ;
   }
   public int getAge() {
      return age ;
   }
   public void setAge( int age ){
      this .age = age ;
   }
}

UsersServlet.java

public class UsersServlet extends HttpServlet {
   private static final long serialVersionUID = 1L ;

protected void doGet (HttpServletRequest request, HttpServletResponse response) throws ServletException , IOException {
      /*****************一般實際開發這些用戶數據都是從數據庫查出來的*********/
      List <User > users = new ArrayList <> ();
      User u1 = new User () ;
      u1 .setAge ( 20) ;
      u1 .setName ( "Bob") ;
      User u2 = new User () ;
      u2 .setAge ( 21) ;
      u2 .setName ( "Tony") ;
      users .add ( u1) ;
      users .add ( u2) ;
      /*********************************************/
      request .setAttribute ( "users", users) ;  //對request 進制預處理準備工作
      request .getRequestDispatcher ( "users.jsp").forward( request , response );//轉發到users.jsp,讓他去具體響應
  } 
}

users.jsp

<%@ page  contentType= "text/html; charset=UTF-8" pageEncoding ="UTF-8" trimDirectiveWhitespaces= "true"
     session ="true" %>
<%@ taglib prefix= "c" uri = "http://java.sun.com/jsp/jstl/core"  %>

<!DOCTYPE html>
< html>
<head>
<meta http-equiv = "Content-Type" content ="text/html; charset=UTF-8">
<title> 用戶列表</title>
</head>
<body>

<p> -----------------轉發到的資源users.jsp產生的響應數據------------------ </p>

< c:forEach var ="user" items= " ${users}" >
用戶姓名:${user.name} 用戶年齡:${user.age} <br />
</ c:forEach>
</body>
</html>

Servlet中RequestDispatcher的原理是什么

例子2:不使用Attribute,使用Paramter向轉發的資源傳遞參數。

雖然request對象沒有setParameter方法來設置參數,但是我們可以在轉發的URL后通過QueryString 的方式添加。JSP中的<jsp:foward>標簽下的<jsp:param>標簽就是使用的這個原理。

Servlet中RequestDispatcher的原理是什么

AimServlet.java

public class AimServlet extends HttpServlet {
   private static final long serialVersionUID = 1L ;

   protected void doGet( HttpServletRequest request , HttpServletResponse response) throws ServletException , IOException {

      request .getRequestDispatcher ( "foo.jsp?num=1") . forward( request , response );
   }
}

foo.jsp

<%@ page  contentType= "text/html; charset=UTF-8" pageEncoding ="UTF-8" trimDirectiveWhitespaces= "true"
     session ="true" %>
<%@ taglib prefix= "c" uri = "http://java.sun.com/jsp/jstl/core"  %>

<! DOCTYPE html>
<html>
<head>
<meta http-equiv = "Content-Type" content ="text/html; charset=UTF-8">
<title> 標題</title>
</head>
<body>

通過forward傳遞過來的參num=${param.num}

</body>
</html>

RequestDispatcher.include(request, response)

此方法用于包含響應中某個資源(servlet、JSP 頁面和 HTML 文件)的內容。

調用者指定一個被包含的資源,將這個包含的資源(JSP,Servlet,HTML)的響應數據包含到自己的響應體中。被包含的數據是在服務器上經過運行產生的,因此是動態包含,而不同于JSP中的include指令,它是JSP轉譯期的靜態包含,類似于C語言中的宏一樣。

這個過程實質是用一個相同的Request再請求一次被包含的資源,將被包含的資源的響應數據包含到原本的資源中去,構成它的響應數據的一部分。

 Servlet中RequestDispatcher的原理是什么

注意事項:

1、被包含者不能設置ServletResponse的響應狀態和響應頭(否則并不會產生效果),因為這些都是包含者做的事,被包含者只需要產生響應數據解可以了。

2、不同于 forward中的request的傳遞特性:在被包含的資源中從request中獲取請求路徑相關的信息,發現依然是原始請求的路徑,也就是瀏覽器地址欄相關的路徑,也就是說被包含的資源獲得的request對象的路徑屬性和原始請求資源的路徑一樣(見下面的例子1)。其它的API調用也是一樣的(Attribute 和Parameter)。

例子1

TargetServlet.java

public class TargetServlet extends HttpServlet {
   private static final long serialVersionUID = 1L ;
   protected void doGet( HttpServletRequest request , HttpServletResponse response) throws ServletException , IOException {

      response .setContentType ( "text/html;charset=utf-8" );
      PrintWriter out = response .getWriter () ;

      out .println ( "----------來自TargetServlet的告白----------------<br />" ) ;
      out .print ( "我偷懶了,下面的響應數據并不是我自己產生的,而是包含的其它資源產生的<br/>" ) ;
      request .getRequestDispatcher ( "test.jsp") . include( request , response );

      out .flush () ;
      out .close () ;
   }
}

test.jsp 

<%@ page  contentType= "text/html; charset=UTF-8" pageEncoding = "UTF-8" trimDirectiveWhitespaces = "true"
     session = "false"
%>

<p> ------------------------來自test.jsp的告白-------------------------- </p>
<p> 我輸出的響應數據將被其它的資源包含 </p>
請的URL是 <%= request.getRequestURL().toString() %> ,可以看出客戶端真正請求的不是我,我只是幕后工作者。
<p> 但我很開心,因為響應給客戶端的數據一部分來自于我 </p>

Servlet中RequestDispatcher的原理是什么 

例子2:通過包含路徑后追加QueryString來向被包含資源傳遞參數,以及通過request.setAttribute傳遞屬性。

同樣, JSP中的<jsp:include>標簽下的<jsp:param>標簽就是通過在含路徑后追加QueryString達到的傳遞參數的效果。

Servlet中RequestDispatcher的原理是什么 

public class TargetServlet extends HttpServlet {
   private static final long serialVersionUID = 1L ;
   protected void doGet( HttpServletRequest request , HttpServletResponse response) throws ServletException , IOException {

      response .setContentType ( "text/html;charset=utf-8" );
      PrintWriter out = response .getWriter () ;

      out .println ( "----------來自TargetServlet的告白----------------<br />" ) ;
      out .print ( "我偷懶了,下面的響應數據并不是我自己產生的,而是包含的其它資源產生的<br/>" ) ;

      request .setAttribute ( "sharedatt", "I`m shared attribute") ;

      request .getRequestDispatcher ( "test.jsp?sharedparam=Im-shared-parameter" ). include (request , response ) ;

      out .flush () ;
      out .close () ;
   }
}
<%@ page  contentType= "text/html; charset=UTF-8" pageEncoding = "UTF-8" trimDirectiveWhitespaces = "true"
     session = "false"
%>

<p> ------------------------來自test.jsp的告白-------------------------- </p>
<p> 我輸出的響應數據將被其它的資源包含 </p>
<p> 從request中提取共享的屬性Attribute : <%= request.getAttribute("s haredatt") %>
<p> 從request中提取共享的參數Parameter : <%= request.getParameter("sharedparam" ) %>

Servlet中RequestDispatcher的原理是什么

關于Servlet中RequestDispatcher的原理是什么就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

勃利县| 凌源市| 广水市| 山阳县| 吉隆县| 电白县| 温州市| 同心县| 华宁县| 陈巴尔虎旗| 孟州市| 深泽县| 平远县| 河东区| 宁波市| 光山县| 奎屯市| 阿拉善左旗| 晴隆县| 湟中县| 吴堡县| 灵武市| 延庆县| 陈巴尔虎旗| 南通市| 周宁县| 二连浩特市| 建始县| 宁波市| 新晃| 甘谷县| 敦煌市| 南岸区| 大埔县| 凤城市| 博客| 澄迈县| 榆林市| 太仓市| 旬阳县| 晋城|