-
jsp中 <jsp:include> 中使用绝对路径的问题3
这里我主要是在讲自己在解决这个问题过程中对具体问题的理解,有可能前后矛盾,因为我是把我的认识过程顺序的说出来,想让大家帮忙指出不对的地方。
因为问题解决了,可是道理认识歪了,后患无穷啊。特别是对我这个非科班出身的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什么的写的。比如<link rel="stylesheet" type="text/css" href="<%=request.getContextPath()%>/css/xx.css"/>
页面报错,之后想想,TOMCAT(我用的是TOMCAT)解析JSP时,对<jsp:include>的解析有别于其它。
<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了下 也没找到什么对自己有用的(自己看得懂的)东西。
又尝试了其它几种形式
<jsp:include page="/项目名/templates/header.jsp"></jsp:include> 解析为 org.apache.jasper.runtime.JspRuntimeLibrary.include(request, response, "/项目名/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 " /项目名/templates/header.jsp" not found
提示找不到的页面就是参数给出的页面"/项目名/templates/header.jsp"
这个去掉开头的“/”后面的路径应该绝对没问题,除非这个“/”不代表服务器的根目录(服务器地址)
下面
<jsp:include page=" http://localhost:8080/项目名/templates/header.jsp">
报的错为
org.apache.jasper.JasperException: javax.servlet.ServletException: File " /templates/http:/localhost:8080/项目名/templates/header.jsp" not found
提示找不到的页面比参数在前面多出了一段 /templates/
就是说这里并没有因为参数以“http://”开头而给予"特殊待遇",只是把它当成了一段普通的字符串,同时因为不是以“/”开头的而被当成了相对路径处理,并在前面补充上了"/templates/"
那个如果是这样,这个 "/templates/"就应该是自身所在的位置,而按此推理,这个“/”代表了???
又实验了下
<jsp:include page=" ../templates/一个不存在的页面"></jsp:include>
报错为
org.apache.jasper.JasperException: javax.servlet.ServletException: File " /templates/一个不存在的页面" 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:<% String pageURL = "header.jsp"; %><%=pageURL%><jsp:include page= [color=red]"/templates/<%=pageURL%>" [/color]></jsp:include> 被解析成了这样一段JAVA代码 String pageURL = "header.jsp"; out.print(pageURL); org.apache.jasper.runtime.JspRuntimeLibrary.include(request, response, [color=red]"/templates/<%=pageURL%>" [/color], out, false);
这个跟我之前说的一样, page="/templates/<%=pageURL%>" 引号中的值被当成了一个字符串作为对应方法的参数,而没有对 <%=%>有什么特殊的处理。
测试2:
<% String pageURL = "/templates/header.jsp"; %><%=pageURL%><jsp:include page= [color=red]"<%=pageURL%>" [/color]></jsp:include> 解析结果 String pageURL = "/templates/header.jsp"; out.print(pageURL); org.apache.jasper.runtime.JspRuntimeLibrary.include(request, response, [color=red]pageURL[/color], out, false);
哈哈,这次 解析的时候 成功的将 page="<%=pageURL%>" 中的pageURL当成一个变量作为对应方法的参数了
我得到的结论就是:
首先就是一楼朋友说的,
在<jsp:include>中是支持<%=%>的。
具体的语法就是,在给page属性赋值的时候,如果想应用<%=%>。那么一定不要另外添加其它字符,这样就会将<%=%>中的变量成功解析为对应方法的参数。
否则会将引号中的内容当成一个死的字符串作为参数。
2010年1月12日 23:20
2个答案 按时间排序 按投票排序
-
采纳的答案
引用1,不支持<%= %>等动态的语法,特别是page属性的值,只能是一个写死的字符串(刚听说,其实也有自己本身的一些特殊语法,以后再学)
2,对于引入页面的路径问题,也可以常用"绝对路径"和"相对路径"两种应用方式。
绝对路径就是以“/”开头的路径,其它的包括以“http://”开头的都是相对路径,可应用“./”“../”等
1.jsp:include支持<%=%>语句。
2.相对路径是直接以文件夹名称开头的路径。.为当前文件夹,..为上级文件夹。其余的都是绝对路径2010年1月13日 00:21
-
只要搞清楚“/”代表的是什么就行了:
(1).在form,js,css,sendRedirect里边,代表的是http://127.0.0.1/;
(2).在web.xml中的url-pattern,forword代表的是 http://127.0.0.1/myweb。myweb是项目名2010年1月13日 13:10
相关推荐
在Java Web开发中,`jsp:include`和`<jsp:include>`标签是两种常见的页面包含机制,它们用于将一个或多个动态或者静态资源合并到一个JSP页面中。这两种方式虽然看似相似,但有着本质的区别,理解它们的用法和区别...
标准的动作元素包括`<jsp:include>`、`<jsp:forward>`、`<jsp:param>`、`<jsp:plugin>`、`<jsp:useBean>`、`<jsp:setProperty>`和`<jsp:getProperty>`。 2. **<jsp:include>**: 这个动作元素用于动态地将一个页面...
`<s:include>`标签用于在JSP页面中包含其他JSP或Servlet的输出。例如: ```jsp <s:include value="header.jsp" id="header" /> ``` `value`属性指定要包含的页面,`id`属性为HTML元素设置ID。 5. **Param标签*...
- **定义**:用于传递参数值给`<jsp:include>`或`<jsp:forward>`。 - **使用格式**: ```jsp <jsp:param name="paramName" value="paramValue"/> ``` 7. **<jsp:plugin>** - **定义**:根据客户端浏览器类型...
`jsp_include_demo`示例可能展示了如何在JSP页面中使用`<jsp:include>`标签来包含一个或多个公共组件,如页眉、页脚或者导航栏。这些组件可以独立维护,任何改动都会自动反映在使用它们的页面上,提高了代码的组织...
- `<jsp:param>`:在`<jsp:include>`或`<jsp:forward>`中传递参数。 2. JSTL(JavaServer Pages Standard Tag Library)标签库: - `<c:forEach>`:遍历集合或数组,是Java中的for-each循环的替代品。 - `<c:if>...
<include>**/**</include> </includes> </resource> <resource> <directory>src/main/resources</directory> </resource> <resource> <directory>src/main/java</directory> <includes> <include>**/*.xml...
语法:<jsp:include page="path" flush="true" /> or <jsp:include page="path" flush="true"> <jsp:param name="paramName" value="paramValue" /> </jsp:include> * page="path" 为相对路径,或者代表相对路径的...
通过`<bean:define>`可以定义一个变量,`<bean:write>`用来输出JavaBean的属性值,`<bean:include>`可以将一个包含JavaBean的JSP页面嵌入到当前页面。`<bean:cookie>`、`<bean:header>`等标签则用于获取客户端的...
<p>当前时间:<%= currentTime %></p> ``` 在这个示例中,我们首先创建了一个`Date`对象来获取当前日期时间,然后使用`SimpleDateFormat`类格式化时间字符串,最后通过`<%= currentTime %>`输出到页面上。 #### 4....
<%-- 或者使用静态包含:<%@ include file="date.jsp" %> --%> </head> <body> <p>今天的日期是:</p> </body> </html> ``` 如果使用`<jsp:include page="date.jsp" flush="true"/>`,那么每当访问`test.jsp...
JSP动作元素允许开发者在JSP页面中使用XML样式的标签,而不是内嵌Java代码,从而提高页面的可读性和可维护性。这些标签执行特定的任务,比如包含其他资源或转发请求,减少了页面中Java脚本的混乱。 4.5.1 `<jsp:...
然后就可以在页面中使用JSTL标签,如`<c:out value="${expression}" />`。 **4. ** **JSTL的主要标签** - **控制流标签**:`<c:if>`、`<c:choose>`、`<c:when>`、`<c:otherwise>`、`<c:forTokens>`、`<c:forEach>`...
5. `<c:import>`:类似`<jsp:include>`,但支持URL路径。 6. `<c:url>`和`<c:param>`:构建URL并添加参数。 五、自定义标签 自定义标签允许开发者创建自己的标签库,提高代码复用性。通过创建TLD(Tag Library ...
而`<jsp:include>`用于动态地将一个页面嵌入到另一个页面中,`flush`属性决定是否清空缓冲区。它与`<%@ include %>`指令的主要区别在于包含时机和结果的处理方式。 作业中,你需要创建一个JSP页面,包含各种表单...
3. 如果需要根据图片的不同来决定跳转的页面,可以在JSP中使用条件语句(如`<c:if>`标签,来自JSTL库)来处理。例如: ```html <c:forEach var="image" items="${imagesList}"> <c:choose> <c:when test="${image...
在JavaServer Pages (JSP) 技术中,存在两种包含关系:`<jsp:include>` 动作和 `jsp:include` 指令。它们都是用来将一个页面的内容插入到另一个页面中的,但它们的工作方式和适用场景有所不同。 **1. `<jsp:include...
<jsp:include page="kindEditor/jsp/test.jsp"> <jsp:param name="formName" value="form1"/> <jsp:param name="editorId" value="content" /> <jsp:param name="eWidth" value="800" /> <jsp:param name=...