JSP中的路徑問題

來源:互聯網
上載者:User

 首先我們來瞭解下jsp中的一個重要角色:EL隱含對象 pageContext

pageContext 隱含物件對應於javax.servlet.jsp.PageContext型態之物件,,隱含物件都自動的被加入至pageContext中,您可以藉由它來取得與JSP相關的隱含物件對應之Servlet物件,像是getRequest()可以取得ServletRequest, getServletConfig()可以取得ServletConfig,getSession()可以取得HttpSession等等。提供取得隱含物件對應之Servlet物件並不是pageContext的主要作用,它的主要功能在提供一個單一個介面,以管理各種的公開物件(像是 HttpSession、ServletContext、ServletConfig、ServletRequest、ServletResponse等等),提供一個單一的API來管理屬性作用範圍等等。
我們之前曾經使用過session的setAttribute()等方法設定一個進程可以共用的屬性物件,使用session設定的屬性在同一個進程中可以共用,除了session之外,還有pageContext、 request、application也都可以使用setAttribute()之類的方法(詳請查閱API檔案)來設定可以共用的屬性物件,只不過這四個物件所設定的屬性其共用範圍各不相同。
使用pageContext所設定的屬性物件,其共用範圍限於同一個 JSP頁面,使用request所設定的屬性物件,其在同一個request處理期間可以共用(包括forward給其它JSP頁面),session物件所設定的屬性物件則限於同一個進程作用期間可以共用,而application物件所設定的屬性,則在整個Web應用程式中的JSP頁面都可以共用。

程式碼範例:

<%@ page contentType="text/html;charset=GB2312" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<html>
<head>
<title>pageContext.jsp</title>
</head>
<body>

<h2>EL隱含對象 pageContext</h2>

$ {pageContext.request.queryString}:<c:out value="$ {pageContext.request.queryString}"/></br>
$ {pageContext.request.requestURL}:<c:out value="$ {pageContext.request.requestURL}"/></br>
$ {pageContext.request.contextPath}:<c:out value="$ {pageContext.request.contextPath}"/></br>
$ {pageContext.request.method}:<c:out value="$ {pageContext.request.method}"/></br>
$ {pageContext.request.protocol}:<c:out value="$ {pageContext.request.protocol}"/></br>
$ {pageContext.request.remoteUser}:<c:out value="$ {pageContext.request.remoteUser}"/></br>
$ {pageContext.request.remoteAddr }:<c:out value="$ {pageContext.request.remoteAddr}"/></br>
$ {pageContext.session.new}:<c:out value="$ {pageContext.session.new}"/></br>
$ {pageContext.session.id}:<c:out value="$ {pageContext.session.id}"/></br>

</body>
</html>

 

 

 

 

然後我們分析一下jsp中的路徑問題:

 

JSP 中究竟採用絕對路徑還是採用相對路徑隨著所採用技術的越來越複雜,這個問題也變得越來越難以解決。

1) 採用相對路徑遇到的問題

l          相對路徑固然比較靈活,但如果想複製頁面內的代碼卻變得比較困難,因為不同的頁面具有不同的相對路徑,複製後必須修改每一個串連的路徑。

l          如果頁面被多於一個的頁面所包含,那麼被包含頁面中的相對路徑將是不正確的。

l          如果採用 Struts 的 Action 返回頁面,那麼由於頁面路徑與 Action 路徑不同,使得瀏覽器無法正確解釋頁面中的路徑,如頁面為 /pages/cust/cust.jsp ,圖片所有目錄為 /images/title.gif ,這時在 /pages/cust/cust.jsp 中的所用的路徑為 ”../../images/title.gif” ,但是如果某一個 Action 的 Forward 指向這個 JSP 檔案,而這個 Action 的路徑為 /cust/manage.do ,那麼頁面內容中 ”../../images/title.gif” 就不再指向正確的路徑了。

解決以上問題似乎只有使用絕對路徑了。

2) 採用絕對路徑遇到的問題

l          隨著不同的 Web 應用程式發布方式,絕對路徑的值也不同。如 Web 應用程式發布為 MyApp ,則路徑 ”/MyApp/images/title.gif” 是正確的,但發布為另一應用時如 MyApp2 ,這個路徑就不對了,也許這個情況比較少,但以 default 方式發布 Web 應用程式時以上絕對路徑也不同: ”/images/title.gif” 。

 

 

 

解決方案:

 

 

1)   採用絕對路徑,但為瞭解決不同部署方式的差別,在所有非 struts 標籤的路徑前加 ${pageContext.request.contextPath} ,如原路徑為:

”/images/title.gif” ,改為

“${pageContext.request.contextPath}/images/title.gif” 。

代碼 ” ${pageContext.request.contextPath}” 的作用是取出部署的應用程式名稱,這樣不管如何部署,所用路徑都是正確的。

缺點:

 

 

操作不便,其他工具無法正確解釋 ${pageContext.request.contextPath}

2)   採用相對路徑,在每個 JSP 檔案中加入 base 標籤,如:

<base href="http://${header['host']}${pageContext.request.contextPath}/pages/cust/relation.jsp" />

這樣所有的路徑都可以使用相對路徑。

缺點:

 

 

對於被包含的檔案依然無效。

    真正使用時需要靈活應用1)和2),寫出更加健壯的代碼。

 

 

PS:

 

 

這裡要注意的是如果用了上面的 ${pageContext.request.contextPath} 運算式的の時候那麼你的web.xml要保證頭是這樣的

<?xml version="1.0" encoding="gbk"?>

<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
    version="2.4">

 

確保是2.4的schema

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.