返回列表 发新帖

jsp的自定义标签教程

589.7k 10
swmozowtfl 发表于 2015-7-26 20:47:02|湖北 | 查看全部 阅读模式
一、基本概念:- Q, |# P% e0 u  C/ n' n
1.标签(tag):3 n/ Y6 N' @' [
标签是一种xml元素,通过标签可以使jsp网页变得简洁并且易于维护,还可以方便地实现同一个jsp文件支持多种语言版本。由于标签是xml元素,所以它的名称和属性都是大小写敏感的& z  i& l2 Y5 `/ O4 V) s) H) f3 }
2.标签库(tag library):
. U2 O* t  q- [. ]由一系列功能相似、逻辑上互相联系的标签构成的集合称为标签库。5 w* o% z1 z, s- P* i
3.标签库描述文件(tag library descriptor):5 Q8 e5 S+ I$ M4 h! |& p
标签库描述文件是一个xml文件,这个文件提供了标签库中类和jsp中对标签引用的映射关系。它是一个配置文件,和web.xml是类似的。8 N8 X: L0 w2 p2 t3 @
4.标签处理类(tag handle class):( r, R# D+ d  L$ O
标签处理类是一个java类,这个类继承了tagsupport或者扩展了simpletag接口,通过这个类可以实现自定义jsp标签的具体功能
9 S  }. y' }- c. ]二、自定义jsp标签的格式:
2 ]  }6 P& C  f. T% E% W$ `1.
  N: ]4 p; E. H4 S3 }/ U为了使到jsp容器能够使用标签库中的自定义行为,必须满足以下两个条件:& e9 x1 `7 a2 G& q
1)从一个指定的标签库中识别出代表这种自定义行为的标签. T2 S4 {5 G& V2 }3 N
2)找到实现这些自定义行为的具体类
) W1 V2 H. S! C2 a: Z2 y+ k6 U第一个必需条件-找出一个自定义行为属于那个标签库-是由标签指令的前缀(taglib directive's prefix)属性完成,所以在同一个页面中使用相同前缀的元素都属于这个标签库。每个标签库都定义了一个默认的前缀,用在标签库的文档中或者页面中插入自定义标签。所以,你可以使用除了诸如jsp,jspx,java,servlet,sun,sunw(它们都是在jsp白皮书中指定的保留字)之类的前缀。
* n* _9 x0 ?! ~uri属性满足了以上的第二个要求。为每个自定义行为找到对应的类。这个uri包含了一个字符串,容器用它来定位tld文件。在tld文件中可以找到标签库中所有标签处理类的名称
) ^* ?( H9 V2 x) W2. 当web应用程序启动时,容器从web-inf文件夹的目录结构的meta-inf搜索所有以.tld结尾的文件。也就是说它们会定位所有的tld文件。对于每个tld文件,容器会先获取标签库的uri,然后为每个tld文件和对应的uri创建映射关系。" S; `( u2 M2 [9 q/ |
在jsp页面中,我们仅需通过使用带有uri属性值的标签库指令来和具体的标签库匹配
) g& B8 o3 U! l三、自定义jsp标签的处理过程:
7 o* @$ G3 j0 g1.在jsp中引入标签库:
: ~' Y9 `, {6 p  I& Q" N) x2.在jsp中使用标签库标签
4 h: X" l/ _% f# b4 c! {3.web容器根据第二个步骤中的prefix,获得第一个步骤中声明的taglib的uri属性值
9 ?! S. o  H% j9 B1 h! \, [4.web容器根据uri属性在web.xml找到对应的元素 5.从元素中获得对应的元素的值 6.web容器根据元素的值从web-inf/目录下找到对应的.tld文件 7.从.tld文件中找到与tagname对应的元素 8.凑元素中获得对应的元素的值 9.web容器根据元素的值创建相应的tag handle class的实例 10. web容器调用这个实例的dostarttag/doendtag方法完成相应的处理
# g4 H( [2 {# D$ Z5 q- M四、创建和使用一个tag library的基本步骤:
9 G. c3 z# N( {) `1.创建标签的处理类(tag handler class)
, n) K7 A! S$ G. [7 G# S( v6 p8 u! C2.创建标签库描述文件(tag library descrptor file)5 [. i' n3 p& a5 F
3.在web.xml文件中配置元素 4.在jsp文件中引人标签库* A0 L2 E5 c1 f5 Q
五、tagsupport类简介:7 ]) y: a7 }' z' ?0 Y2 Q
1.处理标签的类必须扩展javax.servlet.jsp.tagsupport.
5 Y5 g9 j& {. A; N; l, |3 ~2.tagsupport类的主要属性:
: n! R0 H7 r+ {- s8 S( z8 ma.parent属性:代表嵌套了当前标签的上层标签的处理类
0 r3 D* r6 ]  hb.pagecontex属性:代表web应用中的javax.servlet.jsp.pagecontext对象8 \/ f7 j! w/ Y6 I( ]
3.jsp容器在调用dostarttag或者doendtag方法前,会先调用setpagecontext和setparent方法,设置pagecontext和parent。因此在标签处理类中可以直接访问pagecontext变量1 G8 r. |  w" T" c
4.在tagsupport的构造方法中不能访问pagecontext成员变量,因为此时jsp容器还没有调用
1 O' T; _* V. V/ H# t! esetpagecontext方法对pagecontext进行初始化4 E- p9 x# ~& L5 d
六、tagsupport处理标签的方法:4 _( M; O, @8 k& z2 K8 Z0 [7 d
1.tagsupport类提供了两个处理标签的方法:
; d6 L2 X: x0 ~public int dostarttag() throws jspexception
6 ^" D* [9 W6 Q: h7 \  ~0 Bpublic int doendtag() throws jspexception! h  `" P, F1 I& U  d
2.dostarttag:但jsp容器遇到自定义标签的起始标志,就会调用dostarttag()方法。
6 t3 V; ~# S2 v/ C( r; ldostarttag()方法返回一个整数值,用来决定程序的后续流程。6 W# N/ }3 U- M8 [
a.tag.skip_body:表示?>…之间的内容被忽略: C7 V3 H: K7 |$ ^" _' {% }  Q& p
b.tag.eval_body_include:表示标签之间的内容被正常执行5 z* s% `; }$ l  s
3.doendtag:但jsp容器遇到自定义标签的结束标志,就会调用doendtag()方法。doendtag()方法也返回一个整数值,用来决定程序后续流程。
( {! s# a1 ^' H/ g4 o0 d+ ka.tag.skip_page:表示立刻停止执行网页,网页上未处理的静态内容和jsp程序均被忽略任何已有的输出内容立刻返回到客户的浏览器上。
0 Y8 a* e- t1 x3 B9 B: g! Cb.tag_eval_page:表示按照正常的流程继续执行jsp网页
" ~+ t4 U" n- ?  c/ t4 z) D七、用户自定义的标签属性:+ y  X2 P8 ?! ?; z4 L& O
如果在标签中还包含了自定义的属性,那么在标签处理类中应该将这个属性作为成员变量,并且分别提供设置和读取属性的方法。/ ^/ W7 @9 [" Y" b" G6 V
八、创建标签处理类的步骤:3 O) n, P, k$ N4 h
1.创建包含jsp网页静态文本的文件(即是要替换自定义jsp标签的文本)
3 t0 _( Q5 h  @2 E3 T1 u2.在web应用启动时装载静态文本
) i( s4 E: y$ L" _3.创建标签处理类6 V- x" O8 p7 o5 ?$ Z; \; N
九、如何创建包含jsp网页静态文本的文件:" A7 u0 c6 V. W6 V
1.使用java.util.properties类来存放要替换网页中自定义jsp标签的静态文本
6 ^3 _- c, l* K* ?, j2.properties类代表了一系列属性的集合,其实例既可以被保存到流中,也可以从流中加载。这些文本以key/value的形式存放在web-inf目录下,例如key=value,在属性列表中这些key/value都是string类型的
: C6 I- H' }& `/ r0 h7 }% i8 w十、properties类的常用api:) C( L2 u, ]- t7 M
1.setproperty(string key, string value):调用hashtable类的put方法添加属性" k" |* o. L' H; }9 L, I
2.getproperty(string key):获取属性列表中key对应的属性值
& H: \2 v; ~' l# ^2 }; o3.load(inputstream in):从输入流对象inputstream中读取属性列表(properties list)7 M0 o( t" v5 G8 S
4.store(outputstream out,string comment):使用适当的格式将属性列表的属性对写入输出流对象中,默认使用iso-88590-1编码格式,以行的方式处理输入。属性的key/value之间以”=、:”配对,以回车、换行分隔key/value配对
$ p# r! M. A& U十一、servletcontext类的常用api:# _; W  t8 E. A( E
1.getcontext(string uripath):返回服务器中uripath所代表的servletcontext对象- p1 U- N6 [# g3 \0 _
2.getinitparameter(string name):返回servletconfig对象中name参数的值
3 J+ w+ f4 z& I) n) Q5 D6 T3.getminetype(string file):返回file参数代表的文件的mime类型
/ a3 b4 I9 N4 {% K9 I8 u5 H( X, A4.getrequestdispatcher(string path):返回path代表的requestdispacher对象: l/ S& x+ I/ B. x7 U
5.getresourceasstream(string path):以输入流的形式返回path对应的资源,在输入留中对象可以为任意形式的数据,path参数必须以“/”开始且相对于context root
5 s  ]  n" m  r7 r* K8 j十二、如何使用servletcontxt读取并保存属性文件:- ?! n2 X+ V( O9 f) I2 r
1.创建java.util.properties类对象
( N6 [1 |8 T2 k; X8 |& y2.获取servletcontext对象
/ r0 D1 d: a9 Z2 M3.将属性文件以输入流的形式读入到某个输入流对象中' {* W, N! m. h8 Q
4.将输入流对象加载到properties对象中
" o: }, _7 a( S- W* m5.将properties对象保存到servletcontext对象中
! V) b, N1 w8 a十三、如何在web应用启动时装载静态文本:
5 w5 e# E3 J4 t, C1.创建继承了httpservlet类的子类,在web.xml中配置这servlet时设置load-on-startup属性:: B8 C/ z/ {0 [! D+ h/ D# t: U
someclass8 E; G  c6 |# e0 |
somepackage.someclass1% @5 e5 C( o) a* T  ]$ T
2.在这个servlet的init()方法中创建java.util.properties类) Z+ Z4 F  v, o: U3 e
3.获取当前web应用的servletcontext对象* D2 F) O! U  y9 k) B+ K: l
4.将web-inf目录下的属性文件读入到输入流inputstream中:+ }6 z7 @9 v5 C6 r4 J
inputstream in = context.getresourceasstring(web-inf/someproperties.properties);
% j: l2 @0 U% r9 R! n4 d5.将输入流加载到属性对象中4 g4 v) R! @7 U+ a2 y
ps.load(in);
4 Q! k0 a' d; T9 F6.将属性对象保存到上: \6 s0 w4 _3 J* v7 D
context.setattribute(attributename,ps);
3 I& d3 O) N! i( x/ [十四、如何创建标签处理类:
% |8 r9 e, B: X" G1.引入必需的资源:. h$ K! q: [! _2 a( T, Y! r& S% W$ J/ g
import javax.servlet.jsp.*;/ ?- u) r5 b5 l6 I, N
import javax.servlet.http.*;+ x5 i& L7 e  v$ y9 p! k
import java.util.*;
* l. ^/ [6 b. j6 l7 H% q5 iimport java.io.*;8 q5 i* o" z* A( W; T( \
2.继承tagsupport类并覆盖dostarttag()/doendtag()方法3 Y& Z" T5 q# Z9 a. H8 B  X0 G
3.从servletcontext对象中获取java.util.properties对象; D) d. u. f8 e8 H1 P* X# {
4.从properties对象中获取key对应的属性值
9 W1 H) f1 r, X% h! H0 Q! Y! K* @5.对获取的属性进行相应的处理并输出结果
# n. f8 ~" @1 v' |, ^十五、创建标签库描述文件(tag library descriptor):1 p' O7 I7 ~% v. t8 v
1.标签库描述文件,简称tld,采用xml文件格式,定义了用户的标签库。tld文件中的元素可以分成3类:; g# S2 u# o2 g# r, c* `
a.:标签库元素
0 N& D* ?& y8 X/ n  ]0 q: Xb.:标签元素
4 D2 d& i' B  E4 x. _c.:标签属性元素$ ^( }( M# S5 n5 A; M% C; ?
2.标签库元素用来设定标签库的相关信息,它的常用属性有:5 J  c, G$ e8 e& V, g
a.shortname: 指定tag library默认的前缀名(prefix), Y4 V6 [! r" R; l' V. v) ]( v
b.uri: 设定tag library的惟一访问表示符
2 W* C: W8 M+ p; B. W3.标签元素用来定义一个标签,它的常见属性有:
& ^* D# n! I' b% w0 n3 h# Da.name: 设定tag的名字
7 ]+ Y- t5 r3 z& V% C- g5 |b.tagclass: 设定tag的处理类
% `& z2 ~/ m; o( z4 Y5 t! J# Oc.bodycontent: 设定标签的主体(body)内容
  O4 q/ L- |& w1).empty:表示标签中没有body" o8 q7 A% [2 f1 |, V4 d* V
2).jsp:表示标签的body中可以加入jsp程序代码# m& q1 n8 p# c. ]
3).tagdependent:表示标签中的内容由标签自己去处理
. b0 S2 z1 g, w0 Q5 b+ Y' Q- V, P4.标签属性元素用来定义标签的属性,它的常见属性有:! V8 [4 Y: L2 _
a.name:属性名称  @" i* N. D5 {7 S& L
b.required:属性是否必需的,默认为false
' n7 J! X5 c1 ^c.rtexprvalue:属性值是否可以为request-time表达式,也就是类似于< %=…% >的表达式
( q! L. D5 ^' X# P十六、在web应用中使用标签:
1 U; p) M0 L1 A# z7 V1.如果web应用中用到了自定义jsp标签,则必须在web.xml文件中加入元素,它用于声明所引用的标签所在的标签库
9 k+ Q8 u4 m% r- `/sometaglib* j* u* w! ]1 {8 L/ p, x- c5 b
/web-inf/sometld.tld
2 S) ?. E2 k( T# D& C2.:设定tag library的惟一标示符,在web应用中将根据它来引用tag libray  C  E. _: F. c7 T
3.:指定和tag library对应的tld文件的位置
' e  F, w2 W( n8 G6 L; `  [  l0 f4.在jsp文件中需要加入6 w7 P+ |/ i' E$ J- e1 R  k
5.prefix表示在jsp网页中引用这个标签库的标签时的前缀,uri用来指定tag library的标识符,它必须和web.xml中的属性保持一致。
- B* _8 H# T- T- R. o# ]
2 s6 u' t" \7 @( D更多网页制作信息请查看: 网页制作

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