日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java servlet 跳转_Servlet跳转方式sendReDirect()和forward()

發布時間:2023/12/4 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java servlet 跳转_Servlet跳转方式sendReDirect()和forward() 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在web應用服務中,經常會面對不同SERVLET之間的跳轉,目前我們可以通過以下兩種方式實現:

1.RequestDispatcher.forward()

2.ServletResponse.sendReDirect()

兩者的區別:

1.redirect?方式可以跨應用訪問,forward 只能在同一個應用中跳轉。

2.forward 客戶端訪問服務器,服務器找到要跳轉的相應URL并執行返回給客戶端。客戶端的地址欄顯示的是原始URL。

redirect?客戶端訪問服務器,服務器找到要跳轉的URL并將URL發給客戶端,再由客戶端對新的URL重新發送請求。客

戶端的地址欄顯示的是第二次請求的URL。

3.數據的傳輸:在request中的數據,forward可以訪問,redirect不行,因為redirect已經是一個新的請求。

forward跳轉的理解:

1.獲得跳轉

getRequestDispatcher方法以String參數描述ServletContext作用域的路徑。該路徑必須相對于ServletContext的根,并且以“/”開頭。該方法使用路徑(path)來查找servlet,用RequestDispatcher對象包裝,然后返回結果對象。如果沒有基于指定路徑的servlet,提供一個RequestDispatcher返回路徑值。

getNamedDispatcher方法以String參數表示ServletContext已知的servlet名稱。如果找到servlet,用RequestDispatcher對象將它包裝并返回。如果沒有和指定名稱關聯的servlet,該方法必須返回null。

為了能夠使用當前請求的相對路徑(不是ServletContext根的相對路徑)來獲得RequestDispatcher對象,ServletRequest接口提供以下方法:

getRequestDispatcher

該方法的行為和ServletContext的同名方法類似。servlet容器使用request對象中的信息將指定的相對路徑轉換成完整路徑。比如,以“/”為根的上下文,請求/garden/tools.html,通過ServletRequest.getRequestDispatcher("header.html") 獲得的requestDispatcher實際上等同于調用ServletContext.getRequestDispatcher("/garden/header.html")。

Java代碼

request.getRequestDispatcher("/uu").forward(request,response)

this.getServletContext().getRequestDispatcher("/uu").forward(request,response)

this.getServletContext().getNamedDispatche("ServletName").forward(request,?response)

1.1 RequestDispatcher路徑的query字符串

ServletContext和ServletRequest使用path參數創建RequestDispatcher對象的方法,允許在path后添加query字符串。比如,開發人員可以通過下列代碼獲得RequestDispatcher:

String path = “/raisons.jsp?orderno=5”;

RequestDispatcher rd = context.getRequestDispatcher(path);

rd.include(request, response);

query字符串中指定的參數用來創建RequestDispatcher,優先于傳遞給包含servlet的同名的其他參數。該參數和RequestDispatcher關聯,只在include或forward調用中有效。

2 使用RequestDispatcher

要使用requestDispatcher,servlet可以調用RequestDispatcher接口的include或forward方法。這些方法的參數可以是通過Servlet接口的service方法傳遞的request和response參數,也可以是規范2.3中引入的request和response包裝類的子類的實例。后者,包裝實例必須包裝容器傳遞給service方法的request和response對象。

容器供應商必須確保向目標servlet轉發請求和原請求處于同一個VM,同一個線程。

3 include方法

RequestDispatcher接口的include可以隨時調用。include方法的目標servlet可以完整訪問request對象,但是使用response對象上有一些限制:

它只能向response對象的ServletOutputStream或者Writer寫入信息,提交響應(將內容輸出到響應緩沖尾部),或者顯式調用ServletResponse接口的flushBuffer方法。它不能設置header,或者調用任何影響響應header的方法。任何那樣的嘗試必須都被忽略。

3.1 包含的請求參數

除了使用getNamedDispatcher方法獲得的servlet之外,include的servlet可以訪問調用它的路徑。設置以下請求屬性:

javax.servlet.include.request_uri

javax.servlet.include.context_path

javax.servlet.include.servlet_path

javax.servlet.include.path_info

javax.servlet.include.query_string

include的servlet的這些屬性通過request對象的getAttribute方法訪問。

如果include的servlet通過getNamedDispatcher方法獲得,那么這些屬性沒有設置。

4 forward方法

RequestDispatcher接口的forward方法只有在輸出還未提交給客戶端時,才可以由調用servlet調用。如果輸出數據存在于還未提交的響應緩沖中,內容必須在目標servlet的service方法調用之前清空 (否則out.println()輸出的都在緩存中,無效)。如果響應已被提交,必須拋出IllegalStateException異常。暴露給目標servlet的request對象的path元素必須映射用來獲得RequestDispatcher的路徑。

唯一例外是如果RequestDispatcher是通過getNamedDispatcher方法獲得的,這種情況下,request對象的path元素必須必須映射最初的請求。

在RequestDispatcher接口的forward方法返回之前,servlet容器必須發送,提交并關閉響應內容。

Java代碼

public?void?doPost(HttpServletRequest?request,HttpServletResponse?response?)?throws?IOException,ServletException{

String?page?=??request.getParameter("page");//在forward時被URL中的page=1覆蓋了

response.setCharacterEncoding("UTF-8");

//clear?cache.

response.setHeader("Pragma","No-cache");

response.setHeader("Cache-Control","no-cache");

response.setHeader("Cache-Control",?"no-store");

response.setDateHeader("Expires",0);

PrintWriter?out?=?response.getWriter();

out.println("");

out.println("

china");

out.println("

");

out.print("==");

out.println("
");//jsp頁面換行

out.println("");

out.println("");

//如果out.flush或者out.close().表示響應已經提交,拋出異常IllegalStateException異常。requestDispather.forward():不會執行.

//out.flush();

//out.close();

//跳轉方式3種.

//??request.getRequestDispatcher("/productInfo.do?page=1").forward(request,response);

}

4.1 query字符串

請求轉發機制負責在轉發(forward)或包含(include)請求時傳遞query字符串。

5 錯誤處理

如果requesDispatcher的目標的servlet拋出ServletException或IOException類型運行時異常或checked異常,應當將它傳遞給調用servlet。所有其它異常應當包裝成ServletException異常,并且異常的根在傳遞之前設置為原始異常。

相對路徑的理解:

forward中"/"相對于web應用.

從http://localhost:8080/Test/gw/page.jsp中轉發

在JSP頁面被解析后轉換成pageContext.forward("OtherPage.jsp");

"/OtherPage.jsp"提交到http://localhost:8080/Test/OtherPage.jsp

"OtherPage.jsp"提交到http://localhost:8080/Test/gw/OtherPage.jsp

和 response.sendRedirect("/ddd"); 相對于服務器根路徑.

假設轉發代碼包含于注冊的servlet-url為/ggg/tt;jsp為/ggg/tt.jsp:

絕對路徑:response.sendRedirect("http://www.brainysoftware.com")發送http://www.brainysoftware.com

根路徑:response.sendRedirect("/ooo")發送至http://localhost:8080/ooo

相對路徑:response.sendRedirect("ooo")發送至http://localhost:8080/Test/ggg/ooo,

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的java servlet 跳转_Servlet跳转方式sendReDirect()和forward()的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。