一、基本概念:
1 \1 {2 J2 L% P1.标签(tag):2 n! K. Q$ [: {+ I1 ~7 O! e
标签是一种xml元素,通过标签可以使jsp网页变得简洁并且易于维护,还可以方便地实现同一个jsp文件支持多种语言版本。由于标签是xml元素,所以它的名称和属性都是大小写敏感的; r/ _, k0 Z2 G. L: p! O" h3 ^
2.标签库(tag library):
/ F) S5 \" p- u ]& v1 H0 Z6 U由一系列功能相似、逻辑上互相联系的标签构成的集合称为标签库。
4 }- b: N& j5 Q- ]# c) C8 [: T3.标签库描述文件(tag library descriptor):, D8 Q, u4 _9 \6 w" |8 i R
标签库描述文件是一个xml文件,这个文件提供了标签库中类和jsp中对标签引用的映射关系。它是一个配置文件,和web.xml是类似的。5 M I+ _+ D# J; V, y8 X$ h
4.标签处理类(tag handle class):
' I4 T0 O& X1 q4 U标签处理类是一个java类,这个类继承了tagsupport或者扩展了simpletag接口,通过这个类可以实现自定义jsp标签的具体功能( g1 ~5 d5 A2 P8 L; e/ G" ~
二、自定义jsp标签的格式:/ G+ l3 W1 [/ c5 s
1.
# ?, f8 T( N" w, o. q0 Z" z) Z2 [为了使到jsp容器能够使用标签库中的自定义行为,必须满足以下两个条件:
% [9 ]- I2 ?1 o. @$ ]1 J1)从一个指定的标签库中识别出代表这种自定义行为的标签4 K. x; E4 }6 s7 O/ ]" C
2)找到实现这些自定义行为的具体类
: A. z- {' x' P b0 ~7 _" @# g第一个必需条件-找出一个自定义行为属于那个标签库-是由标签指令的前缀(taglib directive's prefix)属性完成,所以在同一个页面中使用相同前缀的元素都属于这个标签库。每个标签库都定义了一个默认的前缀,用在标签库的文档中或者页面中插入自定义标签。所以,你可以使用除了诸如jsp,jspx,java,servlet,sun,sunw(它们都是在jsp白皮书中指定的保留字)之类的前缀。
; J D m' f8 V, L& M1 ^4 y0 Y) Luri属性满足了以上的第二个要求。为每个自定义行为找到对应的类。这个uri包含了一个字符串,容器用它来定位tld文件。在tld文件中可以找到标签库中所有标签处理类的名称
: W% i6 X( ]/ C8 P2. 当web应用程序启动时,容器从web-inf文件夹的目录结构的meta-inf搜索所有以.tld结尾的文件。也就是说它们会定位所有的tld文件。对于每个tld文件,容器会先获取标签库的uri,然后为每个tld文件和对应的uri创建映射关系。
% X# z6 j2 B; s5 ^7 R+ T! d在jsp页面中,我们仅需通过使用带有uri属性值的标签库指令来和具体的标签库匹配1 Y7 U% r4 Z5 p8 w0 \6 h
三、自定义jsp标签的处理过程:3 ]" q2 E1 G! U( h
1.在jsp中引入标签库:4 y, R! w6 d' X* k" L4 G9 ?. _6 @
2.在jsp中使用标签库标签
5 B3 }. U& y( V" G2 ?3.web容器根据第二个步骤中的prefix,获得第一个步骤中声明的taglib的uri属性值
4 n8 }# n* O- P. C! w4.web容器根据uri属性在web.xml找到对应的元素 5.从元素中获得对应的元素的值 6.web容器根据元素的值从web-inf/目录下找到对应的.tld文件 7.从.tld文件中找到与tagname对应的元素 8.凑元素中获得对应的元素的值 9.web容器根据元素的值创建相应的tag handle class的实例 10. web容器调用这个实例的dostarttag/doendtag方法完成相应的处理
% E4 _& T$ {" ?" h四、创建和使用一个tag library的基本步骤:
3 ]6 A. ~" w( `' c- g/ \! R: J1.创建标签的处理类(tag handler class); L6 a8 ~- u& b" v5 d5 M: \/ E9 y
2.创建标签库描述文件(tag library descrptor file)
' H9 A$ G7 Y! w; w3.在web.xml文件中配置元素 4.在jsp文件中引人标签库
9 ^( Q& [. ], ?& t1 }* Y0 _$ \# |: X五、tagsupport类简介:
# L1 F5 F$ I) }9 D: Z1.处理标签的类必须扩展javax.servlet.jsp.tagsupport.
1 L8 C$ ^% Q+ d) j9 F& b& I4 `2.tagsupport类的主要属性:
& ~- E7 i$ @; A' ja.parent属性:代表嵌套了当前标签的上层标签的处理类0 J8 s, G$ y0 v1 U$ P+ ~
b.pagecontex属性:代表web应用中的javax.servlet.jsp.pagecontext对象% P! s& z$ _$ g2 t# L: s
3.jsp容器在调用dostarttag或者doendtag方法前,会先调用setpagecontext和setparent方法,设置pagecontext和parent。因此在标签处理类中可以直接访问pagecontext变量! N3 b1 w( X. r1 U
4.在tagsupport的构造方法中不能访问pagecontext成员变量,因为此时jsp容器还没有调用& C$ V! k' r5 u2 ^% A0 J
setpagecontext方法对pagecontext进行初始化
& c u7 O, Y+ D6 T4 `六、tagsupport处理标签的方法:
! s% \7 \' f, u, h1.tagsupport类提供了两个处理标签的方法:
( o+ E' x7 f: F5 x( F& l1 {8 D) bpublic int dostarttag() throws jspexception+ h9 W1 M! d, ?- y, {$ }# z
public int doendtag() throws jspexception
) I, o' j% Z I+ C! L2 {& v4 @2.dostarttag:但jsp容器遇到自定义标签的起始标志,就会调用dostarttag()方法。
+ R: y# M5 W$ b, xdostarttag()方法返回一个整数值,用来决定程序的后续流程。
8 |& i* J* W3 e1 N4 ya.tag.skip_body:表示?>…之间的内容被忽略
4 j8 ?7 }* _" e( i3 \9 c7 Yb.tag.eval_body_include:表示标签之间的内容被正常执行" {! N# J& W# v' t+ c, F
3.doendtag:但jsp容器遇到自定义标签的结束标志,就会调用doendtag()方法。doendtag()方法也返回一个整数值,用来决定程序后续流程。
4 w8 s( S- p* G; s1 t" o% Ka.tag.skip_page:表示立刻停止执行网页,网页上未处理的静态内容和jsp程序均被忽略任何已有的输出内容立刻返回到客户的浏览器上。
" ^7 K+ ]/ K' u, Bb.tag_eval_page:表示按照正常的流程继续执行jsp网页! Z9 P5 Q& ^) n
七、用户自定义的标签属性:
h3 v4 ~, W w; ~" \% c如果在标签中还包含了自定义的属性,那么在标签处理类中应该将这个属性作为成员变量,并且分别提供设置和读取属性的方法。
# y& N6 j' I' r+ d$ ~8 B( A2 s八、创建标签处理类的步骤:& [& r) y- W7 f
1.创建包含jsp网页静态文本的文件(即是要替换自定义jsp标签的文本)
. B9 a4 k0 V, D; n1 a9 K7 `2.在web应用启动时装载静态文本7 x0 U' Q/ v" c6 h* L0 i% i4 b
3.创建标签处理类" W3 f' t9 t0 `' u G3 w% b! {
九、如何创建包含jsp网页静态文本的文件:7 K( z# A$ \0 Q L8 s, d! f
1.使用java.util.properties类来存放要替换网页中自定义jsp标签的静态文本3 H# \7 z: _1 Z( w' A
2.properties类代表了一系列属性的集合,其实例既可以被保存到流中,也可以从流中加载。这些文本以key/value的形式存放在web-inf目录下,例如key=value,在属性列表中这些key/value都是string类型的3 I: }! H" y2 N% k) V, x
十、properties类的常用api:
# u( c7 p. o& s! p0 Y$ G2 p1.setproperty(string key, string value):调用hashtable类的put方法添加属性- u/ u8 X( R- k8 d a$ `$ N0 E, J
2.getproperty(string key):获取属性列表中key对应的属性值
1 Z6 z: _# a1 Q2 f3.load(inputstream in):从输入流对象inputstream中读取属性列表(properties list)) T3 ^6 x. Y. W
4.store(outputstream out,string comment):使用适当的格式将属性列表的属性对写入输出流对象中,默认使用iso-88590-1编码格式,以行的方式处理输入。属性的key/value之间以”=、:”配对,以回车、换行分隔key/value配对6 j9 q1 L7 R9 a3 _. _0 |8 C
十一、servletcontext类的常用api:
( `6 m L% @, B1.getcontext(string uripath):返回服务器中uripath所代表的servletcontext对象
/ [$ T8 Y+ j5 c2.getinitparameter(string name):返回servletconfig对象中name参数的值* D5 ]! Q8 @/ u' u$ b! k
3.getminetype(string file):返回file参数代表的文件的mime类型
. H: D5 X/ G$ o. H4.getrequestdispatcher(string path):返回path代表的requestdispacher对象
( V* i6 h; D- {% W5.getresourceasstream(string path):以输入流的形式返回path对应的资源,在输入留中对象可以为任意形式的数据,path参数必须以“/”开始且相对于context root
, |3 s' L. E- N# f十二、如何使用servletcontxt读取并保存属性文件:8 j, |' f b8 Y- {/ {; J
1.创建java.util.properties类对象9 N: L# M; c/ Z5 w: s3 Z* M- t
2.获取servletcontext对象( O6 P, r+ n4 _+ h9 b+ g
3.将属性文件以输入流的形式读入到某个输入流对象中, [6 r" v! o% ^( Z1 q) c9 h
4.将输入流对象加载到properties对象中) v! c$ ]) S6 `
5.将properties对象保存到servletcontext对象中
- U( U- K, v' H" J( p7 [5 E% p十三、如何在web应用启动时装载静态文本:
0 N2 p# R+ o: ~" a$ s/ l7 U1.创建继承了httpservlet类的子类,在web.xml中配置这servlet时设置load-on-startup属性:
/ a; O9 F# M1 g8 V+ J2 G1 bsomeclass
& M8 C2 J+ w o" Y; n) @somepackage.someclass1
( o) c* c# L5 ]* p" p' `5 a2.在这个servlet的init()方法中创建java.util.properties类
1 a; M ~; e+ e3.获取当前web应用的servletcontext对象
" [- v6 ]# n, h# W. V4 y9 a4.将web-inf目录下的属性文件读入到输入流inputstream中:
# B$ V) L: q) N7 d6 ainputstream in = context.getresourceasstring(web-inf/someproperties.properties);
3 f8 L0 t5 N- Y) t7 V6 C* u, N) n: b5.将输入流加载到属性对象中7 y! W+ P) i. j2 |$ H
ps.load(in);
* t7 }" C/ v! ~: P/ E5 w6.将属性对象保存到上! U, B K9 v. |! e( [
context.setattribute(attributename,ps);: L, v/ E' i! R @( \
十四、如何创建标签处理类:
7 T4 K& n T" I7 }9 O4 L# X1.引入必需的资源:
) S8 n+ c% |6 Z- a- Dimport javax.servlet.jsp.*;
8 p0 r9 x; J- r! f6 i$ P$ ]# simport javax.servlet.http.*;' g( n f- G. m5 T
import java.util.*;
* o& t; J7 z8 e$ T% R simport java.io.*;( S; p6 ^- E, }( m9 d
2.继承tagsupport类并覆盖dostarttag()/doendtag()方法. V* x$ v; L* y+ d3 f
3.从servletcontext对象中获取java.util.properties对象2 F$ m2 c; w5 i
4.从properties对象中获取key对应的属性值- H/ Z8 o( H8 B: P- f! w
5.对获取的属性进行相应的处理并输出结果8 t5 i( R3 x& L
十五、创建标签库描述文件(tag library descriptor):; u' X6 _+ y4 V$ z4 k
1.标签库描述文件,简称tld,采用xml文件格式,定义了用户的标签库。tld文件中的元素可以分成3类:2 v `* V% d/ f7 n( H7 ]
a.:标签库元素# M0 J2 m7 c4 T/ ?; _3 P
b.:标签元素( \' i. J' @% e5 ]* `" K
c.:标签属性元素* Z' Y2 F. u7 D" @: g
2.标签库元素用来设定标签库的相关信息,它的常用属性有:/ b- t5 \) E5 o0 J% z
a.shortname: 指定tag library默认的前缀名(prefix); _ @8 L. k) l2 H8 @ ~) A' E4 O
b.uri: 设定tag library的惟一访问表示符
- B( g8 z r( g/ O3.标签元素用来定义一个标签,它的常见属性有:
, O# g9 C5 R( I2 P6 G1 s8 `a.name: 设定tag的名字 \: s# \ Y. y. { m9 h( j
b.tagclass: 设定tag的处理类
, @5 m/ d ~( d( [% g2 lc.bodycontent: 设定标签的主体(body)内容* j7 F6 f5 _( k o: ~' }
1).empty:表示标签中没有body
# h* v9 [& j0 v# F, j0 v2).jsp:表示标签的body中可以加入jsp程序代码
' N% T' @8 D4 B6 e. G* g3).tagdependent:表示标签中的内容由标签自己去处理5 o f3 E0 l9 S
4.标签属性元素用来定义标签的属性,它的常见属性有:' V8 {+ S* K" l, C' @
a.name:属性名称: v7 ?! D# r7 U6 j
b.required:属性是否必需的,默认为false
$ s$ t$ R/ P+ C) b1 Jc.rtexprvalue:属性值是否可以为request-time表达式,也就是类似于< %=…% >的表达式& {+ v1 ?+ q: S$ h) l, I. C
十六、在web应用中使用标签:
9 E- a1 C4 d- ^4 {6 Q: T0 B# C7 p1.如果web应用中用到了自定义jsp标签,则必须在web.xml文件中加入元素,它用于声明所引用的标签所在的标签库. T+ K+ E3 V- J- M
/sometaglib2 z+ t+ r- }) z3 A7 J" M
/web-inf/sometld.tld* }4 z- _8 `, X; H
2.:设定tag library的惟一标示符,在web应用中将根据它来引用tag libray' S2 I% V8 u4 W T. q+ S
3.:指定和tag library对应的tld文件的位置
( [- j T6 t, z x: I4.在jsp文件中需要加入% } Q: q( j/ ^$ b" T$ n6 }5 g
5.prefix表示在jsp网页中引用这个标签库的标签时的前缀,uri用来指定tag library的标识符,它必须和web.xml中的属性保持一致。
3 e& b/ ^: [! f+ Y/ I9 W6 n5 l; x6 b( ~: F' H+ Q
更多网页制作信息请查看: 网页制作 |
|