返回列表 发新帖

jsp的自定义标签教程

589.9k 10
swmozowtfl 发表于 2015-7-26 20:47:02|湖北 | 查看全部 阅读模式
一、基本概念:
- \' ~& U$ N" P- x- j1.标签(tag):
6 Y8 s# ?0 Y4 \1 e- p. Z标签是一种xml元素,通过标签可以使jsp网页变得简洁并且易于维护,还可以方便地实现同一个jsp文件支持多种语言版本。由于标签是xml元素,所以它的名称和属性都是大小写敏感的
4 w* x2 h& {7 M; b* W2.标签库(tag library):5 _' a2 X+ G( ?/ p! `. O# J8 c: L: z
由一系列功能相似、逻辑上互相联系的标签构成的集合称为标签库。
" f5 ^' _0 I% K3.标签库描述文件(tag library descriptor):! E& U3 Q. `* V& c# q
标签库描述文件是一个xml文件,这个文件提供了标签库中类和jsp中对标签引用的映射关系。它是一个配置文件,和web.xml是类似的。' i" e" X3 ^7 S* q
4.标签处理类(tag handle class):+ s# q, K' f9 I
标签处理类是一个java类,这个类继承了tagsupport或者扩展了simpletag接口,通过这个类可以实现自定义jsp标签的具体功能1 E# d' K) r- P8 H+ F$ ?
二、自定义jsp标签的格式:% A8 f, W: q# `
1.
- D! U! I5 g2 h为了使到jsp容器能够使用标签库中的自定义行为,必须满足以下两个条件:
7 k8 P- @) j/ _8 d9 G/ W( v4 _1)从一个指定的标签库中识别出代表这种自定义行为的标签
' T( H/ l1 A7 p! D" q5 k4 c2)找到实现这些自定义行为的具体类
9 n2 W( Y+ d! Z! {& f0 |# g第一个必需条件-找出一个自定义行为属于那个标签库-是由标签指令的前缀(taglib directive's prefix)属性完成,所以在同一个页面中使用相同前缀的元素都属于这个标签库。每个标签库都定义了一个默认的前缀,用在标签库的文档中或者页面中插入自定义标签。所以,你可以使用除了诸如jsp,jspx,java,servlet,sun,sunw(它们都是在jsp白皮书中指定的保留字)之类的前缀。
/ J. ^/ r& v" `uri属性满足了以上的第二个要求。为每个自定义行为找到对应的类。这个uri包含了一个字符串,容器用它来定位tld文件。在tld文件中可以找到标签库中所有标签处理类的名称: \- p" O" i4 ?0 n3 F
2. 当web应用程序启动时,容器从web-inf文件夹的目录结构的meta-inf搜索所有以.tld结尾的文件。也就是说它们会定位所有的tld文件。对于每个tld文件,容器会先获取标签库的uri,然后为每个tld文件和对应的uri创建映射关系。
8 e) z& m, z) K在jsp页面中,我们仅需通过使用带有uri属性值的标签库指令来和具体的标签库匹配
- x; v7 @* Y$ \& v5 E三、自定义jsp标签的处理过程:
/ G5 ^+ g) T& s1.在jsp中引入标签库:1 y+ J" @7 p  h) g: {2 F" H8 s
2.在jsp中使用标签库标签! M, C9 n9 y# @
3.web容器根据第二个步骤中的prefix,获得第一个步骤中声明的taglib的uri属性值3 R, W( ]  j8 D3 C& s
4.web容器根据uri属性在web.xml找到对应的元素 5.从元素中获得对应的元素的值 6.web容器根据元素的值从web-inf/目录下找到对应的.tld文件 7.从.tld文件中找到与tagname对应的元素 8.凑元素中获得对应的元素的值 9.web容器根据元素的值创建相应的tag handle class的实例 10. web容器调用这个实例的dostarttag/doendtag方法完成相应的处理! l; O3 b* Q' ]
四、创建和使用一个tag library的基本步骤:
3 k/ E# T0 V# @$ r8 M) q1.创建标签的处理类(tag handler class)6 l- J$ S/ V4 M$ v) [
2.创建标签库描述文件(tag library descrptor file)5 k# B$ Z" [$ M  r' j+ x- y0 ]
3.在web.xml文件中配置元素 4.在jsp文件中引人标签库
, Y( V+ W7 O/ _6 V" c* D五、tagsupport类简介:$ ~+ _4 E3 ]4 J3 q2 O/ s
1.处理标签的类必须扩展javax.servlet.jsp.tagsupport.
/ G3 a* `! l9 v4 o4 y2.tagsupport类的主要属性:; C+ s( n/ V( L3 h* R) v) l! m0 A4 Y3 l
a.parent属性:代表嵌套了当前标签的上层标签的处理类) {, v& ]! R( J3 y4 D$ M
b.pagecontex属性:代表web应用中的javax.servlet.jsp.pagecontext对象" ^- d2 }$ M% o6 ?! {& Y1 Z
3.jsp容器在调用dostarttag或者doendtag方法前,会先调用setpagecontext和setparent方法,设置pagecontext和parent。因此在标签处理类中可以直接访问pagecontext变量6 M- o" f) \3 ~* w
4.在tagsupport的构造方法中不能访问pagecontext成员变量,因为此时jsp容器还没有调用* w9 f1 x( {5 B7 ~$ p
setpagecontext方法对pagecontext进行初始化
* l* w0 Z6 i4 [8 i: l六、tagsupport处理标签的方法:5 V, \9 T" V- ?& `+ T( e( O. a
1.tagsupport类提供了两个处理标签的方法:: C$ `. H) y! K2 v/ r" H6 N! X
public int dostarttag() throws jspexception0 ^8 [% h6 g. ]4 t1 z0 L1 W. n) G
public int doendtag() throws jspexception
3 R+ B+ A/ F5 A$ f( U0 j0 V2.dostarttag:但jsp容器遇到自定义标签的起始标志,就会调用dostarttag()方法。0 v' S. [( E2 ?6 s( n7 A, a
dostarttag()方法返回一个整数值,用来决定程序的后续流程。' S9 T! R; T% ?# i
a.tag.skip_body:表示?>…之间的内容被忽略- r# z. G! L4 h: q* C; N
b.tag.eval_body_include:表示标签之间的内容被正常执行
( [5 p( C/ I& G" S3.doendtag:但jsp容器遇到自定义标签的结束标志,就会调用doendtag()方法。doendtag()方法也返回一个整数值,用来决定程序后续流程。* R1 I3 p! e2 l/ M. s; O5 G& a' n
a.tag.skip_page:表示立刻停止执行网页,网页上未处理的静态内容和jsp程序均被忽略任何已有的输出内容立刻返回到客户的浏览器上。
  g+ Y" K: @% N% T/ Y; Hb.tag_eval_page:表示按照正常的流程继续执行jsp网页
$ W% i3 ^6 \. J% i# x七、用户自定义的标签属性:
1 b. u# k8 E7 O% n4 L& w" f如果在标签中还包含了自定义的属性,那么在标签处理类中应该将这个属性作为成员变量,并且分别提供设置和读取属性的方法。
) F8 o! E3 ?2 {. L( z& a八、创建标签处理类的步骤:
; A$ P" |: i) s& X( o4 d* m* r; P1.创建包含jsp网页静态文本的文件(即是要替换自定义jsp标签的文本)! o- F5 g5 v/ u8 h( {  [& F
2.在web应用启动时装载静态文本
. R$ ]/ R( @+ n: p- n3.创建标签处理类
& l5 f8 e' ~8 q% {7 q/ }$ n九、如何创建包含jsp网页静态文本的文件:
$ H7 `: G: i# Q  U! Q5 ^1 h1.使用java.util.properties类来存放要替换网页中自定义jsp标签的静态文本6 {: r; [; \, Q& T: q
2.properties类代表了一系列属性的集合,其实例既可以被保存到流中,也可以从流中加载。这些文本以key/value的形式存放在web-inf目录下,例如key=value,在属性列表中这些key/value都是string类型的( g- U9 \, [: s2 U& U
十、properties类的常用api:
) \, Q4 y# h* u/ a6 Z1 m! i1.setproperty(string key, string value):调用hashtable类的put方法添加属性3 T4 J4 B; p7 p
2.getproperty(string key):获取属性列表中key对应的属性值/ ]- c6 s- r) B" S. a6 |9 b( v9 e
3.load(inputstream in):从输入流对象inputstream中读取属性列表(properties list)( J# E+ O" d5 i1 ^5 P, \: @9 p
4.store(outputstream out,string comment):使用适当的格式将属性列表的属性对写入输出流对象中,默认使用iso-88590-1编码格式,以行的方式处理输入。属性的key/value之间以”=、:”配对,以回车、换行分隔key/value配对
$ J2 ~$ D7 q7 W. r+ _3 m十一、servletcontext类的常用api:: d+ b% s# e+ g" Y1 t
1.getcontext(string uripath):返回服务器中uripath所代表的servletcontext对象
7 L: u8 o1 e7 G0 e# s/ m2.getinitparameter(string name):返回servletconfig对象中name参数的值3 t& ~5 A& L, d6 s+ t: f
3.getminetype(string file):返回file参数代表的文件的mime类型6 R+ q# L- h; c0 C/ [4 q
4.getrequestdispatcher(string path):返回path代表的requestdispacher对象( S$ r6 A7 Q5 l, J; \, S" N; Z% e
5.getresourceasstream(string path):以输入流的形式返回path对应的资源,在输入留中对象可以为任意形式的数据,path参数必须以“/”开始且相对于context root
3 w0 z7 F* D$ w3 W% Q十二、如何使用servletcontxt读取并保存属性文件:
' u3 k2 R1 ^3 K1.创建java.util.properties类对象
1 G( Y" m; V! i! m2.获取servletcontext对象# n: S. H8 l9 ~! z4 X" S2 t/ f
3.将属性文件以输入流的形式读入到某个输入流对象中
, }0 p. W! D  ]3 \/ }4 X4.将输入流对象加载到properties对象中
7 z' D+ g8 \5 M- ^6 w5.将properties对象保存到servletcontext对象中
. K3 X5 ?8 `* P十三、如何在web应用启动时装载静态文本:
# |2 E! \* q% j! N+ l6 o5 ~1.创建继承了httpservlet类的子类,在web.xml中配置这servlet时设置load-on-startup属性:
' X( T' f9 F  ]; R0 z8 j2 D% y4 fsomeclass
2 E! X- @7 T4 v% {$ H# wsomepackage.someclass1
2 e1 F' V4 R- `! D4 ]5 g# t0 c2.在这个servlet的init()方法中创建java.util.properties类" a9 D3 L) |! [5 n& e
3.获取当前web应用的servletcontext对象
. i8 {# B0 w" a& B4.将web-inf目录下的属性文件读入到输入流inputstream中:* P6 M- i7 |: k  b6 J
inputstream in = context.getresourceasstring(web-inf/someproperties.properties);0 _  q8 N4 D' `0 r0 A
5.将输入流加载到属性对象中
- H4 K' v9 u1 mps.load(in);% p. R5 j- j$ ^( h7 O
6.将属性对象保存到上
5 y8 P$ u6 I- }2 x- j' econtext.setattribute(attributename,ps);
; \* y% `( T4 B7 i6 x" g十四、如何创建标签处理类:
: W2 S: n# r; a, K, Q1.引入必需的资源:
" I' i7 [3 n( o5 Cimport javax.servlet.jsp.*;2 z# V9 b- J& [; t& W* m) L
import javax.servlet.http.*;" i+ E; M/ h2 K
import java.util.*;8 }5 ?9 ?) D& f' n
import java.io.*;9 o5 I! I' H5 F# _+ y
2.继承tagsupport类并覆盖dostarttag()/doendtag()方法
' w6 j% R  q, w8 o0 m+ f2 I3.从servletcontext对象中获取java.util.properties对象
9 j/ d, d4 k& D4.从properties对象中获取key对应的属性值
' Q( S! F: H& |5 W% [" G# g$ Z5.对获取的属性进行相应的处理并输出结果
. d/ y' H. r( O十五、创建标签库描述文件(tag library descriptor):- Y2 O3 v5 j) ~& E9 y$ O% u+ o
1.标签库描述文件,简称tld,采用xml文件格式,定义了用户的标签库。tld文件中的元素可以分成3类:" A7 m; ~; i% D& y0 ]) r4 @* j
a.:标签库元素% D+ D% W- a' @4 z* X
b.:标签元素
' a' K( h2 I& i# v* oc.:标签属性元素$ c( Z. H1 w, {. P9 u
2.标签库元素用来设定标签库的相关信息,它的常用属性有:. `& F* q/ H/ m- L+ M3 J
a.shortname: 指定tag library默认的前缀名(prefix)
6 a: r. E* {! v$ u7 J; o$ R: Ab.uri: 设定tag library的惟一访问表示符. @) `# o+ s( D
3.标签元素用来定义一个标签,它的常见属性有:2 i, i, Y4 N; c5 R& {; ^* \
a.name: 设定tag的名字
( r; @) ]1 g) f" q7 ]4 Pb.tagclass: 设定tag的处理类0 m! |& W6 J4 h+ \9 ^1 A
c.bodycontent: 设定标签的主体(body)内容
5 X7 j  ], y# j( F& |9 H1).empty:表示标签中没有body) m; R, g2 K8 E. L
2).jsp:表示标签的body中可以加入jsp程序代码- g- U* L5 |) o9 Q3 h/ P  B8 C; F
3).tagdependent:表示标签中的内容由标签自己去处理& d, ]  E+ d3 R; p9 j* I, v
4.标签属性元素用来定义标签的属性,它的常见属性有:' v- K6 w1 |# @$ y; @1 s" I
a.name:属性名称
7 E" Y6 p3 l; v- k% @b.required:属性是否必需的,默认为false
+ h6 W9 ^* |2 ?& M# @c.rtexprvalue:属性值是否可以为request-time表达式,也就是类似于< %=…% >的表达式8 L7 `$ n! J7 ]$ [
十六、在web应用中使用标签:
: Y+ Y9 H% g& D) e: i9 H$ _1.如果web应用中用到了自定义jsp标签,则必须在web.xml文件中加入元素,它用于声明所引用的标签所在的标签库  Q1 W$ `1 q" F
/sometaglib
. ?% a# n' G: R0 C- J# v' o; V/web-inf/sometld.tld# l+ V8 t+ z, U! I
2.:设定tag library的惟一标示符,在web应用中将根据它来引用tag libray- T$ q0 V4 P" Y  t( Q& m
3.:指定和tag library对应的tld文件的位置
$ Y! H& B3 `8 c0 a# s& p/ x, x5 @4.在jsp文件中需要加入/ V* N5 N( J, J4 ]7 O+ y7 D
5.prefix表示在jsp网页中引用这个标签库的标签时的前缀,uri用来指定tag library的标识符,它必须和web.xml中的属性保持一致。! f+ I- X; e3 X& f0 K- p- ~6 K2 D
/ h4 c2 d+ S. l4 m6 m
更多网页制作信息请查看: 网页制作

回复|共 10 个

mwxny 发表于 2015-10-5 15:07:38|Reserved | 查看全部
本人在此留言均为网络上复制,用于检验本人电脑键盘录入、屏幕显示的机械、光电性能。并不代表本人局部或全部同意、支持或者反对楼主观点。
wwdu926a 发表于 2015-10-5 15:06:17|英国 | 查看全部
今天统计好像出了问题
gevaemaidovef 发表于 2015-10-5 15:06:41|欧洲 | 查看全部
这是安慰我啊~~还是垮我啊???怎么感觉又被扁了啊
Mqokjdvq 发表于 2015-10-5 15:07:24|荷兰 | 查看全部
朕在自己的寝宫~~~~
seazvyt 发表于 2015-10-5 15:07:26|美国 | 查看全部
正好你开咯这样的帖
seazvyt 发表于 2015-11-7 14:01:47|印度 | 查看全部
综上所述,恳请各位官员请勿动用武装力量请勿跨村、跨镇、跨市、跨省、跨国、跨洲、跨星球、跨银河系追捕。确因不抓不足以平民愤,或不抓就领不到薪水养家户口的公职人员,建议携带工作证
bqtklouu 发表于 2015-11-7 14:03:05|美国 | 查看全部
女人啊真是那句话~~~无理占三分~~忘记怎么说了 呵呵 ~~你帮我想想
buingeEvineus 发表于 2015-11-7 14:01:55|河南 | 查看全部
真的 好久都没有这么笑了~ 好开心哦
wwdu926a 发表于 2015-11-7 14:02:35|法国 | 查看全部
也有啊,前天不是你也到一个很狂的贴里去了吗?
buingeEvineus 发表于 2015-11-7 14:03:04|埃及 | 查看全部
貌似我真的很笨????哎

回复

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

本版积分规则

得知互动是一个融创意、设计、开发、营销、生活、互联网于一体的专业交流分享平台。
Copyright © 2026 得知互动-专注Ai与站长技术交流社区-Ai交流平台 版权所有 All Rights Reserved. Powered by Discuz! X5.0 鄂ICP备15006301号-5|鄂公网安备 42018502006730号
关灯 在本版发帖 扫一扫添加QQ客服 返回顶部
快速回复 返回顶部 返回列表