PS:這里怎么貼html阿,害得我還得格式化文本!
路徑狀態(tài)測(cè)試
目的 測(cè)試jsp之間互相跳轉(zhuǎn),servlet跳轉(zhuǎn)jsp環(huán)境下絕對(duì)路徑和相對(duì)路徑的狀態(tài) 尋找出一種通用的解決辦法
資源
打成的WAR包 MyWAR
組成文件 JSP a.jsp
b/ b.jsp ccc.jsp
Servlet
TestServlet.java mapping: /layer1/layer2/TestServlet
流程描述 1. 由a.jsp直接跳轉(zhuǎn)到b.jsp 或 由a.jsp提交到TestServlet,TestServlet根據(jù)a的提交選擇相應(yīng)跳轉(zhuǎn)方式(forward/sendRedirect) 然后跳轉(zhuǎn)到b.jsp 2. b.jsp包含一系列超鏈,來顯示不同方式的跳轉(zhuǎn)后超鏈的情況 /a.jsp ../a.jsp ../../a.jsp ../../../a.jsp
ccc.jsp /b/ccc.jsp ../ccc.jsp ../b/ccc.jsp ../../ccc.jsp ../../b/ccc.jsp ../../../ccc.jso ../../../b/ccc.jsp
[contextPath]/b/b.jsp
測(cè)試結(jié)果
短語替換
http://localhost:8080/ =>ip/ /MyWAR/=>war/ http://localhost:8080/MyWAR/ =>ip/war/ /MyWAR =>[contextPath](request.getContextPath())
跳轉(zhuǎn)方式直接跳轉(zhuǎn)<a ..>servlet/forward servlet/sendRedirect requestDispatcher.forward response.sendRedirect ---------------------+---------------------+----------------------------------+------------------------ servlet中跳轉(zhuǎn)的路徑x/b/b.jsp/war/b/b.jsp ---------------------+---------------------+----------------------------------+------------------------ 跳轉(zhuǎn)后瀏覽器的地址欄 ip/war/b/b.jsp ip/war/layer1/layer2/TestServletip/war/b/b.jsp ---------------------+---------------------+----------------------------------+------------------------ b.jsp中的鏈接列表 瀏覽器狀態(tài)條出現(xiàn)的鏈接地址 <a href="這里的描述" ---------------------+---------------------+----------------------------------+------------------------ /a.jsp ip/a.jspip/a.jspip/a.jsp ../a.jsp ip/war/a.jspip/war/layer1/a.jsp ip/war/a.jsp ../../a.jspip/a.jspip/war/a.jspip/a.jsp ../../../a.jsp ip/a.jspip/a.jspip/a.jsp
ccc.jspip/war/b/ccc.jspip/war/layer1/layer2/ccc.jspip/war/b/ccc.jsp /b/ccc.jsp ip/b/ccc.jspip/b/ccc.jspip/b/ccc.jsp ../ccc.jsp ip/war/ccc.jspip/war/layer1/ccc.jsp ip/war/ccc.jsp ../b/ccc.jsp ip/war/b/ccc.jspip/war/layer1/b/ccc.jsp ip/war/b/ccc.jsp ../../ccc.jspip/ccc.jspip/war/ccc.jspip/ccc.jsp ../../b/ccc.jspip/b/ccc.jspip/war/b/ccc.jspip/b/ccc.jsp ../../../ccc.jsp ip/ccc.jspip/ccc.jspip/ccc.jsp ../../../b/ccc.jsp ip/b/ccc.jspip/b/ccc.jspip/b/ccc.jsp
[contextPath]/b/b.jspip/war/b/b.jspip/war/b/b.jspip/war/b/b.jsp ---------------------+---------------------+----------------------------------+------------------------
總結(jié)
由上面的列表看出,只有最下面一行是有實(shí)際意義而且無論以任何方式跳轉(zhuǎn)鏈接地址都是正確無誤的 1. 在jsp中的“/”表示的根為“ip”,不包含WAR路徑 2. 在servlet中以forward方式使用的“/”表示的根為“ip/war/”,包含了WAR路徑 3. 在servlet中以sendRedirect方式使用的“/”表示的根為ip,不包含WAR路徑 4. 在servlet中以forward方式跳轉(zhuǎn),則瀏覽器的地址欄仍然為此servlet,不會(huì)改變 5. 在servlet中以sendRedirect方式跳轉(zhuǎn),則瀏覽器的地址欄改變?yōu)槟康穆窂?br>6. 相對(duì)路徑的確定是以瀏覽器的地址欄顯示的路徑為基準(zhǔn)的,而非具體的目錄結(jié)構(gòu),所以 跳轉(zhuǎn)到同目錄下的某個(gè)頁面使用<a href="文件名">link</a>這種方式不是永久成立的 (做asp的人不要驚訝,這里說的jsp和servlet :)) 7. 為了避免jsp跳jsp,servlet跳jsp,forward方式跳轉(zhuǎn),sendRedirect跳轉(zhuǎn)產(chǎn)生的路徑問題, 對(duì)于jsp和使用sendRedirect跳轉(zhuǎn)的servlet,采用直接使用帶 容器路徑[String request.getContextPath()]的絕對(duì)路徑就可以徹底解決,即: 1)<% String contextPath = request.getContextPath(); String url = contextPath + "/user/login.jsp"; %> <a href="<%=url%>"> login</a> 2) .... String contextPath = request.getContextPath(); String targetPath = contextPath + "/user/login.jsp"; RequestDispatcher rd = request.getRequestDispatcher(targetPath); rd.forward(request, response); ......
對(duì)于使用forward跳轉(zhuǎn)的servlet,則不要加容器路徑,否則就重復(fù)出現(xiàn) 容器路徑,原因參見 2
8. 如果使用的“../”過多也不會(huì)出現(xiàn)嚴(yán)重問題,“../”最多使鏈接到達(dá)“ip/” 9. 另外,在使用 <jsp:include page = "url" flush="true"/> <%@ include file="url" %> <%@ page errorPage = "url" %>時(shí), 這里url使用的“/”表示的根為“ip/war/”,包含了WAR路徑
|
溫馨提示:喜歡本站的話,請(qǐng)收藏一下本站!