Servlet中转发和重定向的路径问题以及表单提交路径问题
一、請求轉(zhuǎn)發(fā)與響應(yīng)重定向的種類
????有兩種方式獲得Servlet 轉(zhuǎn)發(fā)對象(RequestDispatcher):一種是通過HttpServletRequest的getRequestDispatcher()方法獲得,一種是通過ServletContext的getRequestDispatcher()方法獲 得。
???Servlet 重定向的方法只有一種:HttpServletResponse的sendRedirect()方法。
這三個方法的參數(shù)都是一個URL形式的字符串,但在使用相對路徑或絕對路徑上有所區(qū)別。
二、請求轉(zhuǎn)發(fā)與響應(yīng)重定向中路徑參數(shù)區(qū)別
?假設(shè)通過http://localhost/myApp/cool/bar.do?請求到達該方法所屬的Servlet。
??1、響應(yīng)重定向???◆ HttpServletResponse.sendRedirect(String)
????參數(shù)可以指定為相對路徑、絕對路徑或其它Web應(yīng)用。
????i:相對路徑:response.sendRedirect("foo/stuff.do"),容器相對于原來請求URL的目錄加參數(shù)來生成完整的URL——http://localhost/myApp/cool/foo/stuff.do。
????ii:絕對路徑:response.sendRedirect("/foo/stuff.do"),容器相對于Web應(yīng)用本身加參數(shù)建立完整的URL,這是因為??重定向response.sendRedirect("")是服務(wù)器向客戶端發(fā)送一個請求頭信息,由客戶端再請求一次服務(wù)器,請求是在服務(wù)器外進行的,即完整的url是——http://localhost/foo/stuff.do。
????iii:其它Web應(yīng)用:response.sendRedirect("http://www.xxx.com ")容器直接定向到該URL。
??2、請求轉(zhuǎn)發(fā)????◆HttpServletRequest.getRequestDispatcher(String)
????參數(shù)可以指定為相對路徑或絕對路徑。
????i:相對路徑情況下生成的完整URL與重定向方法相同。
????ii:絕對路徑與Servlet重定向不同,容器將相對于Web應(yīng)用的根目錄加參數(shù)生成完整的URL(即“/”根路徑就是相對于虛擬路徑)這是因為轉(zhuǎn)發(fā)是在服務(wù)器內(nèi)部進行的,寫絕對路徑/開頭指的是當(dāng)前的Web應(yīng)用程序
。即:
request.getRequestDispatcher("/foo/stuff.do")生成的URL是http://localhost/myApp/foo/stuff.do 。
???3、??◆ ServletContext.getRequestDispatcher(String)
參數(shù)只能指定為絕對路徑,生成的完整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那個目錄,如果你不是/開頭代表你從當(dāng)前工程的目錄開始,例如:webApp/HibernateApp3/
這一點非常重要,很多提交表單時發(fā)生的錯誤都是因為提交路徑出錯造成的。
附、<a href>的路徑如果是"/"開頭,則表示相對于主機,如果不是則表示相對于當(dāng)前請求
綜上所述:這里最最關(guān)鍵的要能清楚發(fā)出請求目的資源的請求是在服務(wù)器內(nèi)部還是服務(wù)器外部:內(nèi)部時,“/”就是項目的虛擬目錄;外部時,“/”就是代表主機的根目錄
《新程序員》:云原生和全面數(shù)字化實踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的Servlet中转发和重定向的路径问题以及表单提交路径问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用Chrome开发者工具调试一切
- 下一篇: Android运行时识别API版本