jsp include详细解释

上一篇 / 下一篇  2008-06-28 11:27:00 / 个人分类:JSP资料

  • 文件版本: V1.0
  • 开发商: 本站原创
  • 文件来源: 本地
  • 界面语言: 简体中文
  • 授权方式: 免费
  • 运行平台: Win9X/Win2000/WinXP
51Testing软件测试网D(g"x7nd F$c

我们都知道在jsp中include有两种形式,分别是51Testing软件测试网 a.`"z _)[4P
<%@ include file=” ”%>51Testing软件测试网$u:L LE'n6}
<jsp:include page=” ” flush=”true”/>51Testing软件测试网0|m4o Zu7V7Bd` f

51Testing软件测试网pR jB/P

    前者是指令元素、后者是行为元素。具体它们将在何处用?如何用及它们有什么区别?这应该是很多人看到它都会想到的问题。下面一起来看看吧。51Testing软件测试网Dxr bw,K

+S|Wj"u0rN0    通常当应用程序中所有的页面的某些部分(例如标题、页脚和导航栏)都相同的时候,我们就可以考虑用include。具体在哪些时候用<%@ include file=” ”%>,哪些时候用<jsp:include page=” ” flush=”true”/>.这种形式。首先要明白的是它们之间的区别。只有了解了它们用法的不同才理解该在何时去用以及如何选择。
L:p+nHh.B0<%@ include file=” ”%>,jsp的include指令元素读入指定页面的内容。并把这些内容和原来的页面融合到一起。(这个过程是在翻译阶段:也就是jsp被转化成servlet的阶段进行的。

gbm0Y~g$R051Testing软件测试网*v;c#[BwfGA

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

51Testing软件测试网jh3]&uw:|#l~

    Jsp容器负责将jsp页面转化成servlet(称为jsp页面实现类?JSP Page implementation class),并编译这个servlet。这两步就构成了翻译阶段.51Testing软件测试网;b7s H9m-KO5e

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

)g?TQ Z0    服务器用tomcat,引入页面的jsp文件叫test.jsp。被引入的页面叫date.jsp.这个jsp文件里存放的是一个有关时间的jsp代码,当前的上下文根设为test51Testing软件测试网+|3B)u6D+ym ^
//======date.jsp的源文件=====//
NTkL)Op0<%@ page language=”java” contentType="text/html;charset=gb2312"%>
-?[p X2o5G Hn0<%
}:|[E?g0java.util.Date date=new java.util.Date();
8x&}Wx2WNMO-rY0String date_cn ="";51Testing软件测试网/kz(S,O8k Pc
String dateStr = "";
mm g6T,I H0switch(date.getDay())
)Dw*o7Q"WjQ0{51Testing软件测试网Q P dq#W9X
case 0:date_cn ="日"; break;
*kW)i.Jb#C1{0case 1:date_cn ="一"; break;51Testing软件测试网|ii_'e.@6\
case 2:date_cn ="二"; break;
| [#eB}0case 3:date_cn ="三"; break;51Testing软件测试网-XxX#D0P
case 4:date_cn ="四"; break;51Testing软件测试网sks.}zH;m3^
case 5:date_cn ="五"; break;51Testing软件测试网he9Q%qM8tSEr
case 6:date_cn ="六"; break;
2^DkzRD0}
'O+?ZY {5i0dateStr = (1900+date.getYear()) + "年" + (date.getMonth()+1) + "月" + date.getDate() + "日(星期" + date_cn + ")";51Testing软件测试网8J s-sS J%F/iUGA;V
%>
3JZ"Z {t~yM0document.write("<%=dateStr%>");51Testing软件测试网$Y k3f}:q B ` {
//======以下是test.jsp的源文件=============//
$Tv x,f*xT0<%@ page language=”java” contentType=”text/html;charset=gb2312”%>51Testing软件测试网DN7r qXO3O
<html>
!ji;_qnk!y[0t0<head>51Testing软件测试网'F9W'DF1{[I3pO;~;R'iB e
<title>include的两种用法</title>
G'_-P?^.K _ }-~0<jsp:include page=”date.jsp” flush=”true”/>51Testing软件测试网;E qR\yZgl
<%--@ include file=”date.jsp” %-->51Testing软件测试网w1LM3W Ja
//我们在这里用include的两种不同形式来引入date.jsp这个文件.51Testing软件测试网ap-Y'iF0~%['Y
<head>
Q X1Xt(f0B_0<body>
7M)[|T*^~8D0<table><tr><td>51Testing软件测试网q8ZR*e J G*g
有关jsp中include的两种用法.敬请关注。51Testing软件测试网:I-E/V2m/P#A
</td></tr></table>
eM0^x"t@/v0</body>
U"G!G S+II0</html>51Testing软件测试网6}K'l C?-aw5w/j

#jMM1z7w4UuF^8s0      在test.jsp 文件中,我们只输出了一行文本“ 有关jsp中include的两种用法.敬请关注。”,现在让我们先用<%@ include file=”date.jsp” %>这种形式引入date.jsp这个文件。你想会出现什么问题了吗?此时出现了错误提示:
w#Li{tz~0HTTP Status 500 ?
e.sI*A9j;J{GF0org.apache.jasper.JasperException: /date.jsp(0,0) Page directive: can't have multiple occurrences of contentType
+T;Y3yJ]5f4Q"S0以下还有一堆错误,但我们只要看这里就知道问题的所在了。状态码为http 500服务器内部错误。再看下面的提示。在date.jsp页面中不能指定多个contentType.

E-k8e:^]$m0

:f"H,OD+x"K0    原因就在这里了。是因为在翻译阶段,date.jsp文件的代码被原封不动地加入到了test.jsp页面从而合成一个文件。合成后的文件中就会相同的:
k2v!}A_^2`.aFk pR0<%@ page language=”java” contentType=”text/html;charset=gb2312”%>
&S-AL;M A;Y#B I2g0这句代码。解决的办法是把date.jsp文件中的这句删掉。刷新后再请求test.jsp页面

2o&vQ;F9J{e]0

Q(U T4Rh+Q051Testing软件测试网a/\'a2]jD1w
请求test.jsp在页面显示如下51Testing软件测试网1N1g{j$j:{
2003年12月10日 13:12:4051Testing软件测试网"l_+Dj X
有关jsp中include的两种用法.敬请关注。51Testing软件测试网9{ McG:E

1[!T@ `.LKOg0这时我们还不能发现什么。还是去查看tomcat下的临时文件吧。到那里去看看date.jsp文件的内容是否已被加入到了test.jsp文件中。51Testing软件测试网Le Z8u`;m
<注.此处的tomcat装在E盘根目录下>
.Ub j,J)|y*ay p0目录
D*u:V9c T^9tDR0E:\tomcat\work\Standalone\localhost\test.51Testing软件测试网@5Kd xB)X d
在这个目录下会看到51Testing软件测试网Fm\#L-_Z5d
test_jsp.java和test_jsp.class两个文件。

ND.n9?QR!|051Testing软件测试网2HA`k3cM!TOh^C

   这里的java文件就是jsp容器将jsp转化成了servlet而得到的test_jsp.java这个文件。51Testing软件测试网F7r L!RMyM.n

51Testing软件测试网!j,Z(t!vf/\q2P

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

l])DH,Rj0以上就是我们用<%@ include file=”date.jsp”%>这种形式得到的结果.
Y O:D!]2c f0下面我们换用<jsp:include page=”dae.jsp” flush=”true”/>也就是将51Testing软件测试网 WEy3n h.F9]P ](q
<%@ include file=”date.jsp”%>换成<jsp:include page=”dae.jsp” flush=”true”/>,然后请求test.jsp.51Testing软件测试网j5IePigr
2003? ê 12??10?? 13:30:1351Testing软件测试网?Dva"w[S"]
有关jsp中include的两种用法.敬请关注。51Testing软件测试网5J;LZP,L+a

51Testing软件测试网N"S0~3XQ*bN+L+r

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

C.?}0G3j4e+]8Y051Testing软件测试网!n f/if&\c KR;en

   所以在我们作include行为元素引入页面时,实际只是引用了date.jsp这个文件被转化并被编译后产生的servlet类文件.既如此, date.jsp就是作为一个单独的文件在执行后才被test.jsp文件运行时调用.由于date.jsp文件中没有指定字符编码.所以出现了乱码.解决办法是在date.jsp文件中重新把刚才去掉的51Testing软件测试网oB#GhK,g'_7m~
<%@ page language=”java” contentType=”text/html;charset=gb2312”%>
|1|;V,`ez"E0这行语句加入后刷新重新运行.此时页面显示正确,并跟用include指令正常运行时一样.再查看tomcat下的临时文件会发现.此时多出了一个 date_jsp.java文件和一个date_jsp.class文件.这两个文件得来的方式跟test_jsp.java和 test_jsp.class文件得来的方式一样.再查看一下此时test_jsp.java文件的代码会发现.此时只新增加了一句代码:51Testing软件测试网? }0Y Hwe
JspRuntimeLibrary.include(request, response, "date.jsp", out, true);51Testing软件测试网;o!^[?m

/Q8{7h}$qn0它并没有把date.jsp文件的代码加入到test.jsp.

N2M$\8]-k8[2u ?S+~b0

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

en5fc E3|k051Testing软件测试网#v'fNElBG CM

    由于在主页面被请求时,这些页面还没有被引入到主页面中,所以你可以对page属性使用一个请求时属性值,以便根据运行时的情况来决定要引入哪一个页面.还可以添加一些将被引入的页面读取的请求参数.51Testing软件测试网-xCk1hw1D p9e
<jsp:include page=”<%=pageSelectedAtRuntime%>” flush=”true” >
E'dK*U|XX!p0<jsp:param name=”fitstParamer” value=”firstValue”>51Testing软件测试网*d7lN9KD
<jsp:param name=”lastParamer” value=”lastValue”>51Testing软件测试网t AQBJM
</jsp:include>

5V4w8I)P g*_ }-d051Testing软件测试网&n$a3m/u r*?"H

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

^l$h)`(V5b7c051Testing软件测试网:HO3\){u8o#uTT`lD'p

(注意,include行为元素同jsp其它元素一样,没有行为体时要以”/”结束.就像下面这样.
1qu~+N)R2B4s Y{-F!N0<jsp:include page=”<%=pageSelectedAtRuntime%>” flush=”true” />)51Testing软件测试网,V4N-sG2V5~ \s,jK:ph

7asO'ys(bns(g R/\zy0以下是对include 两种用法的区别
/n6v&[R5c$sm sx ci0主要有两个方面的不同;
-d"r-l&X ?'i,K0一:执行时间上:
o)F4q*n0R0<%@ include file=”relativeURI”%> 是在翻译阶段执行
F4gu4T#RV7d0<jsp:include page=”relativeURI” flush=”true” /> 在请求处理阶段执行.51Testing软件测试网"[h+c\t
二:引入内容的不同:51Testing软件测试网BB&v6H2Eb7QSF9H
<%@ include file=”relativeURI”%>51Testing软件测试网 b&l2qwA U%]N$f J
引入静态文本(html,jsp),在JSP页面被转化成servlet之前和它融和到一起.
6H%~:CH EF1{0<jsp:include page=”relativeURI” flush=”true” />引入执行页面或servlet所生成的应答文本.
i!x&B:?i#~T0另外在两种用法中file和page属性都被解释为一个相对的URI.如果它以斜杠开头,那么它就是一个环境相关的路径.将根据赋给应用程序的URI的前缀进行解释,如果它不是以斜杠开头,那么就是页面相关的路径,就根据引入这个文件的页面所在的路径进行解释.更多有关URL是如何解释的请参考相关资料或书籍.51Testing软件测试网ah1AX Gaj

相关阅读:

TAG: JSP资料

 

评分:0

我来说两句

Open Toolbar