a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 179|回复: 2

[基础知识] JAVA基础:JSP中include指令和include行为的区别

[复制链接]
发表于 2012-8-4 12:37:27 | 显示全部楼层 |阅读模式
我们都知道在jsp中include有两种形式,分袂是 2 I: b; i- `' ]1 p8 t
  < %@ include file=” ”%>
* c/ \' F' n9 r. y7 A  < jsp:include page=” ” flush=”true”/> $ P( v2 o" k, l2 _
  前者是指令元素、后者是行为元素。具体它们将在何处用?若何用及它们有什么区别?这应该是良多人看到它城市想到的问题。下面一路来看看吧。 - v& S, ?# q" W+ g
  凡是当应用轨范中所有的页面的某些部门(例如问题、页脚和导航栏)都不异的时辰,我们就可以考虑用include。具体在哪些时辰用< %@ include file=” ”%>,哪些时辰用< jsp:include page=” ” flush=”true”/>.这种形式。首先要年夜白的是它们之间的区别。只有体味了它们用法的分歧才理解该在何势的暌姑以及若何选择。 & L6 O9 _4 d  ?" c  @& z( [3 p5 y- K  b
  < %@ include file=” ”%>,jsp的include指令元素读入指定页面的内容。并把这些内容和原本的页面融合到一路。(这个过程是在翻译阶段:也就是jsp被转化成servlet的阶段进行的。 ; P" y. Z" @$ [9 t; z2 C+ e
  这里对翻译阶段进行一下声名:我们知道,jsp页面不能原封不动地被传送给浏览器,所有的jsp元素都必需首先由处事器进行措置。这是经由过程将jsp页面传达化成servlet,然后执行这个servlet来完成的。处事器需要一个jsp容器来措置jsp页面。jsp容器凡是以servlet的形式来实现,这个servlet经由设置装备摆设,可以措置对jsp页面的所有请求。
: x$ z  X8 e! o1 ?6 c  Jsp容器负责将jsp页面转化成servlet(称为jsp页面实现类?JSP Page implementation class),并编译这个servlet。这两步就组成了翻译阶段. 9 [! @$ q% q+ @; O4 U: K* o
  由此我们就会知道:jsp页面是把include指令元素所指定的页面的现实内容(也就是代码段)插手到惹人它的jsp页面中,合成一个文件后被jsp容器将它转化成servlet。可以看到这时会发生一个姑且class文件和一个java文件。下面举个例子。 ' J  X: y, T% e
  处事器用tomcat,惹人页面的jsp文件叫test.jsp。被惹人的页面叫date.jsp.这个jsp文件里存放的是一个有关时刻的jsp代码,当前的上下文根设为test $ c& l7 N$ S6 f$ Q  s" r
" g: I: k, a/ \% a. x
//======date.jsp的源文件=====//document.write("");//======以下是test.jsp的源文件=============//include的两种用法//我们在这里用include的两种分歧形式来惹人date.jsp这个文件.
有关jsp中include的两种用法.敬请关注。
回复

使用道具 举报

 楼主| 发表于 2012-8-4 12:37:28 | 显示全部楼层

JAVA基础:JSP中include指令和include行为的区别

  在test.jsp 文件中,我们只输出了一行文本“ 有关jsp中include的两种用法.敬请关注。”,此刻让我们先用这种形式惹人date.jsp这个文件。你想会呈现侍趵硎题了吗?此时呈现了错误提醒: 2 G7 ^( z, x! F/ X& }
7 q% z1 e, I+ D. x4 {  B
HTTP Status 500 ?org.apache.jasper.JasperException: /date.jsp(0,0) Page directive: can't have multiple occurrences of contentType
: t! W- x8 t/ {' d7 I' h3 p  以下还有一堆错误,但我们只要看这里就知道问题的地址了。状况码为http 500处事器内部错误。再看下面的提醒。在date.jsp页面中不能指定多个contentType. $ o/ `" V* Y+ S7 [1 K- @% p5 `% x
  原因就在这里了。是因为在翻译阶段,date.jsp文件的代码被原封不动地插手到了test.jsp页面年夜而合成一个文件。合成后的文件中就会不异的: - y: Z' w) `* e, S9 B. ]
  < %@ page language=”java” contentType=”text/html;charset=gb2312”%>
6 d& \" o$ }% L2 M  这句代码。解决的法子是把date.jsp文件中的这句删失踪。刷新后再请求test.jsp页面 ) N" \1 V- O0 k* W$ f
  请求test.jsp在页面显示如下
1 O: ~( T/ b  i" B# ~, E  2003年12月10日 13:12:40 9 T  x0 w4 \, p' {  u- A
  有关jsp中include的两种用法.敬请关注。 4 d0 C+ f+ ~- j2 k! j" o5 z3 \
  这时我们还不能发现什么。仍是去查看tomcat下的姑且文件吧。到那儿恼去看看date.jsp文件的内容是否已被插手到了test.jsp文件中。   < 注.此处的tomcat装在E盘根目录下>目录 / r8 ?! V- \) z0 U# J2 ]
, p7 c8 q, w8 @2 f; h0 r& O
  E:tomcatworkStandalonelocalhosttest.
9 v* S6 H+ f6 U/ b( w# @  在这个目录下会看到
/ X$ R+ j9 g4 A4 A  test_jsp.java和test_jsp.class两个文件。 * d4 r8 {. p! g# c9 @. u% \
  这里的java文件就是jsp容器将jsp转化成了servlet而获得的test_jsp.java这个文件。
" \& \. i) C/ i, g  p7 @( @  相对应的test_jsp.class这个文件就是编译test_jsp.java这个servlet文件发生的类文件了。打开所发生的servlet文件(test_jsp.java)。此时我们会发现,在test.jsp 文件被转化成servlet文件时,在输出的< haed >之间插手了一些不是test.jsp页面琅缦沔的代码,新插手的内容就是 date.jsp琅缦沔的代码: 新插手了哪些内容或是否真的插手了新的内容请自己测试去看一下就会一目了然了.在这里不赠予陈.
; X- `! B  ~. ^" r1 E  以上就是我们用< %@ include file=”date.jsp”%>这种形式获得的结不美观. 5 T% w/ F# N' S, u- x
  下面我们换用< jsp:include page=”dae.jsp” flush=”true”/>也就是将 " U$ e$ b0 C# b0 F+ |6 A, y
  < %@ include file=”date.jsp”%>换成< jsp:include page=”dae.jsp” flush=”true”/>,然后请求test.jsp. 1 u) k8 j* e& z$ C# E8 t
  2003? ê 12??10?? 13:30:13 $ N, F. {' x8 c" m- y9 x6 n  u
  有关jsp中include的两种用法.敬请关注。 - ~2 x% I( v- k4 }' y
  此时会在页面上看见.我们所惹人date.jsp输出的日期中中文呈现了乱码.什么原因?是因为include行为元素是在请求措置阶段执行的(此处要对请求措置阶段进行声名一下.Jsp容器除了膳缦沔提到的负责将jsp页面转化成servlet外,还负责挪用jsp页面实现类以措置每个请求并发生应答.这个阶段我们就称为请求措置阶段.请求措置阶段仅执行类文件)。 6 ^4 W, {- R; h: r  d# W
  所以在我们作include行为元素惹人页面时,现实只是引用了date.jsp这个文件被转化并被编译后发生的servlet类文件.既如斯, date.jsp就是作为一个零丁的文件在执行后才被test.jsp文件运行时挪用.因为date.jsp文件中没有指定字符编码.所以呈现了乱码.解决法子是在date.jsp文件中年夜头把适才去失踪的
9 j1 g2 A& ^1 K& u( B8 d  
/ w* c/ G" ?3 n9 o5 q& s7 ~  这行语句插手后刷新年夜头运行.此时页面显示正确,并跟用include指令正常运行时一样.再查看tomcat下的姑且文件会发现.此时多出了一个 date_jsp.java文件和一个date_jsp.class文件.这两个文件得来的体例跟test_jsp.java和 test_jsp.class文件得来的体例一样.再查看一下此时test_jsp.java文件的代码会发现.此时只新增添了一句代码: . F" S8 M. Z0 T$ V+ ~/ t; W, F
  JspRuntimeLibrary.include(request, response, "date.jsp", out, true);
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-8-4 12:37:29 | 显示全部楼层

JAVA基础:JSP中include指令和include行为的区别

  它并没有把date.jsp文件的代码插手到test.jsp. 7 I# B: {& ~: P5 z3 B3 m3 ~
  只是在运行时惹人了date.jsp页面执行后所发生的应答.这意味着我们可以指定任何能够发生应答的Web资本,(例如一个servlet或一个jsp页面),只要这些资本所发生的类型和jsp页面发生的内容类型不异.JSP容器将经由过程一个内部的函数挪用来执行指定的资本.是以,这些被惹人的资本可以辅佐措置原本的请求,所以这些资本可以访谒请求浸染域内的所有对象.以及所有原本的请求参数. $ L- W. b" D0 v3 {1 t! X
  因为在主页面被请求时,这些页面还没有被惹人到主页面中,所以你可以对page属性使用一个请求时属性值,以便按照运行时的情形来抉摘要惹人哪一个页面.还可以添加一些将被惹人的页面篡夺的请求参数.
' X- _. x# j1 z6 {% Y' s. }) F8 ]6 k6 T: c* G, _3 _

& I9 y' q, l% e" u  如不美观改削了被惹人的jsp页面,那么可以马上使用该页面的最新版本,这是因为看待被惹人的页面的体例与看待由浏览器直接挪用的jsp页面的体例完全不异.即容器检测页面的转变,并自动进入翻译阶段,以获得页面的最新版本.
# Q6 U7 B( B  f9 K% Y2 z0 ^' _1 l  (注重,include行为元素同jsp其它元素一样,没有行为体时要以”/”竣事.就像下面这样. " s+ s9 m( w! y0 B+ G, d: G
  < jsp:include page=”” flush=”true” /> ! P  {$ a- Z' w" Y
  以下是对include 两种用法的区别
7 \1 ~. v4 |' H0 ?  首要有两个方面的分歧; % H9 j& \0 c% b2 {5 N  q/ ]
  1.执行时刻上: : c- O& m; b# g$ a
  < %@ include file=”relativeURI”%> 是在翻译阶段执行
/ Q. M) Y0 g; s- B4 U1 j  < jsp:include page=”relativeURI” flush=”true” /> 在请求措置阶段执行. 0 o) m" H- X) A
  2.惹人内容的分歧:
* Y& z+ Z' n% t6 z, u  < %@ include file=”relativeURI”%>
5 Q0 t" S' ~' e. m% O  惹人静态文本(html,jsp),在JSP页面被转化成servlet之前和它融和到一路. $ S; c- E6 B( M( y; o
  < jsp:include page=”relativeURI” flush=”true” />惹人执行页面或servlet所生成的应答文本.   此外在两种用法中file和page属性都被诠释为一个相对的URI.如不美观它仪笕开首,那么它就是一个情形相关的路径.将按照赋给应用轨范的URI的前缀进行诠释,如不美观它不是仪笕开首,那么就是页面相关的路径,就按照惹人这个文件的页面地址的路径进行诠释.更多有关URL是若何诠释的请参考相关资料或书籍
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Woexam.Com ( 湘ICP备18023104号 )

GMT+8, 2024-5-15 12:01 , Processed in 0.461474 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表