jsp中 jsp:include中使用绝对路径的问题

http://www.iteye.com/problems/34149/


<jsp:include page=" /项目名/templates/header.jsp"></jsp:include> 
报的错为 
org.apache.jasper.JasperException: javax.servlet.ServletException: File &quot; /项目名/templates/header.jsp&quot; not found 
提示找不到的页面就是参数给出的页面"/项目名/templates/header.jsp" 
这个去掉开头的“/”后面的路径应该绝对没问题,除非这个“/”不代表服务器的根目录(服务器地址) 


下面 
<jsp:include page=" http://localhost:8080/项目名/templates/header.jsp"> 
报的错为 
org.apache.jasper.JasperException: javax.servlet.ServletException: File &quot;/templates/http:/localhost:8080/项目名/templates/header.jsp&quot; not found 

提示找不到的页面比参数在前面多出了一段 /templates/ 
就是说这里并没有因为参数以“http://”开头而给予"特殊待遇",只是把它当成了一段普通的字符串,同时因为不是以“/”开头的而被当成了相对路径处理,并在前面补充上了"/templates/" 
那个如果是这样,这个 "/templates/"就应该是自身所在的位置,而按此推理,这个“/”代表了??? 




又实验了下 

<jsp:include page=" ../templates/一个不存在的页面"></jsp:include> 
报错为 
org.apache.jasper.JasperException: javax.servlet.ServletException: File &quot; /templates/一个不存在的页面&quot; not found 



结论 


观察了下,想了想,知道了,原来我饶了一个大圈,问题其实很简单: 

总结了下,JSP中<jsp:include>标签的应用: 
1,不支持<%= %>等动态的语法,特别是page属性的值,只能是一个写死的字符串(刚听说,其实也有自己本身的一些特殊语法,以后再学) 
2,对于引入页面的路径问题,也可以常用"绝对路径"和"相对路径"两种应用方式。 
    绝对路径就是以“/”开头的路径,其它的包括以“http://”开头的都是相对路径,可应用“./”“../”等 

   相对路径 没什么好说的。强调一点,这里的相对路径也是相对于访问页面的URL的路径,本质上与页面文件在项目中的存储位置没直接关系,所以这里用相对路径时也存在由于访问URL不确定带来的问题(是不是这样呢?如文章开头说的,这里都是我自己的结论)。 
  
    主要是绝对路径的问题: 
     我们知道大部分情况下写在页面(不管静态还是动态)里并输出到IE中的路径都是由IE来解析的,以“/”开头的绝对路径 这个“/”代表的是服务器的根目录:比如访问URL为 http://localhost:8080/项目名/templates/template.jsp 
那么“/”代表的就是 "http://localhost:8080/" 而并不带有项目名信息。 

而<jsp:include>引入页面的过程,是在服务器运行向IE输出数据的过程中由JAVA程序调用执行,路径也当然由JAVA程序来解析,此时以"/"开头的绝对路径中的“/” 代表的已经是本项目的根目录了。 
比如 URL为 http://localhost:8080/项目名/templates/template.jsp 
那么“/”代表的就是 "http://localhost:8080/项目名/"。已经带有了项目名信息。 

同时,也不用像引入JS CSS文件那样在路径前加上 <%=request.getContextPath()%> 来解决项目名本身修改的问题了。只需一个“/”就什么也不用管了。 


如上所述: 
需求需要的这段代码其实很简单 

引用
<jsp:include page="/templates/header.jsp"></jsp:include>


需要被任意位置的页面引入的页面 存放在项目根目录下的templates目录下 

猜你喜欢

转载自blog.csdn.net/czh500/article/details/80234020