1.首先明確兩個概念:
伺服器路徑:形如:http://192.168.0.1/的路徑
Web應用路徑:形如:http://192.168.0.1/yourwebapp的路徑
2.關於相對路徑與絕對路徑的描述:
Servlet中,"/"代表Web應用的跟目錄。和實體路徑的相對錶示。例如:"./" 代表目前的目錄, "../"代表上級目錄。這種類似的表示,也是屬於相對路徑。這與linux中路徑的表述方法一致!
3.關於JSP/Servlet中的相對路徑和絕對路徑。
3.1伺服器端的地址
伺服器端的相對位址指的是相對於你的web應用的地址,這個地址是在伺服器端解析的(不同於html和javascript中的相對位址,他們是由用戶端瀏覽器解析的)也就是說這時候在jsp和servlet中的相對位址應該是相對於你的web應用,即相對於http: //192.168.0.1/webapp/的。
其用到的地方有:
forward:servlet中的request.getRequestDispatcher(address);這個address是在伺服器端解析的,所以,你要forward到a.jsp應該這麼寫:request.getRequestDispatcher(“/user/a.jsp”)這個/ 相對於當前的web應用webapp,其絕對位址就是:http://192.168.0.1/webapp/user/a.jsp。 sendRedirect:在jsp中<%response.sendRedirect("/rtccp/user/a.jsp");%>
3.2 用戶端的地址
所有的html頁面中的相對位址都是相對於伺服器根目錄(http://192.168.0.1/)的,而不是(跟目錄下的該Web應用的目錄) http://192.168.0.1/webapp/的。 Html中的form表單的action屬性的地址應該是相對於伺服器根目錄(http://192.168.0.1/)的,所以,如果提交到a.jsp 為:action="/webapp/user/a.jsp"或action="<%=request.getContextPath()% >"/user/a.jsp;
提交到servlet為actiom="/webapp/handleservlet" Javascript也是在用戶端解析的,所以其相對路徑和form表單一樣。
因此,一般情況下,在JSP/HTML頁面等引用的CSS,Javascript.Action等屬性前面最好都加上
<%=request.getContextPath()%>,以確保所引用的檔案都屬於Web應用中的目錄。另外,應該盡量避免使用類似".","./","../../"等類似的相對該檔案位置的相對路徑,這樣當檔案移動時,很容易出問題。
簡單地說:
所有的路徑,都是向伺服器請求資源。不同之外在於,這個路徑是在伺服器端還用戶端解析!
如果你要寫下的這個路徑是要在伺服器端解析的話,那麼這個路徑的Root應該是像http: //192.168.0.1/webapp/這種形式的,即以webapp的路徑為根路徑。比如在OOBBS系統(web應用的名字是:oobbs)的Struts2配製中:
<action name="getForumById" class="forumAction" method="getForumById">
<result name="input">/</result>
<result name="success">/site/forumList.jsp</result>
</action>
上面的路徑就是:/site/forumList.jsp而不是/oobbs/site/forumList.jsp
而如果我們的寫下的這個路徑如果是在Clinet端來解析的,那麼路徑的root就變成了http: //192.168.0.1/,即以伺服器的路徑為根路徑。此時,如果你想請求背景某些資源,如jsp,action,那麼必須要從webapp開始,寫你的路徑!
比如:
我們登陸頁面中的Form:
<form action="/oobbs/site/j_spring_security_check" method="post">
這個路徑必須是以/oobbs開頭的!
4.關於<c:url>