`
全保生
  • 浏览: 8774 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

JSP中include指令和include动作区别详解

    博客分类:
  • JSP
 
阅读更多

我们都知道在JSP中include有两种形式,分别是

<%@ include file=” ”%>

<jsp:include page=” ” flush=”true”/>

前者是指令元素,后者是动作元素。具体它们将在何处用?如何用及它们有什么区别?这应该是很多人看到它都会想到的问题。下面一起来看看吧。

通常当应用程序中所有的页面的某些部分(例如标题、页脚和导航栏)都相同的时候,我们就可以考虑用include。具体在哪些时候 用<%@ include file=” ”%>,哪些时候用< jsp:include page=” ” flush=”true”/>.这种形式。首先要明白的是它们之间的区别。只有了解了它们用法的不同才 理解该在何时去用以及如何选择。

<%@ include file=” ”%>,jsp的include指令元素读入指定页面的内容。并把这些内容和原来的页面融合到一起。(这个过程是在翻译阶段:也就是jsp被转化成servlet的阶段进行的。

这里对翻译阶段进行一下说明:我们知道,jsp页面不能原封不动地被传送给浏览器,所有的jsp元素都必须首先由服务器进行处理。这是通过将jsp页面转达化成servlet,然后执行这个servlet来完成的。服务器需要一个jsp容器来处理jsp页面。jsp容器通常以servlet的形式来实现,这个servlet经过配置,可以处理对jsp页面的所有请求。

Jsp容器负责将jsp页面转化成servlet(称为jsp页面实现类?JSP Page implementation class),并编译这个servlet。这两步就构成了翻译阶段.

由此我们就会知道:jsp页面是把include指令元素所指定的页面的实际内容(也就是代码段)加入到引入它的jsp页面中,合成一个文件后被jsp容器将它转化成servlet。可以看到这时会产生一个临时class文件和一个java文件。下面举个例子。

服务器用tomcat,引入页面的jsp文件叫test.jsp。被引入的页面叫date.jsp.这个jsp文件里存放的是一个有关时间的jsp代码,当前的上下文根设为test

date.jsp的源文件:

<%@ page language=”java” contentType="text/html;charset=gb2312"%>
<%
java.util.Date date=new java.util.Date();
String date_cn ="";
String dateStr = "";
switch(date.getDay())
{
case 0:date_cn ="日"; break;
case 1:date_cn ="一"; break;
case 2:date_cn ="二"; break;
case 3:date_cn ="三"; break;
case 4:date_cn ="四"; break;
case 5:date_cn ="五"; break;
case 6:date_cn ="六"; break;
}
dateStr = (1900+date.getYear()) + "年" + (date.getMonth()+1) + "月" + date.
getDate() + "日(星期" + date_cn + ")";
%>
document.write("<%=dateStr%>");

以下是test.jsp的源文件:

<%@ page language=”java” contentType=”text/html;charset=gb2312”%> 
<html> 
<head> 
<title>include的两种用法</title> 
<jsp:include page=”date。jsp” flush=”true”/> 
<%--@ include file=”date。jsp” %--> 
//我们在这里用include的两种不同形式来引入date。jsp这个文件。 
<head> 
<body> 
<table><tr><td> 
有关jsp中include的两种用法。敬请关注。 
</td></tr></table> 
</body> 
</html> 

在test.jsp 文件中,我们只输出了一行文本“ 有关jsp中include的两种用法.敬请关注。”,现在让我们先 用<%@ include file=”date.jsp” %>这种形式引入date.jsp这个文件。你想会出现什么问题了吗?此时出现 了错误提示:

HTTP Status 500 ?
org.apache.jasper.JasperException: /date.jsp(0,0) Page directive: 
can't have multiple occurrences of contentType

 

以下还有一堆错误,但我们只要看这里就知道问题的所在了。状态码为http 500服务器内部错误。再看下面的提示。在date.jsp页面中不能指定多个contentType.

原因就在这里了。是因为在翻译阶段,date.jsp文件的代码被原封不动地加入到了test.jsp页面从而合成一个文件。合成后的文件中就会相同的:

<%@ page language=”java” contentType=”text/html;charset=gb2312”%>

这句代码。解决的办法是把date.jsp文件中的这句删掉,刷新后再请求test.jsp页面。

请求test.jsp在页面显示如下:

2003年12月10日 13:12:40
有关jsp中include的两种用法.敬请关注。

这时我们还不能发现什么。还是去查看tomcat下的临时文件吧。到那里去看看date.jsp文件的内容是否已被加入到了test.jsp文件中。

<注.此处的tomcat装在E盘根目录下>

目录

E:\tomcat\work\Standalone\localhost\test.

在这个目录下会看到

test_jsp.java和test_jsp.class两个文件。

这里的java文件就是jsp容器将jsp转化成了servlet而得到的test_jsp.java这个文件。

相对应的test_jsp.class这个文件就是编译test_jsp.java这个servlet文件产生的类文件了。打开所产生的servlet文 件(test_jsp.java)。此时我们会发现,在test.jsp 文件被转化成servlet文件时,在输出的<haed>之间加入 了一些不是test.jsp页面里面的代码,新加入的内容就是 date.jsp里面的代码: 新加入了哪些内容或是否真的加入了新的内容请自己测试去看 一下就会一目了然了.在这里不再详述.

以上就是我们用<%@ include file=”date.jsp”%>这种形式得到的结果.

下面我们换用<jsp:include page=”dae.jsp” flush=”true”/>也就是将<%@ include file=”date.jsp”%>换成<jsp:include page=”dae.jsp” flush=”true”/>,然后请求test.jsp.

2003? ê 12??10?? 13:30:13
有关jsp中include的两种用法.敬请关注。

此时会在页面上看见.我们所引入date.jsp输出的日期中中文出现了乱码.什么原因?是因为include行为元素是在请求处理阶段执行的(此处要对请求处理阶段进行说明一下,Jsp容器除了上面提到的负责将jsp页面转化成servlet外,还负责调用jsp页面实现类以处理每个请求并产生应答.这个阶段我们就称为请求处理阶段.请求处理阶段仅执行类文件)。

所以在我们作include行为元素引入页面时,实际只是引用了date.jsp这个文件被转化并被编译后产生的servlet类文件.既如此, date.jsp就是作为一个单独的文件在执行后才被test.jsp文件运行时调用.由于date.jsp文件中没有指定字符编码.所以出现了乱 码.解决办法是在date.jsp文件中重新把刚才去掉的

<%@ page language=”java” contentType=”text/html;charset=gb2312”%>

这行语句加入后刷新重新运行.此时页面显示正确,并跟用include指令正常运行时一样.再查看tomcat下的临时文件会发现.此时多出了一个 date_jsp.java文件和一个date_jsp.class文件.这两个文件得来的方式跟test_jsp.java 和 test_jsp.class文件得来的方式一样.再查看一下此时test_jsp.java文件的代码会发现.此时只新增加了一句代码:

JspRuntimeLibrary.include(request, response, "date.jsp", out, true);

它并没有把date.jsp文件的代码加入到test.jsp.

只是在运行时引入了date.jsp页面执行后所产生的应答.这意味着我们可以指定任何能够产生应答的Web资源,(例如一个servlet或一个jsp页面),只要这些资源所产生的类型和jsp页面产生的内容类型相同.JSP容器将通过一个内部的函数调用来执行指定的资源.因此,这些被引入的资源可以帮 助处理原来的请求,所以这些资源可以访问请求作用域内的所有对象.以及所有原来的请求参数.

由于在主页面被请求时,这些页面还没有被引入到主页面中,所以你可以对page属性使用一个请求时属性值,以便根据运行时的情况来决定要引入哪一个页面.还可以添加一些将被引入的页面读取的请求参数.

<jsp:include page=”<%=pageSelectedAtRuntime%>” flush=”true” >
<jsp:param name=”fitstParamer” value=”firstValue”>
<jsp:param name=”lastParamer” value=”lastValue”>
</jsp:include>

如果修改了被引入的jsp页面,那么可以立刻使用该页面的最新版本,这是因为对待被引入的页面的方式与对待由浏览器直接调用的jsp页面的方式完全相同.即容器检测页面的变化,并自动进入翻译阶段,以得到页面的最新版本.

注意:include动作元素同jsp其它元素一样,没有行为体时要以”/”结束.就像下面这样.<jsp:include page=”<%=pageSelectedAtRuntime%>” flush=”true” />

以下是对include 两种用法的区别,主要有两个方面的不同:

执行时间上:

<%@ include file=”relativeURI”%> 是在翻译阶段执行

<jsp:include page=”relativeURI” flush=”true” /> 在请求处理阶段执行.

引入内容的不同:

<%@ include file=”relativeURI”%>引入静态文本(html,jsp),在JSP页面被转化成servlet之前和它融和到一起.

<jsp:include page=”relativeURI” flush=”true” />引入执行页面或servlet所生成的应答文本.

另外在两种用法中file和page属性都被解释为一个相对的URI.如果它以斜杠开头,那么它就是一个环境相关的路径.将根据赋给应用程序的URI的前缀进行解释,如果它不是以斜杠开头,那么就是页面相关的路径,就根据引入这个文件的页面所在的路径进行解释。

 

原文地址:http://developer.51cto.com/art/200902/111134.htm

分享到:
评论

相关推荐

    jsp中include指令静态导入和动态导入的区别详解.docx

    jsp中include指令静态导入和动态导入的区别详解.docx

    jsp中include指令静态导入和动态导入的区别详解

    主要介绍了jsp中include指令静态导入和动态导入的区别,通过示例和图文讲解可以更好的看出他们的区别,需要的朋友可以参考下

    JSP的include指令的使用方法

    主要介绍了JSP的include指令的使用方法的相关资料,希望通过本文能帮助到大家,让大家理解掌握这部分内容,需要的朋友可以参考下

    JSP常见的三个编译指令page、include、taglib

    jsp中include指令静态导入和动态导入的区别详解JSP编译指令page、include详解JSP中动态include与静态include的区别介绍JSP指令元素(page指令/include指令/taglib指令)复习整理基于jsp:included的使用与jsp:param乱码...

    JSP中的编译指令和动作指令的两点区别

    JSP中的编译指令和动作指令的区别 1、编译指令是通知Servlet引擎的处理消息,而动作指令只是运行时的脚本动作 2、编译指令是在将JSP编译成Servlet时起作用,而动作指令可替换成JSP脚本,是JSP脚本标准化写法 您可能...

    JSP编译指令page、include详解

    主要介绍了JSP编译指令page、include,有需要的朋友可以参考一下

    jsp include引用非本级目录网页实现代码

    采用相对路径 假设当前目录名为a, 目标文件夹为b (1)如果b是a的上级目录, 代码如下:&lt...jsp中include指令静态导入和动态导入的区别详解JSP编译指令page、include详解JSP中动态include与静态include的区别介绍JSP指

    韩顺平2013版“细说JSP”视频教程

    开山篇【】第2讲.jsp运行原理分析.page指令详解【】第3讲.include指令.脚本元素.动作元素【】第4讲.jsp九大内置对象.jsp版本计算器①【】第5讲.jsp版本计算器②[ED2000.COM]【】第6讲.jsp版本计算器③【】第7讲....

    JSP静态导入与动态导入使用详解

    JSP静态导入(JSP指令标记include)  JSP页面第一次被请求时,会被JSP引擎转译成Servlet的Java文件,然后再被编译成字节码文件执行。JSP指令标记为JSP页面转译提供整个页面的相关信息。  include指令用于在JSP页面...

    Jsp自定义标签和方法详解

    Jsp自定义标签和方法详解 首先是要有一个标签处理类,标签处理类可以直接实现Tag接口,也可以继承Java中已经实现了的TagSupport这个类,TagSupport也是继承自Tag接口的,它内部已经对Tag接口进行了实现,一般是继承...

    JSP安全开发之XSS漏洞详解

    XSS又叫CSS (Cross Site Script) ,跨站脚本攻击。它指的是恶意攻击者往Web页面里插入恶意脚本代码,而程序对于用户输入内容未过滤,当用户浏览该页之时,嵌入其中Web里面的脚本代码会被执行,从而达到恶意攻击用户...

    J2EE应用开发详解

    JSP技术 67 5.1 JSP简介 67 5.2 JSP页面的结构 68 5.3 脚本元素 68 5.3.1 Scriptlet元素 69 5.3.2 Expression元素 69 5.3.3 Declaration元素 70 5.4 指令 73 5.4.1 page指令 73 5.4.2 include指令 75 5.5 动作 76 ...

    最详细的jsp基础教程

    JSP系列教材 (四)- include包含其他页面的两种方式,以及其区别 JSP系列教材 (五)- 服务端跳转和客户端跳转 JSP系列教材 (六)- 中演示 cookie 的创建和访问 JSP系列教材 (七)- session 详解 JSP系列教材 ...

    jsp最详细教程 最容易入门

    JSP 语法.................................................................................25 2.1 JSP 页面的基本结构................................25 2.2 变量和方法的声明..................................

    AngularJS包括详解及示例代码

    2.使用服务器端包含 – JSP,PHP等Web端服务器技术可以在包括动态页面中的HTML页面。 使用AngularJS,我们可以用ng-include指令在一个HTML页面嵌入另一个HTML页面。 <div ng-include='main.html'></div> <...

    低清版 大型门户网站是这样炼成的.pdf

    3.3.6 include标签详解 123 3.3.7 param标签详解 126 3.3.8 push标签详解 127 3.3.9 set标签详解 128 3.3.10 text标签详解 129 3.3.11 url标签详解 130 3.3.12 property标签详解 132 3.4 struts 2表单标签...

    bootstrap suggest下拉框使用详解

    @ include file=dataJs/item/itemSuggest.jsp %> itemSuggest.jsp <%@ page language=java contentType=text/html; charset=utf-8 pageEncoding=utf-8%> <link id=bscss href=plugins

Global site tag (gtag.js) - Google Analytics