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()的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java 传送解析8583报文_java
- 下一篇: java 毕向东 内部类_java基础内