我在基于JSP的webapp中做了一些基本的模板。例如,我希望有一个标准的页眉和页脚(基本HTML),我将其插入到每个JSP中。
我的内容JSP位于/WEB-INF/jsp/home.jsp
,我在/WEB-INF/jsp/template/
有模板JSP,例如/WEB-INF/jsp/template/Body-Footer.jsp
。
现在,在home.jsp
内,我想要提取模板文件。首先,我尝试jsp:include
操作:
<jsp:include page="template/Body-Footer.jsp"></jsp:include>
它会生成错误javax.servlet.ServletException: File "/template/Body-Footer.jsp" not found
对我来说很奇怪,考虑到Eclipse说路径是有效的。
好的,那么我切换到include指令:
<%@ include file="template/Body-Footer.jsp" %>
这很好用,拉入我的页脚HTML。
但为什么jsp:include
不起作用?经过一些实验,我发现放入绝对路径确实可以使它工作:
<jsp:include page="/WEB-INF/jsp/template/Body-Footer.jsp"></jsp:include>
现在它工作正常,没有错误。
所以这是我的问题:为什么?为什么我(显然)需要使用jsp:include
动作的绝对路径,而不是使用include伪指令?
答案 0 :(得分:4)
/WEB-INF/jsp/template/Body-Footer.jsp
不是绝对路径。它也是一条相对的道路。问题是template/Body-Footer.jsp
是一个不完整的相对路径,而另一个是完整的。也就是说,路径相对于您的应用路径。由于/WEB-INF/
位于您的应用路径下,因此您必须将其包含在内。绝对路径意味着像C:/program files/tomcat/webapps/yourapp/WEB-INF/jsp/template/Body-Footer.jsp
答案 1 :(得分:0)
回答为什么 - jsp:include
是一个运行时指令,不像<%@ include ... %>
指令恰好是编译时指令(实际上是转换时间)。
详情请见:JSP Performance using jsp:include
底线 - 指令以不同的文件夹作为基础运行。
顺便说一下。如果你想遵循官方建议,JSP页面应该在WEB-INF文件夹之外:
答案 2 :(得分:0)
我在这里阅读了JSP 2.0规范:
Relative URL Specifications
* A context-relative path is a path that starts with a slash (/).
It is to be interpreted as relative to the application to which
the JSP page or tag file belongs. That is, its ServletContext
object provides the base context URL.
* A page relative path is a path that does not start with a
slash (/). It is to be in- terpreted as relative to the current
JSP page, or the current JSP file or tag file, depending on where
the path is being used.
现在javax.servlet.ServletContext.getRealPath("/WEB-INF/test/test.jsp")
因安全原因而为空。
假设上下文相对路径是来自WAR根目录的路径。