我有一个名为Main.jsp的文件,位于绝对url路径 “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,没有。如果${}
只相当于在<% %>
标记内进行,那么这不是成败的情况,我可以在原始问题解决后对其进行担心。但是谢谢你。
我跟着this link并尝试了以“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。
顺便说一句,谢谢你的帮助和知识。虽然不鼓励使用scriptlet,但它是相同的,这是好的。对于getcontextPath()
,我期望Main.jsp为/Open/This/Folder/
,Top.jsp为/Open/
,但两个文件都返回/Open/
,这很奇怪。我会继续调查,希望能够解决问题,再次感谢你。
答案 0 :(得分:13)
<script src>
相对于当前请求URL(如浏览器地址栏中所示),而不是JSP文件的服务器端位置。这就是需要加载脚本的webbrowser,而不是webserver。
因此,如果当前请求URL是
并且JS文件实际位于
中然后您需要将其引用为
<script type="text/javascript" src="/HL.js"></script>
前导斜杠将使其相对于域根目录。
但是,如果您的webapp本身未部署在域根目录上,而是在上下文路径上,例如(过度简化)示例中的/Open
,并且您的JS文件实际位于
然后您需要在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"
引用它。