新聞中心
這篇文章給大家介紹Servlet中RequestDispatcher的原理是什么,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
創(chuàng)新互聯(lián)專注于聞喜企業(yè)網(wǎng)站建設(shè),響應(yīng)式網(wǎng)站建設(shè),商城開發(fā)。聞喜網(wǎng)站建設(shè)公司,為聞喜等地區(qū)提供建站服務(wù)。全流程按需求定制開發(fā),專業(yè)設(shè)計,全程項目跟蹤,創(chuàng)新互聯(lián)專業(yè)和態(tài)度為您提供的服務(wù)
RequestDispatcher簡介
RequestDispatcher 代表請求的派發(fā)者。它有2個動作:forward 和 include ??蛻舳藢τ谌魏我粋€請求,可以根據(jù)業(yè)務(wù)邏輯需要,選擇不同的處理辦法:
1、請求的是誰,誰就自己處理并響應(yīng),例如請求的是一個html,則web瀏覽器顯示的就是這個HTML的內(nèi)容。
2、使用RequestDispatcher讓其它的資源參與進(jìn)來,協(xié)同完成的響應(yīng),這就是RequestDispatcher的主要作用。
RequestDispatcher 有一個特點,就是瀏覽器上顯示的URL是最先請求的目標(biāo)資源的URL,不會因為使用了forward、include方法而改變。因此forward和include的調(diào)用對于用戶來說是透明的。
RequestDispatcher 實質(zhì)是一個接口,有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目標(biāo)資源 上 轉(zhuǎn)發(fā)到服務(wù)器上的另一個資源(servlet、JSP 文件或 HTML 文件,這些資源必須是當(dāng)前Web上下文中的),讓其它的資源去生成響應(yīng)數(shù)據(jù)。
例如用戶請求的是目標(biāo)資源A,A接受到請求后,轉(zhuǎn)發(fā)到B,真正產(chǎn)生響應(yīng)數(shù)據(jù)是被轉(zhuǎn)發(fā)的資源B,而A只是起個引導(dǎo)轉(zhuǎn)發(fā)作用。瀏覽器的地址欄不會變,依然是A的URL。
這個方法可以允許被請求的目標(biāo)資源做一些準(zhǔn)備工作后,再讓轉(zhuǎn)發(fā)的資源去響應(yīng)請求。例如下面的例子1。
注意事項:
1、在目標(biāo)資源中調(diào)用forward方法時,必須保證此響應(yīng)沒有提交。也就是不要使用 ServletResponse 對象的輸出流對象,因為即便你寫入了數(shù)據(jù)到響應(yīng)緩沖區(qū),最后也會被清空,如果緩沖區(qū)數(shù)據(jù)被刷新提交(out.flush),還會拋出IllegalStateException異常。
2、對于forward方法傳遞的request對象:雖然我們從調(diào)用上看,好像是將request對象傳遞給轉(zhuǎn)動的資源上去了,但是我發(fā)現(xiàn)目標(biāo)資源使用的request對象和轉(zhuǎn)發(fā)的資源使用的request對象不是同一個request對象,因為分別從這2個request中獲取RequestURL,發(fā)現(xiàn)是不一樣的。但是在目標(biāo)資源request提取的Paramter 和 Attribute ,在轉(zhuǎn)發(fā)后的資源的request對象中,依然都可以提取到,且是相同的。所以,二者只是在請求路徑相關(guān)的屬性上不同,其它API調(diào)用返回的都是一樣的。
3、在forward語句的前后,都不應(yīng)該有響應(yīng)輸出的語句,應(yīng)該會被忽略。
例子1:一個簡單的 MVC演示。Servlet充當(dāng)控制器,轉(zhuǎn)發(fā)到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 {
/*****************一般實際開發(fā)這些用戶數(shù)據(jù)都是從數(shù)據(jù)庫查出來的*********/
List 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 進(jìn)制預(yù)處理準(zhǔn)備工作
request .getRequestDispatcher ( "users.jsp").forward( request , response );//轉(zhuǎn)發(fā)到users.jsp,讓他去具體響應(yīng)
}
} 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" %> < html>用戶列表 -----------------轉(zhuǎn)發(fā)到的資源users.jsp產(chǎn)生的響應(yīng)數(shù)據(jù)------------------
< c:forEach var ="user" items= " ${users}" > 用戶姓名:${user.name} 用戶年齡:${user.age}
c:forEach>


咨詢
建站咨詢