在include文件jsp中检索文件的相对url路径



我有一个名为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>

emographic.tld和HL.js存储在与Top.jsp相同的目录中,即"http://Mywebpage.com/Open/".

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

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

我目前的逻辑是检索Top.jsp的相对路径,并将其分别前置到emogram.tld和HL.js。但我不知道该怎么做;我想弄清楚。


更新:根据BalusC的回答,我安装了标签和Tomcat 5.5。我点击了链接,web.xml包含了相应的信息。我甚至更新到了JSP1.2,什么都没有。如果${}只相当于在<% %>标签中进行,那么这不是一个成败攸关的情况,我可以在处理完原始问题后担心它。但是谢谢你。

我按照这个链接,尝试了所有以"get…"开头的方法,但似乎没有一个能奏效。

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

再次感谢。

更新2:很抱歉,出现了拼写错误;我指的是JSTL 1.2,而不是JSP 1.2。我在Tomcat 5.5.28、JSP 2.0和JSTL 1.2上。

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

<script src>相对于当前请求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>

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

然而,如果您的Web应用程序本身不是部署在域根上,而是部署在上下文路径上,例如(过于简化的)示例中的/Open,并且您的JS文件实际上位于中

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

那么您需要在URL前面加上CCD_ 12。

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

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

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

另请参阅:

  • 如何在不包含上下文根名称的情况下使用相对路径
  • 浏览器可以';t在调用转发到JSP的Servlet时访问/查找CSS、图像和链接等相关资源

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

最新更新