`
q339549989
  • 浏览: 2294 次
  • 性别: Icon_minigender_1
  • 来自: 江西
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

jsp:include 中路径问题

阅读更多
这里我主要是在讲自己在解决这个问题过程中对具体问题的理解,有可能前后矛盾,因为我是把我的认识过程顺序的说出来,想让大家帮忙指出不对的地方。
因为问题解决了,可是道理认识歪了,后患无穷啊。特别是对我这个非科班出身的2手程序员。

PS:不知道怎么在入门讨论中发普通的帖子。提示我没积分了,那就发个提问帖,本来这贴目的其实也是在“提问”


------------------------------------------------------------------------------------------------


从一个需求说起(自己之前对WEB项目中的相对路径和绝对路径有一些了解)

需求是这样的,要在JSP中应用<jsp:include>标签引入一个公用的页面

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

就是写类似上面的一段语句。

不过这段代码的要求是要在本项目中任意一个JSP文件中都管用的,
说白了就是在项目现有的任意一个页面中加入相同的这样一段代码,都能达到引入某个固定页面的效果。

所以这里不能用相对路径。原因我自己总结了两条:

1,没办法保证对页面的访问方式,是直接访问还是通过其它请求跳转访问,访问的URL不确定,相对路径达不到要求。

2,项目中的页面本身目录结构不可能都正好在一个文件夹中。

所以自然想到用绝对路径,所以开始我是这样写的

引用

<jsp:include page="<%=request.getContextPath()%>/templates/header.jsp"></jsp:include>



这么写,当时没多想,就是直接仿照引入其它图片CSS什么的写的。比如
Java代码
<link rel="stylesheet" type="text/css" href="<%=request.getContextPath()%>/css/xx.css"/> 

<link rel="stylesheet" type="text/css" href="<%=request.getContextPath()%>/css/xx.css"/>

页面报错,之后想想,TOMCAT(我用的是TOMCAT)解析JSP时,对<jsp:include>的解析有别于其它。

Java代码
 
<link rel="stylesheet" type="text/css" href="<%=request.getContextPath()%>/css/xx.css"/>  
只是按照基本规则简单的解析为几个输出语句:  
       out.write("<link rel=\"stylesheet\" type=\"text/css\" href=\"");  
      out.print(request.getContextPath());  
      out.write("/css/xx.css\"/>\r\n"); 


<link rel="stylesheet" type="text/css" href="<%=request.getContextPath()%>/css/xx.css"/>
只是按照基本规则简单的解析为几个输出语句:
       out.write("<link rel=\"stylesheet\" type=\"text/css\" href=\"");
      out.print(request.getContextPath());
      out.write("/css/xx.css\"/>\r\n");


而对<jsp:include>的解析却要特殊一些,它没有直接输出字符串的语句,而是这样的:

引用

<jsp:include page="../templates/header.jsp"></jsp:include>
被解析为:
org.apache.jasper.runtime.JspRuntimeLibrary.include(request, response, "../templates/header.jsp", out, false);



自己简单总结了下,JSP中对<jsp:include>标签的解析就是直接生成上面那样一条语句,而page属性的值直接作为方法的参数,也因为这个,所以page的值不能这样写page="<%=request.getContextPath()%>/templates/header.jsp"。之所以不能这样写(自己认为)也没什么道理需要讲,说白了就是JSP没这样的语法。

也就是说对于<jsp:include>标签的page属性的值,只能是一个写死的字符串。否则在JSP级别上就会有语法错误,结果是容器连对应的JAVA文件都没办法生成,更不要说真正用到的CLASS文件了。

综上,所以页面会报错。

那么这里怎么用绝对路径呢?或者说 org.apache.jasper.runtime.JspRuntimeLibrary.include方法是怎么用的?

GOOGLE了下 也没找到什么对自己有用的(自己看得懂的)东西。

又尝试了其它几种形式

Java代码
<jsp:include page="/项目名/templates/header.jsp"></jsp:include>  
解析为  
org.apache.jasper.runtime.JspRuntimeLibrary.include(request, response, "/项目名/templates/header.jsp", out, false); 

<jsp:include page="/项目名/templates/header.jsp"></jsp:include>
解析为
org.apache.jasper.runtime.JspRuntimeLibrary.include(request, response, "/项目名/templates/header.jsp", out, false);

Java代码
<jsp:include page="http://localhost:8080/项目名/templates/header.jsp"></jsp:include>  
解析为  
org.apache.jasper.runtime.JspRuntimeLibrary.include(request, response, "http://localhost:8080/项目名/templates/header.jsp", out, false); 

<jsp:include page="http://localhost:8080/项目名/templates/header.jsp"></jsp:include>
解析为
org.apache.jasper.runtime.JspRuntimeLibrary.include(request, response, "http://localhost:8080/项目名/templates/header.jsp", out, false);

以上2种尝试,对于标签的解析结果符合之前我的结论,JSP顺利的生成了最后的CLASS文件。
可是访问时继续报错。
"/项目名/templates/header.jsp”“http://localhost:8080/项目名/templates/header.jsp”
这两种路径就是WEB项目中绝对路径的用法。
而连生成的JAVA文件中,方法的参数也都已经成功把这2个参数带入了,可是仍报错。
显然org.apache.jasper.runtime.JspRuntimeLibrary.include方法对路径的解析与IE不同。


人多力量大,请经理来看看,在报错信息中发现了问题。


之前2中用法:
<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目录下






问题补充:

多谢,特别是1楼说的第一点(1.jsp:include支持<%=%>语句。),使自己有动力学一学 jsp:include 中 <%=%>到底怎么用


做了个测试:

测试1:
Java代码
<% String pageURL = "header.jsp"; %><%=pageURL%><jsp:include page= "/templates/<%=pageURL%>" ></jsp:include>   
 
被解析成了这样一段JAVA代码  
 
  String pageURL = "header.jsp";   
      out.print(pageURL);  
      org.apache.jasper.runtime.JspRuntimeLibrary.include(request, response, "/templates/<%=pageURL%>" , out, false); 

<% String pageURL = "header.jsp"; %><%=pageURL%><jsp:include page= "/templates/<%=pageURL%>" ></jsp:include>

被解析成了这样一段JAVA代码

  String pageURL = "header.jsp";
      out.print(pageURL);
      org.apache.jasper.runtime.JspRuntimeLibrary.include(request, response, "/templates/<%=pageURL%>" , out, false);


这个跟我之前说的一样, page="/templates/<%=pageURL%>"  引号中的值被当成了一个字符串作为对应方法的参数,而没有对 <%=%>有什么特殊的处理。


测试2:

Java代码
 
<% String pageURL = "/templates/header.jsp"; %><%=pageURL%><jsp:include page= "<%=pageURL%>" ></jsp:include>  
 
解析结果  
String pageURL = "/templates/header.jsp";   
      out.print(pageURL);  
      org.apache.jasper.runtime.JspRuntimeLibrary.include(request, response, pageURL, out, false); 


<% String pageURL = "/templates/header.jsp"; %><%=pageURL%><jsp:include page= "<%=pageURL%>" ></jsp:include>

解析结果
String pageURL = "/templates/header.jsp";
      out.print(pageURL);
      org.apache.jasper.runtime.JspRuntimeLibrary.include(request, response, pageURL, out, false);

哈哈,这次 解析的时候 成功的将 page="<%=pageURL%>" 中的pageURL当成一个变量作为对应方法的参数了


我得到的结论就是:

首先就是一楼朋友说的,
在<jsp:include>中是支持<%=%>的。

具体的语法就是,在给page属性赋值的时候,如果想应用<%=%>。那么一定不要另外添加其它字符,这样就会将<%=%>中的变量成功解析为对应方法的参数。
否则会将引号中的内容当成一个死的字符串作为参数。
分享到:
评论

相关推荐

    jsp:include与include实探

    在Java Web开发中,`jsp:include`和`&lt;jsp:include&gt;`标签是两种常见的页面包含机制,它们用于将一个或多个动态或者静态资源合并到一个JSP页面中。这两种方式虽然看似相似,但有着本质的区别,理解它们的用法和区别...

    使用jsp:include控制动态内容的方法

    在传统的静态内容包含中,include指令的作用是在JSP页面转换为Servlet的过程中,把指定的文件内容包含进来。这种做法简单直接,但是有一个显著的限制:它不能很好地处理动态内容。当被包含的内容频繁变化时,例如,...

    jsp_include_demo.rar_DEMO

    `jsp_include_demo`示例可能展示了如何在JSP页面中使用`&lt;jsp:include&gt;`标签来包含一个或多个公共组件,如页眉、页脚或者导航栏。这些组件可以独立维护,任何改动都会自动反映在使用它们的页面上,提高了代码的组织...

    jsp中两种包含关系(include动作和include指令)的区别

    在JavaServer Pages (JSP) 技术中,存在两种包含关系:`&lt;jsp:include&gt;` 动作和 `jsp:include` 指令。它们都是用来将一个页面的内容插入到另一个页面中的,但它们的工作方式和适用场景有所不同。 **1. `&lt;jsp:include...

    Java Web应用开发 14 课堂案例-使用include动作.docx

    在Java Web应用开发中,`jsp:include`动作是一个重要的元素,它允许开发者在JSP页面中动态地插入其他文件内容。本案例旨在教授如何使用`jsp:include`动作,并对比其与`&lt;jsp:include&gt;`指令的区别。下面将详细阐述`jsp...

    jsp的Include方式

    在JSP中,`Include` 方式是实现页面组合的重要技术,它允许我们把多个页面的内容合并到一个主页面中,从而实现代码复用和页面布局的灵活管理。本文将深入探讨JSP的`Include` 方式的概念、类型以及使用方法。 1. **...

    include 两种用法的区别

    - **处理方式**:每次请求主页面时,都会根据`&lt;jsp:include&gt;`标签指定的路径加载对应的JSP页面,并将其输出插入到主页面中相应的位置。 - **优点**:能够实时反映被包含页面的最新变化,无需重启应用或重新编译JSP...

    jsp学习大全精华.doc

    在提供的文档中,主要涉及了两个关键的JSP动作元素:`jsp:forward`和`jsp:include`,以及它们在处理页面间数据传递中的应用。 1. **jsp:forward** 语句: `jsp:forward` 用于页面间的请求转发,而不是创建新的HTTP...

    JSP动态网页设计:第9章 JSP动作元素.ppt

    JSP 动态网页设计中的动作元素是JSP页面中不可或缺的部分,它们允许开发者在页面级别执行各种操作,包括引入其他资源、转发请求以及与JavaBean交互等。本章主要探讨了以下几个关键的动作元素: 1. **JSP动作元素...

    jsp常用标签

    本文将介绍JSP中五种常用的标签:Include、Forward、UseBean、GetProperty和SetProperty。 一、Include 指令 Include 指令用于包含一个静态的或者动态的文件。语法:&lt;jsp:include page="path" flush="true" /&gt; or ...

    JSP_jsp_forward实例

    **JSP_jsp_forward实例详解** 在Web开发中,JSP(JavaServer Pages)是一种用于创建动态...在学习和使用过程中,我们需要关注其与`jsp:include`的区别,理解它们在不同场景下的适用性,以便在实际开发中做出最佳选择。

    Java Web程序设计入门课件-JSP动作元素.pptx

    总结起来,JSP动作元素如`&lt;jsp:include&gt;`和`&lt;jsp:forward&gt;`是Java Web开发中用于组织和控制页面流程的关键工具。它们帮助开发者保持页面结构清晰,同时提供了在运行时动态处理内容和请求转发的能力,增强了Web应用...

    jsp 的一些基本资料

    JSP:Include 标签用于在 JSP 页面中包含其他页面或资源。该标签支持两种模式:`flush` 和 `page`。 - **Flush**: 如果设置为 `true`,则当前页面会先刷新缓冲区再执行包含操作。如果设置为 `false` 或不设置,则...

    jsp数据分页源代码

    `&lt;jsp:include&gt;`是一个动作标签,用于在运行时将一个静态或动态资源插入到JSP页面中。 2. **分页原理**: 数据分页通常包括两个主要部分:前端的分页展示和后端的数据查询。前端负责显示分页链接,后端根据用户的...

    kindEditor编辑器用jsp标签引用

    1 在head中引入kindeditor的js代码,注意kindeditor.js的路径 &lt;script type="text/javascript" charset="utf-8" src="kindEditor/kindeditor.js"&gt;&lt;/script&gt; 2在要显示编辑器的地方加下面代码 &lt;jsp:include page=...

    WEB开发 之 Actions的使用.docx

    在Web开发中,Actions是一种在JSP(JavaServer Pages)中实现动态功能的关键元素。它们允许开发者在页面生成时执行特定的操作,如包含其他文件、使用JavaBean组件、设置和获取Bean的属性以及转发请求到新的页面。...

    04B、JSP程序设计(中)1

    10. **附录内容**:附录中提到了如Cookie对象的方法、request对象的其他方法、JSP页面构成元素、JSP指令标签、JavaBean的scope配置、虚拟主机和虚拟路径的配置等进阶知识,这些都是JSP开发中不可或缺的部分。...

    Jsp选择路径.rar

    在处理JSP中的路径选择时,开发者需要理解几个关键的概念和最佳实践,这关乎到应用程序的正确运行和资源的有效访问。 1. **相对路径与绝对路径** - **绝对路径**:从根目录开始的完整路径,指明文件或资源的确切...

    jsp问答题复习.doc

    &lt;jsp:include&gt;动作标识与include指令都可用来包含文件,实现格式分别为:&lt;jsp:include page="被包含文件的路径" /&gt;&lt;%@ include file="文件的绝对路径或相对路径" %&gt;。二者的区别: (1)、属性:include指令通过...

Global site tag (gtag.js) - Google Analytics