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