一尘不染

在包含文件jsp中检索文件的相对URL路径

jsp

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

在Main.jsp内部,有一个jsp包括:

<%@ 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。如果${}等同于在<% %>标签内完成操作,那么这不是成败的情况,当我解决了原始问题后,我可以担心它。但是谢谢你。

我遵循了此链接,并尝试了所有以“
get …”开头的方法,但似乎没有一个能解决问题。

getContextPath()让我/Open在这两个Top.jsp和main.jsp中,即使main.jsp中是/开/本/文件夹/。"emonogram.tld"不幸的是,这个问题影响了load
,它是一个标记库,而不仅仅是javascript文件。

再次感谢你。

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

顺便说一句,谢谢您的帮助和知识。即使不鼓励scriptlet,也是如此,这很好。使用getcontextPath(),我期望/Open/This/Folder/使用Main.jsp和/Open/Top.jsp,但是/Open/对于两个文件它都返回,这很奇怪。我将继续进行调查,并希望得出一个解决方案,再次感谢您。


阅读 279

收藏
2020-06-08

共1个答案

一尘不染

<script src>(如你在浏览器地址栏中看到),而不是JSP文件的服务器端的位置是相对于当前请求的URL。需要加载脚本的是Web浏览器,而不是Web服务器。

因此,如果当前的请求网址是

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前面加上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"

2020-06-08