返回列表 发新帖

jsp的自定义标签教程

589.8k 10
swmozowtfl 发表于 2015-7-26 20:47:02|湖北 | 查看全部 阅读模式
一、基本概念:: \1 C% `! K4 V& a/ j7 j
1.标签(tag):) S  t: D5 ^5 b# o
标签是一种xml元素,通过标签可以使jsp网页变得简洁并且易于维护,还可以方便地实现同一个jsp文件支持多种语言版本。由于标签是xml元素,所以它的名称和属性都是大小写敏感的. u5 W, R1 H. M7 |. O9 |" Y# [
2.标签库(tag library):
  d: @4 M! `8 s由一系列功能相似、逻辑上互相联系的标签构成的集合称为标签库。
: O9 K1 A3 A3 N. Y3.标签库描述文件(tag library descriptor):
' z* f: j% E( u  d, u标签库描述文件是一个xml文件,这个文件提供了标签库中类和jsp中对标签引用的映射关系。它是一个配置文件,和web.xml是类似的。5 d' k$ {/ I7 h
4.标签处理类(tag handle class):
3 Q8 O- m3 h" t标签处理类是一个java类,这个类继承了tagsupport或者扩展了simpletag接口,通过这个类可以实现自定义jsp标签的具体功能* `; W1 C# ~! n2 l: k
二、自定义jsp标签的格式:
! @; s5 ]0 ]. B1.+ |5 U) N9 L) k' I
为了使到jsp容器能够使用标签库中的自定义行为,必须满足以下两个条件:" v( U1 M- p8 ~- ^3 P
1)从一个指定的标签库中识别出代表这种自定义行为的标签
% h+ ^! K- @7 o4 P! p2)找到实现这些自定义行为的具体类
& n! P# o- |; I" b( R第一个必需条件-找出一个自定义行为属于那个标签库-是由标签指令的前缀(taglib directive's prefix)属性完成,所以在同一个页面中使用相同前缀的元素都属于这个标签库。每个标签库都定义了一个默认的前缀,用在标签库的文档中或者页面中插入自定义标签。所以,你可以使用除了诸如jsp,jspx,java,servlet,sun,sunw(它们都是在jsp白皮书中指定的保留字)之类的前缀。
7 m2 u" R. w6 f' p0 X, M6 puri属性满足了以上的第二个要求。为每个自定义行为找到对应的类。这个uri包含了一个字符串,容器用它来定位tld文件。在tld文件中可以找到标签库中所有标签处理类的名称
! [' k5 C3 p0 ^2. 当web应用程序启动时,容器从web-inf文件夹的目录结构的meta-inf搜索所有以.tld结尾的文件。也就是说它们会定位所有的tld文件。对于每个tld文件,容器会先获取标签库的uri,然后为每个tld文件和对应的uri创建映射关系。, w+ F: W) [4 I) W, W
在jsp页面中,我们仅需通过使用带有uri属性值的标签库指令来和具体的标签库匹配) d( f2 k' w; f' V
三、自定义jsp标签的处理过程:
' B8 c  o' J: P8 R# O1 ]: B! i1.在jsp中引入标签库:& `7 j7 F, g( {, u8 P
2.在jsp中使用标签库标签" y' n/ |! Y1 L; i! m
3.web容器根据第二个步骤中的prefix,获得第一个步骤中声明的taglib的uri属性值# _% |: x, @) N* Q& ?
4.web容器根据uri属性在web.xml找到对应的元素 5.从元素中获得对应的元素的值 6.web容器根据元素的值从web-inf/目录下找到对应的.tld文件 7.从.tld文件中找到与tagname对应的元素 8.凑元素中获得对应的元素的值 9.web容器根据元素的值创建相应的tag handle class的实例 10. web容器调用这个实例的dostarttag/doendtag方法完成相应的处理2 G2 b& y' e5 C- T  w5 h2 h4 D
四、创建和使用一个tag library的基本步骤:
, @$ M  [7 j) O; l$ n1.创建标签的处理类(tag handler class)
# C% E" O+ v! V9 A4 j: d2.创建标签库描述文件(tag library descrptor file)7 j: T8 I" m$ O! ?
3.在web.xml文件中配置元素 4.在jsp文件中引人标签库4 J" h/ Z( m6 P" c2 c
五、tagsupport类简介:1 F4 c3 l$ A+ k2 ]: c4 {
1.处理标签的类必须扩展javax.servlet.jsp.tagsupport.
- o2 s4 `; m$ S" r, K  G2.tagsupport类的主要属性:
' L. ~, w% n1 k- sa.parent属性:代表嵌套了当前标签的上层标签的处理类' n: i( M0 z7 B9 w* w- b. h
b.pagecontex属性:代表web应用中的javax.servlet.jsp.pagecontext对象
/ w+ I2 X2 G) y/ C3.jsp容器在调用dostarttag或者doendtag方法前,会先调用setpagecontext和setparent方法,设置pagecontext和parent。因此在标签处理类中可以直接访问pagecontext变量# B5 d2 l7 Q0 e" t' s
4.在tagsupport的构造方法中不能访问pagecontext成员变量,因为此时jsp容器还没有调用6 U3 i& y; g; ^- U! \; {
setpagecontext方法对pagecontext进行初始化
; V$ ]+ o' P& i4 f  u0 {, J六、tagsupport处理标签的方法:
, y) m8 N+ @# Z- c: ]) Q1.tagsupport类提供了两个处理标签的方法:
" M. X- \! t, B$ C5 O: C4 cpublic int dostarttag() throws jspexception" F9 v4 a6 K) J! [6 R1 t# P& f& d
public int doendtag() throws jspexception
, x$ F( ]" x& d2.dostarttag:但jsp容器遇到自定义标签的起始标志,就会调用dostarttag()方法。8 \& R2 l. X" f7 C  ]9 j9 l
dostarttag()方法返回一个整数值,用来决定程序的后续流程。
  [- Q$ L7 g9 V" B, Oa.tag.skip_body:表示?>…之间的内容被忽略
2 g+ |/ l; [5 j. `8 R$ Sb.tag.eval_body_include:表示标签之间的内容被正常执行5 |# ?! C% d& j: _$ f$ `" S
3.doendtag:但jsp容器遇到自定义标签的结束标志,就会调用doendtag()方法。doendtag()方法也返回一个整数值,用来决定程序后续流程。; |4 _9 d+ Y! y6 w( ~+ P
a.tag.skip_page:表示立刻停止执行网页,网页上未处理的静态内容和jsp程序均被忽略任何已有的输出内容立刻返回到客户的浏览器上。* p* G# u& X# u
b.tag_eval_page:表示按照正常的流程继续执行jsp网页
3 i0 z# y1 S/ v" ~$ L' y七、用户自定义的标签属性:3 k- t0 _7 ~3 J3 X& d4 }' [) q
如果在标签中还包含了自定义的属性,那么在标签处理类中应该将这个属性作为成员变量,并且分别提供设置和读取属性的方法。
5 V( H) W* U" W9 r, \0 U% N# Z八、创建标签处理类的步骤:7 g* N2 }. A' c: v
1.创建包含jsp网页静态文本的文件(即是要替换自定义jsp标签的文本)9 r4 U" `( d% c: S8 b
2.在web应用启动时装载静态文本6 [6 f- l; e* @  S
3.创建标签处理类/ H4 k2 W. D/ u9 |7 H2 q5 n5 B7 P# G
九、如何创建包含jsp网页静态文本的文件:
. c( T4 e1 o- f2 H' o1.使用java.util.properties类来存放要替换网页中自定义jsp标签的静态文本
. d) I" ]$ D6 v1 @- J6 S2.properties类代表了一系列属性的集合,其实例既可以被保存到流中,也可以从流中加载。这些文本以key/value的形式存放在web-inf目录下,例如key=value,在属性列表中这些key/value都是string类型的
; ^& X- N! F$ a& b1 V# B十、properties类的常用api:
% H4 ?0 K9 v, s1 a1.setproperty(string key, string value):调用hashtable类的put方法添加属性9 z3 Y/ e- k; v2 r$ o- X
2.getproperty(string key):获取属性列表中key对应的属性值) q3 S5 Q; g) J7 Z
3.load(inputstream in):从输入流对象inputstream中读取属性列表(properties list)7 T+ k8 z- w- l, Q/ S" \# z
4.store(outputstream out,string comment):使用适当的格式将属性列表的属性对写入输出流对象中,默认使用iso-88590-1编码格式,以行的方式处理输入。属性的key/value之间以”=、:”配对,以回车、换行分隔key/value配对
6 X0 K* j* U; u% m十一、servletcontext类的常用api:
0 f* B* Y) w+ n6 |: y1.getcontext(string uripath):返回服务器中uripath所代表的servletcontext对象# [; _  E' L/ o5 Y8 Z: R" c. ^
2.getinitparameter(string name):返回servletconfig对象中name参数的值
0 O* B5 O+ N8 D- V6 m+ f2 s: M3.getminetype(string file):返回file参数代表的文件的mime类型
! Y2 j* A- N* \6 Q4.getrequestdispatcher(string path):返回path代表的requestdispacher对象: Z0 V5 s$ |) q$ \3 X
5.getresourceasstream(string path):以输入流的形式返回path对应的资源,在输入留中对象可以为任意形式的数据,path参数必须以“/”开始且相对于context root
! O; X, j0 ?$ h* q3 w0 F" V! p3 H十二、如何使用servletcontxt读取并保存属性文件:9 P- I1 c  I$ ~, a5 h
1.创建java.util.properties类对象
% M' Z7 K/ d1 q2.获取servletcontext对象, ~  @" W6 M& b  T' A
3.将属性文件以输入流的形式读入到某个输入流对象中' Y' X! E, a; t5 P" e
4.将输入流对象加载到properties对象中
$ y. [7 p8 W, I+ |& `5.将properties对象保存到servletcontext对象中
' ^: V$ R  a3 [4 h十三、如何在web应用启动时装载静态文本:! p1 O) t0 `! X6 u4 ~+ r
1.创建继承了httpservlet类的子类,在web.xml中配置这servlet时设置load-on-startup属性:
5 K4 _6 J. k. r/ E& N: Hsomeclass5 O, ^9 v7 O# a4 S. x  q6 j+ {! O/ m4 c
somepackage.someclass1
' r+ I4 F& @, l) @. U2.在这个servlet的init()方法中创建java.util.properties类
8 z5 ?; Z6 z" E  m3.获取当前web应用的servletcontext对象# {% c- W1 x  k
4.将web-inf目录下的属性文件读入到输入流inputstream中:$ ]+ ~2 W% A+ f' m* H
inputstream in = context.getresourceasstring(web-inf/someproperties.properties);
: N  H, o7 a/ z- ]9 K5.将输入流加载到属性对象中8 S5 f, c- c$ F/ K$ o
ps.load(in);
) z6 G; j8 P3 A" \6.将属性对象保存到上
7 T2 x" a" t" n# |% h5 gcontext.setattribute(attributename,ps);
7 y6 H5 x, l2 b1 r/ c5 |十四、如何创建标签处理类:
( i: D& r; R$ Q8 F& E1.引入必需的资源:5 b7 ^: a( L0 |& A* S$ s
import javax.servlet.jsp.*;, e4 @3 y& c, \( T+ M# o
import javax.servlet.http.*;
1 _. |5 u+ b( t' M: _: C" timport java.util.*;+ |9 }% m) s! t: @6 I  R# t9 W
import java.io.*;  X, v! b, d2 ^9 ]+ o& E" J
2.继承tagsupport类并覆盖dostarttag()/doendtag()方法
: i: J) ^& @4 I3 `" ~0 `$ H8 M3.从servletcontext对象中获取java.util.properties对象/ L4 J9 C" R2 S. @/ w# L0 n  m
4.从properties对象中获取key对应的属性值& K5 W. V* B7 e  @
5.对获取的属性进行相应的处理并输出结果% K2 P7 ]: @  r+ y% m+ n2 R( T
十五、创建标签库描述文件(tag library descriptor):, g1 \, R1 ?$ J0 ?- v
1.标签库描述文件,简称tld,采用xml文件格式,定义了用户的标签库。tld文件中的元素可以分成3类:( k) W6 b; C7 f- z+ c+ j9 L" \
a.:标签库元素# H) E8 L9 h% A
b.:标签元素# b+ k0 r: q3 W; c& g
c.:标签属性元素
- J8 f& i% f- v) }# X$ a! d2 y2.标签库元素用来设定标签库的相关信息,它的常用属性有:
2 r4 @( ]' n5 T0 F% |" Pa.shortname: 指定tag library默认的前缀名(prefix)  y) V: t! {) v! s8 H
b.uri: 设定tag library的惟一访问表示符
7 L9 W# Q5 A+ k- N* p4 W3.标签元素用来定义一个标签,它的常见属性有:9 L! [9 t& H6 o5 r2 c$ F  Y+ A1 P+ R+ B
a.name: 设定tag的名字
% e) o! q- T& F4 M/ Y7 O: }b.tagclass: 设定tag的处理类. Z$ S. K; C1 M" V+ P* G
c.bodycontent: 设定标签的主体(body)内容
! u; z6 ?2 H2 ~8 B# |' F1).empty:表示标签中没有body
) a0 q: E5 s7 v6 U2).jsp:表示标签的body中可以加入jsp程序代码
) a  r6 D# j5 }4 ]* p& Y0 P& `3).tagdependent:表示标签中的内容由标签自己去处理, S4 ?. t8 H5 D7 U! X( k* g
4.标签属性元素用来定义标签的属性,它的常见属性有:
0 K3 z: d* N6 H3 h% wa.name:属性名称
, _& k) [) X7 K: i4 J" v1 W* ]+ Kb.required:属性是否必需的,默认为false" W2 Z, F- j6 L2 u% M* v% ~! s% Y
c.rtexprvalue:属性值是否可以为request-time表达式,也就是类似于< %=…% >的表达式" w$ v  `+ u+ n* r8 R0 J# z# M% E
十六、在web应用中使用标签:
$ ^8 \/ X! f+ s) @) d1.如果web应用中用到了自定义jsp标签,则必须在web.xml文件中加入元素,它用于声明所引用的标签所在的标签库4 b/ L5 m# h2 A3 a$ L! R  M. }3 |
/sometaglib) }# i! ^! U" d% @0 ]
/web-inf/sometld.tld
6 G* F2 t" f% {) M2.:设定tag library的惟一标示符,在web应用中将根据它来引用tag libray
7 c& a9 T3 ]  V- N9 |3.:指定和tag library对应的tld文件的位置& r2 M% Q, f2 C1 l' J  A
4.在jsp文件中需要加入
; k+ o* z; R7 _2 q$ l( e- e5.prefix表示在jsp网页中引用这个标签库的标签时的前缀,uri用来指定tag library的标识符,它必须和web.xml中的属性保持一致。
- E1 u7 B& G2 i8 T: x9 U7 z/ e' p% \$ E% C/ w3 ~, S
更多网页制作信息请查看: 网页制作

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