關(guān)于Javaweb的轉(zhuǎn)發(fā)和重定向詳解
轉(zhuǎn)發(fā)
轉(zhuǎn)發(fā)與頁面跳轉(zhuǎn)
轉(zhuǎn)發(fā)
- 轉(zhuǎn)發(fā)的作用在服務(wù)器端,將請求發(fā)送給服務(wù)器上的其他資源,以共同完成一次請求的處理
頁面跳轉(zhuǎn)
- 使用forward跳轉(zhuǎn)時,是在服務(wù)器內(nèi)部跳轉(zhuǎn),地址欄不發(fā)生變化,屬于同一次請求
調(diào)用業(yè)務(wù)邏輯的Servlet中,編寫代碼:
request.getRequestDispatcher("/目標(biāo)URL-pattern").forward(request,response); //跳轉(zhuǎn)轉(zhuǎn)發(fā)到login.jsp req.getRequestDispatcher("login.jsp").forward(req,resp);
數(shù)據(jù)傳遞
request作用域
- 擁有存數(shù)據(jù)的空間,作用范圍是一次請求有效(一次請求可以經(jīng)過多次轉(zhuǎn)發(fā))
- 可以將數(shù)據(jù)存入request后,在一次請求過程中的任何位置進(jìn)行獲取
- 可以傳遞數(shù)據(jù)(基本數(shù)據(jù)類型,對象,數(shù)組,集合等)
存數(shù)據(jù)
以鍵值對的形式存儲在request作用域中,key為String類型,value為Object類型JSP內(nèi)置對象session和request都有這個方法
request.setAttribute(key,value);
取數(shù)據(jù)
通過String類型的key訪問Object類型的value
request.getAttribute(key)
存取數(shù)據(jù)
//request作用域存儲數(shù)據(jù) req.setAttribute("admins",adminList); //request作用取數(shù)據(jù) request.getAttribute("admins");
重定向
重定向作用在客戶端,客戶端請求發(fā)送給服務(wù)器后,服務(wù)器響應(yīng)給客戶端一個新的請求地址,客戶端重新發(fā)送新的請求
重定向與頁面跳轉(zhuǎn)
調(diào)用業(yè)務(wù)邏輯的Servlet中,編寫代碼:
// response.sendRedirect("目標(biāo)URL"); resp.sendRedirect("index.jsp"); //重定向跳轉(zhuǎn)到index.jsp頁面
數(shù)據(jù)傳遞
sendRedirect跳轉(zhuǎn)時,地址欄發(fā)生改變,代表客戶端重新發(fā)送請求,屬于兩次請求
- response沒有作用域,兩次request請求中的數(shù)據(jù)無法共享
傳遞數(shù)據(jù)
- resp.sendRedirect(“URL”);
- 通過URl的拼接進(jìn)行數(shù)據(jù)傳遞 “網(wǎng)頁地址?username=tom”;
- response傳遞數(shù)據(jù)只能是String類型
獲取數(shù)據(jù)
- request.getParameter(“username”);
//傳遞數(shù)據(jù) resp.sendRedirect("/WebProject_war_exploded/b?username=tom"); //傳遞數(shù)據(jù)為String類型,明文傳遞 //獲取數(shù)據(jù) String username = req.getParameter("username");
轉(zhuǎn)發(fā)與重定向的區(qū)別
轉(zhuǎn)發(fā) | 重定向 |
轉(zhuǎn)發(fā)使用的是getRequestDispatcher()方法 | 重定向使用的是sendRedirect()方法 |
瀏覽器URL的地址欄不變 | 瀏覽器URL的地址欄改變 |
轉(zhuǎn)發(fā)是服務(wù)器行為 | 重定向是客戶端行為 |
轉(zhuǎn)發(fā)是瀏覽器只做了一次訪問請求 | 重定向是瀏覽器做了至少兩次的訪問請求 |
轉(zhuǎn)發(fā)2次跳轉(zhuǎn)之間傳輸?shù)男畔⒉粫G失 | 重定向2次跳轉(zhuǎn)之間傳輸?shù)男畔G失(request范圍) |
重定向的第二個請求一定是GET |
轉(zhuǎn)發(fā)和重定向總結(jié):
當(dāng)兩個Servlet需要傳遞數(shù)據(jù)時,選擇forward轉(zhuǎn)發(fā),不建議使用sendRedirect轉(zhuǎn)發(fā),因?yàn)閟endRedirect是明文傳遞不安全
Servlet生命周期(四階段)
Servlet 生命周期
Servlet 生命周期可被定義為從創(chuàng)建直到毀滅的整個過程。以下是 Servlet 遵循的過程:
- Servlet 初始化后調(diào)用 init () 方法
- Servlet 調(diào)用 service() 方法來處理客戶端的請求
- Servlet 銷毀前調(diào)用 destroy() 方法
- 最后,Servlet 是由 JVM 的垃圾回收器進(jìn)行垃圾回收的
實(shí)例化
用戶第一次訪問Servlet是,由容器調(diào)用Servlet的構(gòu)造器創(chuàng)建具體的Servlet對象,也可以啟動容器后立刻創(chuàng)建實(shí)例,使用如下代碼可以設(shè)置Servlet是否在服務(wù)器啟動時就創(chuàng)建
- 只執(zhí)行一次
初始化
初始化階段,init()方法會被調(diào)用,這個方法在javax.servlet.Servlet接口中定義,其中,方法以一個ServletConfig類型的對象作為參數(shù)
- init方法只被執(zhí)行一次
服務(wù)
客戶端有一個請求時,容器會將請求ServletRequest與響應(yīng)ServletRequest對象轉(zhuǎn)給Servlet,以參數(shù)的形式傳給service方法
- 此方法會執(zhí)行多次
銷毀
Servlet容器(Tomcat)停止或者重新啟動(Tomcat)都會引起銷毀Servlet對象并調(diào)用destroy方法
- destroy方法執(zhí)行一次
實(shí)例:
package com.woniu.servlet2; import javax.servlet.*; import javax.servlet.annotation.WebServlet; import java.io.IOException; @WebServlet(value = "/ls") public class LifeServlet implements Servlet { public LifeServlet(){ System.out.println("1.實(shí)例化"); } @Override public void init(ServletConfig servletConfig) throws ServletException { System.out.println("2.初始化"); } @Override public ServletConfig getServletConfig() { return null; } @Override public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException { System.out.println("3.提供服務(wù),接受請求,響應(yīng)結(jié)果"); } @Override public String getServletInfo() { return null; } @Override public void destroy() { System.out.println("4.銷毀"); } }
重啟或停止Tomcat即會輸出銷毀
到此這篇關(guān)于關(guān)于Javaweb的轉(zhuǎn)發(fā)和重定向詳解的文章就介紹到這了,更多相關(guān)Javaweb的轉(zhuǎn)發(fā)和重定向內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Javaweb-HttpServletResponse的sendRedirectch重定向方式
- 詳解Java從后臺重定向(redirect)到另一個項(xiàng)目的方法
- JavaWeb中轉(zhuǎn)發(fā)與重定向的區(qū)別小結(jié)
- Java通過httpclient比較重定向和請求轉(zhuǎn)發(fā)
- Java請求轉(zhuǎn)發(fā)和請求重定向區(qū)別詳解
- JavaWeb中請求轉(zhuǎn)發(fā)和請求重定向的區(qū)別以及使用
- Javaweb請求轉(zhuǎn)發(fā)及重定向?qū)崿F(xiàn)詳解
- java 轉(zhuǎn)發(fā)和重定向區(qū)別及實(shí)例代碼
- java轉(zhuǎn)發(fā)和重定向的區(qū)別
- Java中forward轉(zhuǎn)發(fā)與redirect重定向的區(qū)別
相關(guān)文章
Java二分查找算法實(shí)現(xiàn)代碼實(shí)例
這篇文章主要介紹了Java二分查找算法實(shí)現(xiàn)代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-11-11IDEA創(chuàng)建Java項(xiàng)目導(dǎo)出Jar包運(yùn)行
這篇文章主要介紹了IDEA創(chuàng)建Java項(xiàng)目導(dǎo)出Jar包運(yùn)行,需要的朋友可以參考下2021-01-01SpringBoot使用Sa-Token實(shí)現(xiàn)權(quán)限認(rèn)證
本文主要介紹了SpringBoot使用Sa-Token實(shí)現(xiàn)權(quán)限認(rèn)證,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-04-04從0開始學(xué)習(xí)大數(shù)據(jù)之java spark編程入門與項(xiàng)目實(shí)踐
這篇文章主要介紹了從0開始學(xué)習(xí)大數(shù)據(jù)之java spark編程入門與項(xiàng)目實(shí)踐,結(jié)合具體入門項(xiàng)目分析了大數(shù)據(jù)java spark編程項(xiàng)目建立、調(diào)試、輸出等相關(guān)步驟及操作技巧,需要的朋友可以參考下2019-11-11Java連接MySQL數(shù)據(jù)庫命令行程序過程
SQL編程包括兩種形式,一種是過程化編程,主要通過數(shù)據(jù)庫交互式工具,通過存儲過程、觸發(fā)器、函數(shù)等形式的編程;另一種是嵌入式SQL編程,將SQL語句嵌入到高級開發(fā)語言,完成數(shù)據(jù)的各種操作2021-10-10Shiro中session超時頁面跳轉(zhuǎn)的處理方式
這篇文章主要介紹了Shiro中session超時頁面跳轉(zhuǎn)的處理方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-06-06Java線程中sleep和wait的區(qū)別詳細(xì)介紹
Java中的多線程是一種搶占式的機(jī)制,而不是分時機(jī)制。搶占式的機(jī)制是有多個線程處于可運(yùn)行狀態(tài),但是只有一個線程在運(yùn)行2012-11-11java easyUI實(shí)現(xiàn)自定義網(wǎng)格視圖實(shí)例代碼
這篇文章主要給大家介紹了關(guān)于java easyUI實(shí)現(xiàn)自定義網(wǎng)格視圖的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-10-10