文档章节

<%@ INCLUDE FILE=""%>与<JSP:INCLUDE PAGE=""/>区别

ForingY
 ForingY
发布于 2016/02/24 11:24
字数 1920
阅读 17
收藏 1
点赞 1
评论 0

 两者最重要的区别:JSP指令<%@ include file=""%>,是将被引入的JSP与原JSP融合到一起,而这个融合过程是在翻译阶段进行的。

    为什么需要翻译阶段?我们知道,jsp页面并不是原封不动的发送到客户端的,因为浏览JSP页面的客户端并不需要安装Java虚拟机,客户端机器并不能读懂JSP,它能读懂的只有HTML、JavaScript (当然还有其他,例如:Applet、Flex、AxtiveX等等,但那些都需要下载相应的客户端解析器),这样就需要Servlet Engine (例如:Tomcat) 将所有的JSP元素进行处理。这是通过将jsp页面转化成Servlet,然后执行这个Servlet来完成的。服务器需要一个jsp容器来处理jsp页面。jsp容器通常以Servlet的形式实现,这个servlet经过配置,可以处理对jsp页面的所有请求。

    JSP容器负责将jsp页面转化成servlet,并编译这个servlet。这两个步骤就构成了翻译阶段。

    而jsp翻译之后的servlet输出的内容才是客户端浏览器能够识别的东西,HTML、JavaScript之类的,servlet是使用JspWriter对象输出输出这些HTML、JavaScript的。如果你去翻看翻看jsp编译后的servlet代码,你会发现很有意思的东西,比如Struts的<logic:iterator>标签,被翻译成do{}while()语句实现循环。如果我们把<bean:write>写在<logic:iterator>内部,则在do的内部会出现类似_jspx_meth_bean_write_2(_jspx_th_logic_iterate_0, _jspx_page_context)的方法调用。这些说明了一切。

    由此我们知道:jsp页面是把include指令元素(<%@ include file=""%>)所指定的页面的实际内容(也就是代码段)加入到引入它的jsp页面中,合成一个文件后被jsp容器将它转化成servlet。可以看到这时会产生一个临时class文件和一个servlet源文件。而动作元素(<jsp:include page=""/>)是在请求处理阶段引入的,会被JSP容器生成两个临时class文件和两个servlet原文件。而引入的只是servlet的输出结果,即JspWriter对象的输出结果,而不是jsp的源代码。

    举个例子:

    main.jsp

<%@ page language="java" pageEncoding="GBK"%>  
  
<%@ taglib uri="http://struts.apache.org/tags-bean" prefix="bean" %>  
<%@ taglib uri="http://struts.apache.org/tags-html" prefix="html" %>  
<%@ taglib uri="http://struts.apache.org/tags-logic" prefix="logic" %>  
<%@ taglib uri="http://struts.apache.org/tags-tiles" prefix="tiles" %>  
  
  
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  
<html:html lang="true">  
  <head>  
    <html:base />  
      
    <title>index.jsp</title>  
    <meta http-equiv="Content-Type" content="text/html; charset=GBK" />  
    <meta http-equiv="pragma" content="no-cache">  
    <meta http-equiv="cache-control" content="no-cache">  
    <meta http-equiv="expires" content="0">      
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">  
    <meta http-equiv="description" content="This is my page">  
    <!-- 
    <link rel="stylesheet" type="text/css" href="styles.css"> 
    -->  
  
  </head>  
    
  <body>  
    <!-- Header Page Information -->  
<%-- <%@ include file="include/head.jsp"%>--%>  
    <jsp:include page="include/head.jsp"></jsp:include>  
    <!-- Nav Bar -->  
<%-- <%@ include file="include/menubar.jsp"%>--%>  
    <jsp:include page="include/menubar.jsp"></jsp:include>  
    我是主体<br><br><br>  
    我是主体<br><br><br>  
    我是主体<br><br><br>  
    我是主体<br><br><br>  
    我是主体<br><br><br>  
    我是主体<br><br><br>  
    我是主体<br><br><br>  
    我是主体<br><br><br>  
    我是主体<br><br><br>  
    我是主体<br><br><br>  
<%--        <%@ include file="include/copyright.jsp"%>--%>  
<%--        <jsp:include page="/includeSample_copyright.do"></jsp:include>--%>  
<%-- <jsp:include flush="true" page="include/copyright.jsp"></jsp:include>--%>  
  </body>  
</html:html>
<%@ page language="java" pageEncoding="GBK"%><%@ taglib uri="http://struts.apache.org/tags-bean" prefix="bean" %><%@ taglib uri="http://struts.apache.org/tags-html" prefix="html" %><%@ taglib uri="http://struts.apache.org/tags-logic" prefix="logic" %><%@ taglib uri="http://struts.apache.org/tags-tiles" prefix="tiles" %><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html:html>  <head>    <html:base />        <title>index.jsp</title><meta http-equiv="Content-Type" content="text/html; charset=GBK" /><meta http-equiv="pragma" content="no-cache"><meta http-equiv="cache-control" content="no-cache"><meta http-equiv="expires" content="0">    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"><meta http-equiv="description" content="This is my page"><!--<link rel="stylesheet" type="text/css" href="styles.css">-->  </head>    <body>    <!-- Header Page Information --><%--<%@ include file="include/head.jsp"%>--%><jsp:include page="include/head.jsp"></jsp:include><!-- Nav Bar --><%--<%@ include file="include/menubar.jsp"%>--%><jsp:include page="include/menubar.jsp"></jsp:include>    我是主体<br><br><br>    我是主体<br><br><br>    我是主体<br><br><br>    我是主体<br><br><br>    我是主体<br><br><br>    我是主体<br><br><br>    我是主体<br><br><br>    我是主体<br><br><br>    我是主体<br><br><br>    我是主体<br><br><br><%--        <%@ include file="include/copyright.jsp"%>--%><%--        <jsp:include page="/includeSample_copyright.do"></jsp:include>--%><%--<jsp:include flush="true" page="include/copyright.jsp"></jsp:include>--%>  </body></html:html>

 head.jsp

<%--<%@ page language="java" pageEncoding="GBK"%>--%>  
  
<%--<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>--%>  
<%--<%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %>--%>  
<%--<%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>--%>  
  
<table>  
    <tr>  
        <td><bean:message key="copyright.inc.copyright"/>  
                       我是Head 我是Head我是Head我是Head我是Head我是Head我是Head</td>  
    </tr>  
</table>
<%--<%@ page language="java" pageEncoding="GBK"%>--%><%--<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>--%><%--<%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %>--%><%--<%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>--%><table><tr>    <td><bean:message key="copyright.inc.copyright"/>                       我是Head 我是Head我是Head我是Head我是Head我是Head我是Head</td>    </tr></table>

 

 以head.jsp为例:

 1、如果我是用<%@ include file="include/head.jsp"%>引入,注意,head.jsp被我注释掉的字符集和Struts标签的引入,如果打开注释,会怎么样呢??会抛出500异常,/main.jsp(44,4) /include/head.jsp(3,56) Attempt to redefine the prefix html to /WEB-INF/struts-html.tld, when it was already defined as http://struts.apache.org/tags-html in the current scope.这时因为在翻译阶段main.jsp和head.jsp被原封不动的合称为一个jsp,察看Tomcat工作目录只有一个servlet类文件。

           \work\Catalina\localhost\IncludeAction\org\apache\jsp\main_jsp.java

           \work\Catalina\localhost\IncludeAction\org\apache\jsp\main_jsp.class
试想,在一个类文件中两次引入相同的Struts标签,编译时当然回抛出异常了。

2、那么如果我是以<jsp:include page="include/head.jsp"/>方式引入呢?首先先将head.jap中注释的Struts标签的部分打开,而字符集部分仍然注释。结果出现乱码:

 

<strong>结果:  
2004-2006 版权所有   
????Head ????Head????Head????Head????Head????Head????Head   
????MenuBar       
我是主体...  
</strong>
结果:2004-2006 版权所有 ????Head ????Head????Head????Head????Head????Head????Head ????MenuBar     我是主体...

   什么原因?include动作元素是在请求阶段执行引入的,所以它引入的只是head.jsp被翻译成servlet文件中_jspService这个方法中JspWriter这个对象的输出(out.write()方法的输出流)。该输出的执行是在head.jsp被引入main.jsp之前就进行了,所以main.jsp页面中的字符集设置当然对head.jsp不起作用了。

    如果Struts标签部分也注释掉呢?"2004-2006 版权所有"这一行不会输出,因为这一行是由Struts标签输出的,没有输出的原因和字符集相同,我想大家应该明白了。

   最后观察Tomcat工作目录下,会有两个Servlet:

       第一个:\work\Catalina\localhost\IncludeAction\org\apache\jsp\main_jsp.java

                   \work\Catalina\localhost\IncludeAction\org\apache\jsp\main_jsp.class

       第二个:\work\Catalina\localhost\IncludeAction\org\apache\jsp\include\head_jsp.java

                   \work\Catalina\localhost\IncludeAction\org\apache\jsp\include\head_jsp.class
   另外,如果希望通过修改后缀的方法表示哪些是被引入的文件,例如:将head.jsp改名为head.inc的话,JSP容器不能识别*.inc。所以不能翻译head.inc,所以此时只能使用<%@ include file="head.inc"%>方法引入一个文件了。

 

我们来总结一下两种include 两种用法的区别,主要有两个方面的不同: 
一、执行时间上: 
<%@ include file=”relativeURI”%> 是在翻译阶段执行 
<jsp:include page=”relativeURI” flush=”true” /> 在请求处理阶段执行。 
二、二:引入内容的不同: 
<%@ include file=”relativeURI”%> 引入静态文本(html,jsp),在JSP页面被转化成servlet之前和它融和到一起。 
<jsp:include page=”relativeURI” flush=”true” /> 引入执行页面或servlet所生成的应答文本。


© 著作权归作者所有

共有 人打赏支持
ForingY
粉丝 23
博文 252
码字总数 156129
作品 0
杭州
程序员
JSP 学习总结---学习笔记

什么是JSP 1)为什么说,Servlet是一个动态Web开发技术呢? Servlet是基于服务端的一种动态交互技术, HttpServletRequest表示客户端到服务端的对象 HttpServletResponse表示服务端到客户端的...

知止内明 ⋅ 04/18 ⋅ 0

JavaWeb开发比较重要的面试题

JavaWeb开发比较重要的面试题 1. 编码转换:怎样将GB2312编码的字符串转换为ISO-8859-1编码的字符串? 答:示例代码如下: String s1=”你好”; String s2=new String(s1.getBytes(“GB2312”...

xj_9264 ⋅ 05/06 ⋅ 0

面试的角度诠释Java工程师(一)

原文出处: locality 前言: 我相信每一个程序员都是为了生活而努力着的。很多人因为兴趣,从此踏上了这条‘烧脑大行动’的金桥;也有很多人因为梦想和执着,奋不顾身融入这个职业;还有很多...

颖伙虫 ⋅ 06/22 ⋅ 0

如何让JSP不解析类似#{}的特殊字符

我在使用JSP页面时发现如下问题,如果一个JSP页面中包含类似#{},${}等特殊字符的话(此类特殊字符包裹在 中),如果通过controller直接返回给该JSP页面,则该JSP页面可正常显示为#{}而不会去...

码上中国博客 ⋅ 04/24 ⋅ 0

Spring mvc 创建完项目测试的时候前台404,后台没有错误信息这是咋了

前天遇到一个问题,springmvc创建的项目测试的时候前台404,后台没有错误输出,奇了怪了...... 这是WEB-INF下的xml文件

好吧我输了 ⋅ 06/19 ⋅ 0

J2EE进阶(二十三)jar、war、ear包的区别

J2EE进阶(二十三)jar、war、ear包的区别 以最终客户的角度来看,.jar文件就是一种封装,他们不需要知道.jar文件中有多少个.class文件,每个文件中的功能与作用,同样可以得到他们希望的结果。...

sunhuaqiang1 ⋅ 05/05 ⋅ 0

【J2EE】之常用的接口和协议

前言 初接触J2EE,会遇到很多之前没有遇到过的术语,下面我们来简单地汇总一下这些接口和协议吧。 各大接口和协议详解 JDBC 1.定义:Java数据库连接 2.地位:用于Java应用程序连接数据库的标...

m18633778874 ⋅ 04/26 ⋅ 0

Servlet的一些细节--学习笔记

Servlet细节 1)浏览器访问的url-pattern只是一个符合格式的任意字符串,以/开头 2)一个Servlet的url-pattern可以是1个或多个,有二种形式; a).xx b)/xx/ 注意:/不能一起直接使用 3)/和....

知止内明 ⋅ 04/17 ⋅ 0

偶尔有跳转失败的情况,异常如下

[10:37:51:719] [ERROR] - - /refund/refundDetail?mallReturnId=91 java.lang.RuntimeException: File not found : /opt/jboot/webRoot/refund/refundDetail.html at com.jfinal.template.s......

保持-微笑 ⋅ 04/17 ⋅ 0

web项目中web.xml的作用

每个javaEE工程中都有web.xml文件,那么它的作用是什么呢?它是每个web.xml工程都必须的吗? 一个web中可以没有web.xml文件,也就是说,web.xml文件并不是web工程必须的。 web.xml文件是用来...

ChinaHYF ⋅ 04/27 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

JPA入门,配置文件的设置

<?xml version="1.0" encoding="UTF-8"?> <persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http......

码农屌丝 ⋅ 23分钟前 ⋅ 0

Java基础——面向对象和构造器

声明:本栏目所使用的素材都是凯哥学堂VIP学员所写,学员有权匿名,对文章有最终解释权;凯哥学堂旨在促进VIP学员互相学习的基础上公开笔记。 静态成员介绍 为什么要有静态成员?静态成员用来...

凯哥学堂 ⋅ 25分钟前 ⋅ 0

vmware中Centos 7 linux的LVM磁盘扩容

系统是RHEL7(centos7差不多一样) 关闭系统,在vmware、设置、硬盘、扩展、输入数字大于当前系统内存、点击扩展。 开机再查看磁盘信息 fdisk -l 注意:可以看出sda磁盘增加了,但是根目录还...

gugudu ⋅ 36分钟前 ⋅ 0

JAVA线程sleep和wait方法区别

昨天面试,突然被问到sleep 和 wait的区别,一下子有点蒙,在这里记一下,以示警戒。 首先说sleep,sleep就是正在执行的线程主动让出cpu,cpu去执行其他线程,在sleep指定的时间过去后,cpu...

徐玉强 ⋅ 38分钟前 ⋅ 0

vuex学习--模块

随着项目复杂性增加,共享状态也越来越多。需要对转态操作进行分组,分组后在进行分组编写。学习一下module:状态管理器的模块组操作。 首先是声明: const moduleA={ state,mutations,g...

大美琴 ⋅ 40分钟前 ⋅ 0

Selenium 简单入门

安装 pip install selenium 驱动下载 https://chromedriver.storage.googleapis.com/index.html 下载最新的驱动,放入path中,可以放入Python的scripts目录下,也可以放入Chrome安装目录,并...

阿豪boy ⋅ 41分钟前 ⋅ 0

292. Nim Game - LeetCode

Question 292. Nim Game Solution 思路:试着列举一下,就能发现一个n只要不是4的倍数,就能赢。 n 是否能赢1 true2 true3 true4 false 不论删除几,对方都能一把赢5 t...

yysue ⋅ 今天 ⋅ 0

6.5 zip压缩工具 6.6 tar打包 6.7 打包并压缩

zip压缩工具 zip命令可以压缩目录和文件,-r 压缩目录。 zip使用方法 zip 1.txt.zip 1.txt //压缩文件 zip -r 123.zip 123/ //压缩目录 unzip 1.txt.zip //解压 unzip 123.zip -d /root/456...

Linux_老吴 ⋅ 今天 ⋅ 0

react-loadable使用跳坑

官方给react-loadable的定义是: A higher order component for loading components with dynamic imports. 动态路由示例 withLoadable.js import React from 'react'import Loadable fro......

pengqinmm ⋅ 今天 ⋅ 0

记录工作中遇到的坑

1、ios safari浏览器向下滚动会触发window resize事件

端木遗风 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部