重定向和轉發相對路徑和絕對路徑問題
注意:轉發和重定向的URLString前有加 / 為絕對路徑 反之為相對路徑
1.假設通過表單請求指定的Url資源 action=“LoginServlet”
則表單生成的請求地址為:http://localhost:8080/項目名/LoginServlet
2.在servlet處理請求之后重定向到下面指定資源
參數可以指定為相對路徑或絕對路徑或web應用程序。
-
相對路徑:response.sendRedirect(“Manager/index.jsp”)
生成的地址:原來請求地址+參數生成完整的URL即: http://localhost:8080/項目名/Manager/index.jsp
-
絕對路徑:response.sendRedirect("/Manager/index.jsp")
生成的地址:web服務器本身地址+參數生成完整的URL 即:http://localhost:8080/Manager/index.jsp
-
其他web應用地址
response.sendRedirect(“http://www.baidu.com”) ,容器直接定向到該URL。
3.在servlet處理請求之后轉發到以下指定資源
參數可以指定為相對路徑或絕對路徑。
-
相對路徑
相對路徑情況下生成的完整URL與重定向方法相同。
-
絕對路徑
絕對路徑與重定向不同,容器將相對於Web應用的根目錄加參數生成完整的URL
生成的地址: 原來請求地址+參數生成完整的URL 即:http://localhost:8080/項目名/Manager/index.jsp
轉發用相對路徑和絕對路徑地址都一樣。
-
ServletContext.getRequestDispatcher(UrlString)
參數只能指定為絕對路徑,生成的完整URL與HttpServletRequest.getRequestDispatcher(String)相同。
一、請求轉發與響應重定向的種類
有兩種方式獲得Servlet轉發對象(RequestDispatcher):一種是通過HttpServletRequest的getRequestDispatcher()方法獲得,一種是通過ServletContext的getRequestDispatcher()方法獲得。
Servlet重定向的方法只有一種:HttpServletResponse的sendRedirect()方法。
這三個方法的參數都是一個URL形式的字符串,但在使用相對路徑或絕對路徑上有所區別。
二、請求轉發與響應重定向中路徑參數區別
假設通過http://localhost/myApp/cool/bar.do請求到達該方法所屬的Servlet。
1、響應重定向 HttpServletResponse.sendRedirect(String)
參數可以指定為相對路徑、絕對路徑或其它Web應用。
i:相對路徑:****response.sendRedirect(“foo/stuff.do”)****,地址欄原來請求的URL的目錄(比如http://localhost/myApp/cool/bar.do的目錄為http://localhost/myApp/cool/)加參數來生成完整的URL——http://localhost/myApp/cool/foo/stuff.do。
ii:絕對路徑:response.sendRedirect("/foo/stuff.do"),Tomcat本身的根地址(本地的話就是http://localhost/)加參數建立完整的URL,這是因為 重定向response.sendRedirect("")是服務器向客戶端發送一個請求頭信息,由客戶端再請求一次服務器,請求是在服務器外進行的,即完整的url是——http://localhost/foo/stuff.do。也就是是說絕對路徑就是:服務器會將 /
開頭的路徑解析為以項目根目錄開始的,所以要想絕對路徑正確必須以你配置的application context的路徑為開頭。
比如我的Tomcat項目的路徑配置為:
要想實現正確的跳轉到 foo/stuff.do
,那么重定向的代碼應該這樣寫 response.sendRedirect("/smbms_war_exploded/foo/stuff.do"),
iii:其它Web應用:response.sendRedirect(“http://www.xxx.com”)容器直接定向到該URL。
2、請求轉發 HttpServletRequest.getRequestDispatcher(String)
參數可以指定為相對路徑或絕對路徑。
i:相對路徑情況下生成的完整URL與重定向方法相同。
ii:絕對路徑與Servlet重定向不同,容器將相對於Web應用的根目錄加參數生成完整的URL(即“/”根路徑就是相對於虛擬路徑)這是因為轉發是在服務器內部進行的,寫絕對路徑/開頭指的是當前的Web應用程序
。即:
***request.getRequestDispatcher("/foo/stuff.do"*)生成的URL是http://localhost/myApp/foo/stuff.do。
3、 ServletContext.getRequestDispatcher(String)
參數只能指定為絕對路徑,生成的完整URL與HttpServletRequest.getRequestDispatcher(String)相同。
JSP 提交表單給 Servlet 路徑問題
JSP頁面提交表單給Servlet時,路徑的寫法要格外注意。
例如在web.xml中注冊如下的servlet:
<servlet>
<servlet-name>addStudent</servlet-name>
<servlet-class>org.mytest.addStudent</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>addStudent</servlet-name>
<url-pattern>/servlet/addStudent</url-pattern>
</servlet-mapping>
假如說,你工程名字為HibernateApp3,JSP頁面提交表單給servlet時有兩種寫法:
1.相對路徑: <form action=servlet/addStudent method=post>...</form>
2.絕對路徑: <form action="/HibernateApp3/servlet/addStudent" method=post>...</form>
或者 <form action="<%=request.getContextPath()%>/servlet/addStudent" method=post>...</form>
注意:/代表根目錄,如果路徑是使用/開頭,Tomcat就是webApp那個目錄,如果你不是/開頭代表你從當前工程的目錄開始,例如:webApp/HibernateApp3/
這一點非常重要,很多提交表單時發生的錯誤都是因為提交路徑出錯造成的。
附、<a href>
的路徑如果是"/"開頭,則表示相對於主機,如果不是則表示相對於當前請求
綜上所述:這里最最關鍵的要能清楚發出請求目的資源的請求是在服務器內部還是服務器外部:內部時,“/”就是項目的虛擬目錄;外部時,“/”就是代表主機的根目錄
getRequestDispatcher 和sendRedirect區別及路徑問題
getRequestDispatcher 和sendRedirect區別
getRequestDispatcher是服務器內部跳轉,地址欄信息不變,只能跳轉到web應用內的網頁。 sendRedirect是頁面重定向,地址欄信息改變,可以跳轉到任意網頁。 這兩條網上都查得到,但看着比較亂,現提供我測試的結果(僅供參考):
getRequestDispatcher分成兩種,可以用request調用,也可以用getServletContext()調用
不同的是request.getRequestDispatcher(url)的url可以是相對路徑也可以是絕對路徑。
而this.getServletContext().getRequestDispatcher(url)的url只能是絕對路徑。
注:request.getRequestDispatcher(url)之所以可以使用相對路勁,是因為在getRequestDispatcher(url)方法中封裝了ServletContext.getRealPath()以獲得相應的項目根路徑,再通過字符串相加,從而可以獲得一個完整的路徑
java web 中的${pageContext.request.contextPath }是什么意思
優點: 它的作用是取出部署應用程序的名字,這樣不管如何部署,所用的路徑都是正確的
缺點:其他工具無法正確解析它
什么是當前的項目名稱呢?
假定你的web application 名稱為test,這個test就是當前的項目名稱,不過你在瀏覽器中輸入請求路徑時,如:
http//:localhost:8080/test/hello.jsp ,在IDEA中可以進行配置這個,叫做application context,翻譯過來就是應用上下文,如下圖:
而這pageContext.request.contextPath
獲取的就是這個,然后再與Tomcat服務的地址進行,其中 /
代表的就是Tomcat服務器的地址,比如本地的默認的就是 http//:localhost:8080,這樣pageContext.request.contextPath
取出的就是項目的絕對路徑地址。這個是用在jsp中的,常用來在jsp頁面中用來請求資源。
比如:
<form class="loginForm" action="${pageContext.request.contextPath }/login.do" name="actionForm" id="actionForm" method="post" >
.....
</form>
注意:一般情況下,在JSP/HTML頁面等引用的CSS,Javascript.Action等屬性前面最好都加上<%=request.getContextPath()%>,以確保所引用的文件都屬於Web應用中的目錄。另外,應該盡量避免使用類似".","./","http://www.cnblogs.com/"等類似的相對該文件位置的相對路徑,因為這樣當文件移動時,很容易出問題。
參考博客
- https://blog.csdn.net/abc583121179/article/details/9420457
- https://blog.csdn.net/yinbucheng/article/details/54096543
- https://blog.csdn.net/StackFlow/article/details/78882860