返回列表 发新帖

jsp的自定义标签教程

589.8k 10
swmozowtfl 发表于 2015-7-26 20:47:02|湖北 | 查看全部 阅读模式
一、基本概念:
& @! K/ s+ |4 {- T" c1.标签(tag):: S( a, o1 R( K
标签是一种xml元素,通过标签可以使jsp网页变得简洁并且易于维护,还可以方便地实现同一个jsp文件支持多种语言版本。由于标签是xml元素,所以它的名称和属性都是大小写敏感的+ x. A5 Y' I' D) L
2.标签库(tag library):
6 O9 D0 Q2 I- G$ t2 m8 J由一系列功能相似、逻辑上互相联系的标签构成的集合称为标签库。& E) Q+ j7 p: C* {3 {2 k
3.标签库描述文件(tag library descriptor):
0 n& n% b, _. v& t. X5 u标签库描述文件是一个xml文件,这个文件提供了标签库中类和jsp中对标签引用的映射关系。它是一个配置文件,和web.xml是类似的。
/ s( r6 F. G5 @' H4 E/ h( M4.标签处理类(tag handle class):
: O# |6 E* U! d! e$ G+ y标签处理类是一个java类,这个类继承了tagsupport或者扩展了simpletag接口,通过这个类可以实现自定义jsp标签的具体功能
0 i8 M# h. q9 O0 L/ J4 [二、自定义jsp标签的格式:
/ B7 \2 s3 r  j% y6 G1.1 m3 c3 F& X5 s1 a3 |: ~
为了使到jsp容器能够使用标签库中的自定义行为,必须满足以下两个条件:2 m6 R7 p( A2 U
1)从一个指定的标签库中识别出代表这种自定义行为的标签
) I" P* v5 k/ W# ^2)找到实现这些自定义行为的具体类+ y' {! e0 s# E% q& F
第一个必需条件-找出一个自定义行为属于那个标签库-是由标签指令的前缀(taglib directive's prefix)属性完成,所以在同一个页面中使用相同前缀的元素都属于这个标签库。每个标签库都定义了一个默认的前缀,用在标签库的文档中或者页面中插入自定义标签。所以,你可以使用除了诸如jsp,jspx,java,servlet,sun,sunw(它们都是在jsp白皮书中指定的保留字)之类的前缀。
  {$ A! ^# V. W9 S4 [# k" Vuri属性满足了以上的第二个要求。为每个自定义行为找到对应的类。这个uri包含了一个字符串,容器用它来定位tld文件。在tld文件中可以找到标签库中所有标签处理类的名称5 x0 l5 m& K  ?- y9 K5 ?) \
2. 当web应用程序启动时,容器从web-inf文件夹的目录结构的meta-inf搜索所有以.tld结尾的文件。也就是说它们会定位所有的tld文件。对于每个tld文件,容器会先获取标签库的uri,然后为每个tld文件和对应的uri创建映射关系。# ~% j) d- {' k2 w3 ^" `- _
在jsp页面中,我们仅需通过使用带有uri属性值的标签库指令来和具体的标签库匹配
$ ?5 k3 }. Y0 y$ W5 q三、自定义jsp标签的处理过程:' H; K$ |5 |6 L: w
1.在jsp中引入标签库:
- w8 x4 e; t2 P5 C; V. Q3 h2.在jsp中使用标签库标签+ a7 c- O7 L: w4 }2 ~/ _
3.web容器根据第二个步骤中的prefix,获得第一个步骤中声明的taglib的uri属性值5 D# X% F( f- b5 z3 T
4.web容器根据uri属性在web.xml找到对应的元素 5.从元素中获得对应的元素的值 6.web容器根据元素的值从web-inf/目录下找到对应的.tld文件 7.从.tld文件中找到与tagname对应的元素 8.凑元素中获得对应的元素的值 9.web容器根据元素的值创建相应的tag handle class的实例 10. web容器调用这个实例的dostarttag/doendtag方法完成相应的处理: C8 }" r& P4 S& W
四、创建和使用一个tag library的基本步骤:
2 f* w# C; j1 U8 m2 i1.创建标签的处理类(tag handler class)' z* Q8 x- i! ]. z0 A) s9 h. G9 J
2.创建标签库描述文件(tag library descrptor file), i6 a, o, u. k! |" n7 d4 z" h
3.在web.xml文件中配置元素 4.在jsp文件中引人标签库
* v9 a% {) W9 M' J五、tagsupport类简介:
: k3 x9 `4 q$ A6 |) u% r0 [1 ]1.处理标签的类必须扩展javax.servlet.jsp.tagsupport.' E7 p" B- T1 X  S9 e
2.tagsupport类的主要属性:
3 ~$ ^+ V3 @' B9 xa.parent属性:代表嵌套了当前标签的上层标签的处理类
- @1 W" h# _/ x! P3 Gb.pagecontex属性:代表web应用中的javax.servlet.jsp.pagecontext对象
3 O# x8 O: J0 R- \! p( V2 N3.jsp容器在调用dostarttag或者doendtag方法前,会先调用setpagecontext和setparent方法,设置pagecontext和parent。因此在标签处理类中可以直接访问pagecontext变量
: D1 @: t5 C) r0 ~) l4.在tagsupport的构造方法中不能访问pagecontext成员变量,因为此时jsp容器还没有调用: E) h* T, U  p" P2 r
setpagecontext方法对pagecontext进行初始化( R# p) f# S/ r4 E" w' f& B
六、tagsupport处理标签的方法:) T% b! D( i8 P1 u# o0 o
1.tagsupport类提供了两个处理标签的方法:
0 q0 e( F' v/ qpublic int dostarttag() throws jspexception  H9 V1 D- r+ H6 Y$ c
public int doendtag() throws jspexception
( h5 U" c" Q5 Z( e' _0 f2.dostarttag:但jsp容器遇到自定义标签的起始标志,就会调用dostarttag()方法。
7 o1 i! m1 Q* G0 v, o( U% N9 ]" }! }dostarttag()方法返回一个整数值,用来决定程序的后续流程。
' x9 n- ~! h5 ba.tag.skip_body:表示?>…之间的内容被忽略
+ _: W2 F/ U+ U' u# P4 x! X9 |/ ~b.tag.eval_body_include:表示标签之间的内容被正常执行! X% Y9 }4 @1 \; `) R
3.doendtag:但jsp容器遇到自定义标签的结束标志,就会调用doendtag()方法。doendtag()方法也返回一个整数值,用来决定程序后续流程。
# T# K0 K3 F" Q+ s+ E! t1 Ha.tag.skip_page:表示立刻停止执行网页,网页上未处理的静态内容和jsp程序均被忽略任何已有的输出内容立刻返回到客户的浏览器上。" |- }* B" |. N* F, v
b.tag_eval_page:表示按照正常的流程继续执行jsp网页$ v  k  {4 E" B( K! ~
七、用户自定义的标签属性:, l" ~' T  w! B2 c
如果在标签中还包含了自定义的属性,那么在标签处理类中应该将这个属性作为成员变量,并且分别提供设置和读取属性的方法。4 d" v7 z4 T8 S( }
八、创建标签处理类的步骤:
- M% R' h' z* Z" y1.创建包含jsp网页静态文本的文件(即是要替换自定义jsp标签的文本)
' w& O1 E6 o. g8 W5 }9 W# ]( i2.在web应用启动时装载静态文本6 c& g* T( ^+ t8 p) I
3.创建标签处理类
2 |1 o- U7 n4 a4 _! P: X8 {% U九、如何创建包含jsp网页静态文本的文件:
7 \$ e& L7 |  t/ n5 n! v1.使用java.util.properties类来存放要替换网页中自定义jsp标签的静态文本7 U2 k4 y" }/ w- w+ a
2.properties类代表了一系列属性的集合,其实例既可以被保存到流中,也可以从流中加载。这些文本以key/value的形式存放在web-inf目录下,例如key=value,在属性列表中这些key/value都是string类型的3 U3 |( |& h6 ?! C0 H! @
十、properties类的常用api:; X9 T( g- l% M5 A: n2 k
1.setproperty(string key, string value):调用hashtable类的put方法添加属性
* ^( I* c9 F6 o" K  u' }% D2.getproperty(string key):获取属性列表中key对应的属性值! E5 L5 [' V* q4 m# b8 |" r
3.load(inputstream in):从输入流对象inputstream中读取属性列表(properties list)( O: L$ T; M% k$ f
4.store(outputstream out,string comment):使用适当的格式将属性列表的属性对写入输出流对象中,默认使用iso-88590-1编码格式,以行的方式处理输入。属性的key/value之间以”=、:”配对,以回车、换行分隔key/value配对8 m' R: L0 |% z5 Y  F
十一、servletcontext类的常用api:
1 h; _5 K+ l$ ]* `1.getcontext(string uripath):返回服务器中uripath所代表的servletcontext对象, Q& [" ~8 F1 n( M+ m( Y
2.getinitparameter(string name):返回servletconfig对象中name参数的值
0 ^- X8 F! w+ c: |1 n3.getminetype(string file):返回file参数代表的文件的mime类型
, P  Z' x- E9 h1 r4.getrequestdispatcher(string path):返回path代表的requestdispacher对象
- a! F2 a) ]5 ^2 V' `/ q5.getresourceasstream(string path):以输入流的形式返回path对应的资源,在输入留中对象可以为任意形式的数据,path参数必须以“/”开始且相对于context root+ G* P: ^/ {9 I- J* @8 ~; f+ I
十二、如何使用servletcontxt读取并保存属性文件:
# t/ B/ g  _# }  C3 u1.创建java.util.properties类对象
6 c0 I& Q/ \$ @, D2.获取servletcontext对象
+ Y% Z1 ~1 _0 n6 L) Y& `) g3.将属性文件以输入流的形式读入到某个输入流对象中% V9 ^6 E. e+ x" u* @% a/ e" Y
4.将输入流对象加载到properties对象中8 p$ h) @" M. D: I5 i
5.将properties对象保存到servletcontext对象中
* q- r8 f# v5 ^7 I* u十三、如何在web应用启动时装载静态文本:
+ P) M3 u! r9 T) N4 B- e1.创建继承了httpservlet类的子类,在web.xml中配置这servlet时设置load-on-startup属性:
+ e* X6 Z& b; K! Hsomeclass
4 z% ]1 V3 o) Q$ Wsomepackage.someclass18 R$ Z; A- V" V* D  n
2.在这个servlet的init()方法中创建java.util.properties类
: L5 E1 U) P6 A" N' K# g* u3.获取当前web应用的servletcontext对象
2 P# j2 b8 m# |) R# D' q; T- j8 H4.将web-inf目录下的属性文件读入到输入流inputstream中:, x+ h  n, h; Y, k& _( l1 g8 Y/ ~
inputstream in = context.getresourceasstring(web-inf/someproperties.properties);
) U& v4 }1 v& U1 m/ a, {" x5.将输入流加载到属性对象中
! @# x1 V5 l- `9 S6 Z. cps.load(in);4 \& @$ O) H( n6 ^
6.将属性对象保存到上" d2 ~7 W2 H" D! B
context.setattribute(attributename,ps);$ g: U) O8 Y) q  u( u% X
十四、如何创建标签处理类:
. b7 B7 n! H5 T+ E1.引入必需的资源:6 A! W0 P* d5 L" i2 l: Q
import javax.servlet.jsp.*;
3 S, C) U- e; H) s% p" Yimport javax.servlet.http.*;
0 {& u) z& `8 o6 S9 w% Z6 L* Uimport java.util.*;7 _! ?7 G# h. q+ c
import java.io.*;
' s+ B& k# f, X  W2 S, `2.继承tagsupport类并覆盖dostarttag()/doendtag()方法6 Q8 o) ?6 e" ~8 \# u
3.从servletcontext对象中获取java.util.properties对象% V  D5 d$ `' {8 W; C
4.从properties对象中获取key对应的属性值
& T& q- n% Z( p$ x5.对获取的属性进行相应的处理并输出结果
) }  U3 j+ |3 M" |* i) E6 A十五、创建标签库描述文件(tag library descriptor):4 o! X6 z& @5 |
1.标签库描述文件,简称tld,采用xml文件格式,定义了用户的标签库。tld文件中的元素可以分成3类:
8 V+ |" B" b. m4 y( La.:标签库元素
1 k/ s: _- F; z" j6 ]3 l- v! Ib.:标签元素1 ?2 b- [/ o6 a/ S
c.:标签属性元素' O/ c% Y" y: O, r
2.标签库元素用来设定标签库的相关信息,它的常用属性有:! r! }+ `# X9 B6 x( x
a.shortname: 指定tag library默认的前缀名(prefix)
. }2 H) ~) y0 k; B$ \b.uri: 设定tag library的惟一访问表示符3 g1 Q$ b& U" U6 e
3.标签元素用来定义一个标签,它的常见属性有:
) p' X" h, F# G0 H! Ua.name: 设定tag的名字
/ k& a( C1 |: W# ]' E6 b1 {1 wb.tagclass: 设定tag的处理类
: [% v- k7 A5 d: hc.bodycontent: 设定标签的主体(body)内容2 }" }  b1 M% z
1).empty:表示标签中没有body
. \# C2 [5 ?5 |! k9 N2).jsp:表示标签的body中可以加入jsp程序代码0 Z+ @/ X& T* A, g) |( l
3).tagdependent:表示标签中的内容由标签自己去处理
; X: @, O& F0 c$ ?/ P! Z4.标签属性元素用来定义标签的属性,它的常见属性有:
' n; z8 W  Q) B9 t$ R% T2 `/ Fa.name:属性名称
7 F; _2 F  G3 i9 U' g% Y; }b.required:属性是否必需的,默认为false
& m$ Y9 \5 f5 g: D2 H. a1 Rc.rtexprvalue:属性值是否可以为request-time表达式,也就是类似于< %=…% >的表达式
9 x" q" C8 `' V# |十六、在web应用中使用标签:
5 y$ H3 h+ e/ i) b, }! s1.如果web应用中用到了自定义jsp标签,则必须在web.xml文件中加入元素,它用于声明所引用的标签所在的标签库( S7 i/ M0 o. d, r7 i5 ]
/sometaglib
2 `% m: ?8 g3 E- U5 x/web-inf/sometld.tld
9 o% s& f/ l5 F5 p& S, o2.:设定tag library的惟一标示符,在web应用中将根据它来引用tag libray
/ ^. j$ E9 t9 B& |# E. p) u( }3.:指定和tag library对应的tld文件的位置
2 e, q+ s1 {, n5 L8 |" u( ~# A4.在jsp文件中需要加入
+ S8 _! R5 c1 I, D% g6 X! `( t5.prefix表示在jsp网页中引用这个标签库的标签时的前缀,uri用来指定tag library的标识符,它必须和web.xml中的属性保持一致。% c; q" q6 A0 u% i

2 I& H' }1 R  q( x3 D6 M/ D7 W更多网页制作信息请查看: 网页制作

回复|共 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客服 返回顶部
快速回复 返回顶部 返回列表