【问题标题】:Retrieving relative url path of file inside a include file, jsp检索包含文件,jsp中文件的相对url路径
【发布时间】:2011-09-09 13:36:28
【问题描述】:

我有一个名为 Main.jsp 的文件,位于 “http://Mywebpage.com/Open/This/Folder/Main.jsp”。

在Main.jsp里面,有一个jsp include:

<%@ include file="../../Top.jsp" %>

现在,在 Top.jsp 页面中,我还有其他引用文件的 jsp 和 javascript 语句:

<%@ taglib uri="emonogram.tld" prefix="em" %>
...
<script type="text/javascript" src="HL.js"></script>

emonogram.tld 和 HL.js 与 Top.jsp 存储在同一目录下,即“http://Mywebpage.com/Open/”。

我需要 Top.jsp 足够灵活,这样任何文件都可以引用它,无论它在目录树中的什么位置。这里的问题是我收到错误,因为无法找到 Top.jsp 中引用的文件。为什么? jsp 包含路径将是 Main.jsp 的相对路径。所以,Top.jsp 会失败,因为当我调用 emonogram.tld 时,我想要“http://Mywebpage.com/Open/emonogram.tld”,但它实际上是“http://Mywebpage.com/Open /This/Folder/emonogram.tld"。

我尝试查看一些 jsp 选项,例如 getRequestURL、getServletPath、getRealPath 和 getContextPath,但这些方法似乎没有返回我想要的。

我当前的逻辑是检索 Top.jsp 的相对路径,并将其分别添加到 emonogram.tld 和 HL.js。但我不知道该怎么做;我正在努力解决这个问题。


更新: 根据 BalusC 的回答,我安装了标签和 Tomcat 5.5。我按照链接和 web.xml 包含适当的信息。我什至更新到 JSP 1.2,什么也没有。如果${} 相当于在&lt;% %&gt; 标记内执行它,那么这不是成败的情况,在我得到原始问题后我可以担心它。不过谢谢。

我关注this link 并尝试了所有以“get...”开头的方法,但似乎都没有成功。

getContextPath() 在 Top.jsp 和 Main.jsp 中都给了我/Open,即使 Main.jsp 在 /Open/This/Folder/ 中。这个问题正在影响加载"emonogram.tld",这是一个标签库,而不仅仅是javascript文件,不幸的是。

再次感谢您。

Update2:抱歉,严重的拼写错误;我的意思是 JSTL 1.2,而不是 JSP 1.2。我在 Tomcat 5.5.28、JSP 2.0 和 JSTL 1.2。

顺便说一句,感谢您的帮助和知识。这是一样的,这很好,即使不鼓励使用 scriptlet。使用getcontextPath(),我期待Main.jsp 为/Open/This/Folder/,Top.jsp 为/Open/,但它为这两个文件返回/Open/,这很奇怪。我会继续调查,希望能找到一个解决方案,再次感谢你。

【问题讨论】:

    标签: jsp url path include relative-path


    【解决方案1】:

    &lt;script src&gt; 是相对于当前请求 URL(如您在浏览器地址栏中看到的),而不是相对于 JSP 文件的服务器端位置。即需要加载脚本的是网络浏览器,而不是网络服务器。

    那么,如果当前请求的 URL 是

    http://Mywebpage.com/Open/This/Folder/Main.jsp

    而JS文件实际上位于

    http://Mywebpage.com/HL.js

    那么您需要将其引用为

    <script type="text/javascript" src="/HL.js"></script>
    

    前导斜杠将使其相对于域根。

    但是,如果您的 webapp 本身并未部署在域根目录上,而是部署在上下文路径上,例如您的(过于简化的)示例中的 /Open,并且您的 JS 文件实际上位于

    http://Mywebpage.com/Open/HL.js

    那么你需要在 URL 前面加上HttpServletRequest#getContextPath()。

    <script type="text/javascript" src="${pageContext.request.contextPath}/HL.js"></script>
    

    这将结束(在浏览器中右键单击页面,执行查看源代码查看)

    <script type="text/javascript" src="/Open/HL.js"></script>
    

    另见:


    更新:根据您的更新,请注意这不适用于 TLD 文件,因为它们已在服务器端解析。通常,您应该将 TLD 文件放在/WEB-INF 文件夹中,并通过uri="/WEB-INF/filename.tld" 引用它。

    【讨论】:

    • 您好,非常感谢您的帮助。不幸的是,它没有用。我不认为它识别表达式语言。是否需要像 tomcat 一样识别 JSP 中的表达式语言? request.getContextPath() 是否相当于 ${pageContext.request.contextPath}?我去了这个页面并尝试了所有以“get”(download.oracle.com/javaee/6/api/javax/servlet/http/…)开头的方法,但我仍然有问题。我将在对我最初的问题的更新中进一步解释。谢谢。
    • 您需要确保您至少在运行一个与 Servlet 2.4 兼容的容器(Tomcat 5.5 或更高版本等),并且声明 web.xml 符合 Servlet 2.4 版本。另请参阅 JSTL wiki 页面的底部:stackoverflow.com/tags/jstl/info
    • 谢谢。是的,我试过没有运气。我会继续尝试,但是我可以推迟解决这个问题还是 ${pageContext.request.contextPath} 与 ???
    • 根据您的问题更新,您需要至少 JSP 2.0,而不是JSP 1.2。 Servlet 2.4 与 JSP 2.0 齐头并进。如果由于某些不清楚的原因你真的不能让模板文本中的 EL 工作(尽管它应该在 Tomcat 5.5 上使用 web.xml 作为 Servlet 2.4 工作正常,可能你已经把 /WEB-INF/lib 与 servletcontainer 特定库的过时版本混淆了,您应该删除它们),然后您可以使用 &lt;%=request.getContextPath()%&gt; 通过 scriptlets 获得相同的结果。但是不鼓励使用 scriptlets。
    猜你喜欢
    • 2011-12-08
    • 1970-01-01
    • 1970-01-01
    • 2014-04-24
    • 2014-11-15
    • 2012-04-08
    • 1970-01-01
    • 1970-01-01
    • 2019-04-21
    相关资源
    最近更新 更多