一、基本概念:/ j! Q- k7 ~8 r. @5 m1 y
1.标签(tag):+ E- D, M. X; G- U
标签是一种xml元素,通过标签可以使jsp网页变得简洁并且易于维护,还可以方便地实现同一个jsp文件支持多种语言版本。由于标签是xml元素,所以它的名称和属性都是大小写敏感的
) i4 G" f# Z$ i2.标签库(tag library):; q6 v5 n% j" c+ M9 K/ i
由一系列功能相似、逻辑上互相联系的标签构成的集合称为标签库。3 k1 h7 r2 _" c
3.标签库描述文件(tag library descriptor):
* j' L c; F) N5 z标签库描述文件是一个xml文件,这个文件提供了标签库中类和jsp中对标签引用的映射关系。它是一个配置文件,和web.xml是类似的。
a4 N6 n! s8 T9 b+ {4.标签处理类(tag handle class):
9 [) v) q7 z# S. R标签处理类是一个java类,这个类继承了tagsupport或者扩展了simpletag接口,通过这个类可以实现自定义jsp标签的具体功能! _1 c& |- b9 t1 O$ C+ b
二、自定义jsp标签的格式:
: P) j5 O$ J5 J1.
) `! K$ Z0 R) T- h' |, c* Z, n为了使到jsp容器能够使用标签库中的自定义行为,必须满足以下两个条件:0 E! l) I/ p: `2 j5 c; q. g
1)从一个指定的标签库中识别出代表这种自定义行为的标签
- z5 Q4 W' Z; ~) k2)找到实现这些自定义行为的具体类
# z! I4 D/ ^; O5 \9 o# w8 q6 {第一个必需条件-找出一个自定义行为属于那个标签库-是由标签指令的前缀(taglib directive's prefix)属性完成,所以在同一个页面中使用相同前缀的元素都属于这个标签库。每个标签库都定义了一个默认的前缀,用在标签库的文档中或者页面中插入自定义标签。所以,你可以使用除了诸如jsp,jspx,java,servlet,sun,sunw(它们都是在jsp白皮书中指定的保留字)之类的前缀。
% J q" n6 d; w# `' l6 ?$ Vuri属性满足了以上的第二个要求。为每个自定义行为找到对应的类。这个uri包含了一个字符串,容器用它来定位tld文件。在tld文件中可以找到标签库中所有标签处理类的名称
7 Z& y4 j1 ^0 n# w, p6 k2. 当web应用程序启动时,容器从web-inf文件夹的目录结构的meta-inf搜索所有以.tld结尾的文件。也就是说它们会定位所有的tld文件。对于每个tld文件,容器会先获取标签库的uri,然后为每个tld文件和对应的uri创建映射关系。# ~6 m0 k# X7 Y6 K0 S" F
在jsp页面中,我们仅需通过使用带有uri属性值的标签库指令来和具体的标签库匹配% _! d; w% ]. w1 C1 z' G
三、自定义jsp标签的处理过程:2 r* R' I( l; y( d# s
1.在jsp中引入标签库:& k' C1 O6 V. K9 W
2.在jsp中使用标签库标签# W& I" w6 S; K6 a& F
3.web容器根据第二个步骤中的prefix,获得第一个步骤中声明的taglib的uri属性值
; d+ V5 n) e w/ }, h- z4.web容器根据uri属性在web.xml找到对应的元素 5.从元素中获得对应的元素的值 6.web容器根据元素的值从web-inf/目录下找到对应的.tld文件 7.从.tld文件中找到与tagname对应的元素 8.凑元素中获得对应的元素的值 9.web容器根据元素的值创建相应的tag handle class的实例 10. web容器调用这个实例的dostarttag/doendtag方法完成相应的处理
' b' A/ K% e3 S, q" p% l四、创建和使用一个tag library的基本步骤:
% @/ ]; \" l) U( ]1.创建标签的处理类(tag handler class)
* I; {. i0 a. t; I. y; T- O* l: C( S2.创建标签库描述文件(tag library descrptor file)
9 I6 V& l$ u8 @2 G3.在web.xml文件中配置元素 4.在jsp文件中引人标签库( \; h7 {/ \ H T* ~3 ~
五、tagsupport类简介:9 F+ e6 k! J8 t I! m
1.处理标签的类必须扩展javax.servlet.jsp.tagsupport.
3 F7 M6 x! h$ f* l) _) }! y6 E2.tagsupport类的主要属性:
. i0 R& U4 I( Y8 R1 j9 A; ~a.parent属性:代表嵌套了当前标签的上层标签的处理类
# k; D- S- L( e, L' Xb.pagecontex属性:代表web应用中的javax.servlet.jsp.pagecontext对象
/ p% N( O' ]) a O3.jsp容器在调用dostarttag或者doendtag方法前,会先调用setpagecontext和setparent方法,设置pagecontext和parent。因此在标签处理类中可以直接访问pagecontext变量, w3 ]# h6 r3 ^9 S' r: S
4.在tagsupport的构造方法中不能访问pagecontext成员变量,因为此时jsp容器还没有调用7 z4 d" i5 q' _! x/ r
setpagecontext方法对pagecontext进行初始化, ?2 i! \7 K! j# X3 r+ }6 _. F
六、tagsupport处理标签的方法:
& o z6 |1 @& e: x5 n1.tagsupport类提供了两个处理标签的方法:
8 M3 R( i7 Y! Y# qpublic int dostarttag() throws jspexception
9 H5 _: W5 \* X- q9 I( tpublic int doendtag() throws jspexception4 g& I/ |" a x% h& x
2.dostarttag:但jsp容器遇到自定义标签的起始标志,就会调用dostarttag()方法。
6 ~6 n& B+ s/ i8 sdostarttag()方法返回一个整数值,用来决定程序的后续流程。
3 Y3 n1 U |: G& o3 Ua.tag.skip_body:表示?>…之间的内容被忽略
) H. J/ o; e0 `: Cb.tag.eval_body_include:表示标签之间的内容被正常执行, o/ a' o/ J$ F; g7 l" h0 n
3.doendtag:但jsp容器遇到自定义标签的结束标志,就会调用doendtag()方法。doendtag()方法也返回一个整数值,用来决定程序后续流程。4 b( E) M5 {. I$ M+ @4 }5 j( p
a.tag.skip_page:表示立刻停止执行网页,网页上未处理的静态内容和jsp程序均被忽略任何已有的输出内容立刻返回到客户的浏览器上。
/ Q; Q/ W _8 ^b.tag_eval_page:表示按照正常的流程继续执行jsp网页
, a6 @" M% u" l/ E5 W9 [+ C七、用户自定义的标签属性:
0 u, P' E6 h: E* D q如果在标签中还包含了自定义的属性,那么在标签处理类中应该将这个属性作为成员变量,并且分别提供设置和读取属性的方法。
2 S! [. ?! u( N, j0 \6 ?2 P八、创建标签处理类的步骤:0 P" r$ w) u4 F; ~
1.创建包含jsp网页静态文本的文件(即是要替换自定义jsp标签的文本)3 R/ S. D0 ^/ y" i4 A, X2 J
2.在web应用启动时装载静态文本
" d( J) d# K- J9 u: D) } j5 o3.创建标签处理类
' m3 ]: P# p, M2 G6 m九、如何创建包含jsp网页静态文本的文件:2 Z9 [! Z% [! \: G1 U! v% D
1.使用java.util.properties类来存放要替换网页中自定义jsp标签的静态文本
; l. k' {- o" J2.properties类代表了一系列属性的集合,其实例既可以被保存到流中,也可以从流中加载。这些文本以key/value的形式存放在web-inf目录下,例如key=value,在属性列表中这些key/value都是string类型的9 U, D$ C: t6 `# c- q: |
十、properties类的常用api:
6 H" F$ W4 J' S6 [" [ P. f% B1.setproperty(string key, string value):调用hashtable类的put方法添加属性; w+ s8 `+ j+ n0 v( h
2.getproperty(string key):获取属性列表中key对应的属性值
6 I9 m4 D1 g9 _+ t @$ x3.load(inputstream in):从输入流对象inputstream中读取属性列表(properties list): |) i& D; n# _- `) e: t; ?
4.store(outputstream out,string comment):使用适当的格式将属性列表的属性对写入输出流对象中,默认使用iso-88590-1编码格式,以行的方式处理输入。属性的key/value之间以”=、:”配对,以回车、换行分隔key/value配对
/ i T7 S! N* G) L6 P4 V十一、servletcontext类的常用api:' W6 o7 c4 a( k# q
1.getcontext(string uripath):返回服务器中uripath所代表的servletcontext对象" _, o' x& I4 A
2.getinitparameter(string name):返回servletconfig对象中name参数的值" x! m# G F8 p* l
3.getminetype(string file):返回file参数代表的文件的mime类型+ d2 D+ D* V3 x) p1 [9 y1 ~
4.getrequestdispatcher(string path):返回path代表的requestdispacher对象
4 o$ O$ L1 t- `4 o2 ^. ~5.getresourceasstream(string path):以输入流的形式返回path对应的资源,在输入留中对象可以为任意形式的数据,path参数必须以“/”开始且相对于context root3 s U) F$ S3 u) T
十二、如何使用servletcontxt读取并保存属性文件:
7 ^3 _8 L, U+ E, g/ K3 ~1.创建java.util.properties类对象
s6 F! m" j% {+ a% F9 ~2.获取servletcontext对象( p5 q- \5 I7 e
3.将属性文件以输入流的形式读入到某个输入流对象中
7 h' l4 c8 r$ c4.将输入流对象加载到properties对象中
0 U# f* ^7 O2 \+ x( ]+ Z- S5.将properties对象保存到servletcontext对象中
4 a4 X# E; ^9 d0 U8 j3 N十三、如何在web应用启动时装载静态文本:2 e+ [" f. T$ P o! d
1.创建继承了httpservlet类的子类,在web.xml中配置这servlet时设置load-on-startup属性:% e4 J+ B) ?8 m" r
someclass
; |- l. F7 @0 S) x E" t& L+ {; Ksomepackage.someclass1
/ N* \1 G1 m" C9 K( O, T2.在这个servlet的init()方法中创建java.util.properties类; e9 s5 q/ z: l9 M+ O) ^
3.获取当前web应用的servletcontext对象/ d0 h3 M3 F8 [; i
4.将web-inf目录下的属性文件读入到输入流inputstream中:: }9 P" [2 O ?1 p. a- S
inputstream in = context.getresourceasstring(web-inf/someproperties.properties);
8 f# y; b* C8 }$ n6 S \5.将输入流加载到属性对象中
) h. w* |0 ^" c3 ?- L5 Xps.load(in);
' i9 e0 }" C% [$ h- w) Q, z6.将属性对象保存到上6 H1 T. ?/ v- E0 y
context.setattribute(attributename,ps);
% T' d' t' g. [十四、如何创建标签处理类:
( `: [+ L5 C' J* m/ A. C; y1.引入必需的资源:
$ i- R# I- J* z3 X6 W; ?1 b0 Limport javax.servlet.jsp.*;
2 R& L! |1 F! L4 b" Himport javax.servlet.http.*;
& x% x! x0 W, c0 m" [- D6 l# eimport java.util.*;5 _( F" i7 l' ?1 t3 M8 a
import java.io.*;
: G w0 O& [* x2 K% d5 i2.继承tagsupport类并覆盖dostarttag()/doendtag()方法9 D; P5 y; V: L/ Q1 V0 @
3.从servletcontext对象中获取java.util.properties对象
5 ~- l& h# ~0 j. F/ L4.从properties对象中获取key对应的属性值
2 u8 d; X& x5 r$ P5.对获取的属性进行相应的处理并输出结果
0 ?/ I5 T/ t0 M0 e6 m V, o* A十五、创建标签库描述文件(tag library descriptor):7 F( u5 V3 U3 N9 j+ q* M: L
1.标签库描述文件,简称tld,采用xml文件格式,定义了用户的标签库。tld文件中的元素可以分成3类:
5 V4 l @% z, _5 x- i8 o0 `* [9 Fa.:标签库元素
1 z7 K4 U/ z2 S ^ Fb.:标签元素
& X; A& d: o0 R5 x7 K) Mc.:标签属性元素
- V% K9 }! ~+ ]. K: H, O! b. a: [( ~2 H2.标签库元素用来设定标签库的相关信息,它的常用属性有:$ Q. f' t. h7 t. N) E0 x
a.shortname: 指定tag library默认的前缀名(prefix)$ ~& P8 ?. O7 y/ B) J2 b
b.uri: 设定tag library的惟一访问表示符
; e$ m. _% [' ? n4 v* y3.标签元素用来定义一个标签,它的常见属性有:5 R1 ?; k, i# u2 }/ V4 [6 ]5 `
a.name: 设定tag的名字
( f% J7 O% @5 C3 z, f: Db.tagclass: 设定tag的处理类
" W3 J0 w4 O0 l; sc.bodycontent: 设定标签的主体(body)内容$ a1 R3 L* s* [2 @+ ]
1).empty:表示标签中没有body& G* D6 \, w) _9 t& h
2).jsp:表示标签的body中可以加入jsp程序代码9 \8 J- G0 b3 N/ l8 g' ?8 ^9 x
3).tagdependent:表示标签中的内容由标签自己去处理( P: |: x* O/ a3 ]; ~
4.标签属性元素用来定义标签的属性,它的常见属性有:+ f7 p% Z6 b+ X7 `6 m
a.name:属性名称
) n+ ?5 W! [- m2 @' p+ hb.required:属性是否必需的,默认为false
$ x! O5 y6 g0 v, ?4 J- Jc.rtexprvalue:属性值是否可以为request-time表达式,也就是类似于< %=…% >的表达式) Y' B! L4 N: B1 A1 Z
十六、在web应用中使用标签:
& U: V* X- x0 c& ~1.如果web应用中用到了自定义jsp标签,则必须在web.xml文件中加入元素,它用于声明所引用的标签所在的标签库$ w8 j& _- k% y* l
/sometaglib) p4 M" Q) o, |5 T* ~
/web-inf/sometld.tld a) q4 U/ Q8 c- a& m; l
2.:设定tag library的惟一标示符,在web应用中将根据它来引用tag libray
& A) o k7 x% Y7 c5 G, N: F9 b' h3.:指定和tag library对应的tld文件的位置
$ `) K5 G% v0 d1 ^- F/ x# M4.在jsp文件中需要加入; U6 ?! f1 q5 d- q4 [$ I
5.prefix表示在jsp网页中引用这个标签库的标签时的前缀,uri用来指定tag library的标识符,它必须和web.xml中的属性保持一致。
# L% {# w$ A' b1 N% U: d3 A4 D
) _ @, D% l* ~6 t更多网页制作信息请查看: 网页制作 |
|