JSP 中的路径问题 收藏
首先我们来了解下 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="java.sun/jsp/jstl/core" %>
EL 隐含对象 pageContext
$
{pageContext.request.queryString}
:
value="$ {pageContext.request.queryString}"/>
$ {pageContext.request.requestURL} : value="$ {pageContext.request.requestURL}"/>
$ {pageContext.request.contextPath} : value="$ {pageContext.request.contextPath}"/>
$ {pageContext.request.method} : value="$ {pageContext.request.method}"/>
$ {pageContext.request.protocol} : value="$ {pageContext.request.protocol}"/>
$ {pageContext.request.remoteUser} : value="$ {pageContext.request.remoteUser}"/>
$ {pageContext.request.remoteAddr } : value="$ {pageContext.request.remoteAddr}"/>
$ {pageContext.session.new} : value="$ {pageContext.session.new}"/>
$ {pageContext.session.id} : value="$ {pageContext.session.id}"/>
然后我们分析一下 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” 是正确的