我有一个名为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文件。
getContextPath()
/Open
"emonogram.tld"
再次感谢你。
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/对于两个文件它都返回,这很奇怪。我将继续进行调查,并希望得出一个解决方案,再次感谢您。
getcontextPath()
/Open/This/Folder/
/Open/
的<script src>(如你在浏览器地址栏中看到),而不是JSP文件的服务器端的位置是相对于当前请求的URL。需要加载脚本的是Web浏览器,而不是Web服务器。
<script src>
因此,如果当前的请求网址是
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()。
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"。
/WEB-INF
uri="/WEB-INF/filename.tld"