Web組件之間跳轉(zhuǎn):從AServlet跳轉(zhuǎn)到BServlet.
三種類型:
1:請求轉(zhuǎn)發(fā)(forward)
2:URL重定向(redirect)
3:請求包含(include)
請求轉(zhuǎn)發(fā)(forward)
AServlet操作完畢之后,請求轉(zhuǎn)發(fā)到BServlet,繼續(xù)完成余下的功能.
語法:
request對象.getRequestDispatcher(String path).forward(request,)
參數(shù):
path:表示目標(biāo)資源名稱(跳轉(zhuǎn)到哪里去)
注意:別忘了寫forward(request,response)
請求轉(zhuǎn)發(fā)的特點:
1:瀏覽器地址路徑?jīng)]變,依然是AServlet的資源名稱.
2:只發(fā)送了一個請求.
3:共享同一個請求,在請求中共享數(shù)據(jù).
4:最終的響應(yīng)輸出由BServlet來決定.
5:只能訪問當(dāng)前應(yīng)用中的資源,不能跨域跳轉(zhuǎn).
6:可以訪問WEB-INF中的資源.
圖片1.png
注意:不要重復(fù)轉(zhuǎn)發(fā)!
java.lang.IllegalStateException:cannot forward atfer response has been committed
請求轉(zhuǎn)發(fā),path要怎么寫?
1. 有斜杠。 斜杠其實就是根。
如果我們 /forward/s2 相當(dāng)于是去根中找一個資源叫/forward/s2資源,能找到。可以轉(zhuǎn)發(fā)。
2. 沒斜杠,就是相對路徑。
相對于誰呢?相對于轉(zhuǎn)發(fā)代碼寫在哪,就相對于誰。
找當(dāng)前資源的最后一個斜杠。
/forward/abc/xyz/s2, 那么"forward/s2" 就直接拼接到相對路徑(/forward/abc/xyz)后面
3. 以后,我們都加上斜杠。
因為斜杠是直接從根里面找。
URL重定向(redirect):
AServlet操作完畢之后,重定向到BServlet,繼續(xù)完成余下的功能.
語法:
response對象.sendRedirect(String path);
參數(shù):path,表示目標(biāo)資源名稱
URL重定向的特點:
1:瀏覽器地址欄路徑發(fā)生變化,編程Servlet2的資源名稱.
2:只發(fā)送了兩個請求.
3:因為是不同的請求,所以不能共享請求中的數(shù)據(jù).
4:最終的響應(yīng)輸出由Servlet2來決定
5:可以跨域訪問資源.
6:不可以訪問WEB-INF中的資源.
面試題:
請求轉(zhuǎn)發(fā)和URL重定向的區(qū)別?
回答方式:
1):分別解釋各自的定義(若不知道如何定義,寫代碼).
2):羅列各自的特點(若是做對比,請最好畫表格).
3):各自的應(yīng)用場景(來源于
自的特點).
請求轉(zhuǎn)發(fā)和URL重定向的選擇?
1:若需要共享請求中的數(shù)據(jù),只能使用請求轉(zhuǎn)發(fā).
2:若需要訪問WEB-INF中的資源,只能使用請求轉(zhuǎn)發(fā).
3:若需要跨域訪問,只能使用URL重定向.
4:請求轉(zhuǎn)發(fā)可能造成表單的重復(fù)提交問題.
5:其他時候,任選.