返回列表 发新帖

jsp的自定义标签教程

589.9k 10
swmozowtfl 发表于 2015-7-26 20:47:02|湖北 | 查看全部 阅读模式
一、基本概念:% U6 S' E( ?3 b8 t: B" ?
1.标签(tag):; {- |0 P7 ?0 Q/ L. |9 x
标签是一种xml元素,通过标签可以使jsp网页变得简洁并且易于维护,还可以方便地实现同一个jsp文件支持多种语言版本。由于标签是xml元素,所以它的名称和属性都是大小写敏感的5 n2 i1 y: C5 F: N/ H
2.标签库(tag library):+ Y" Z! f) Y  a) \- W
由一系列功能相似、逻辑上互相联系的标签构成的集合称为标签库。
! P# Q/ R1 F0 j- X- w, m# U7 n! \3.标签库描述文件(tag library descriptor):2 Z! N/ R( [# `8 R
标签库描述文件是一个xml文件,这个文件提供了标签库中类和jsp中对标签引用的映射关系。它是一个配置文件,和web.xml是类似的。2 F4 p5 |4 C- C$ m7 Q# V5 z8 \, _4 A
4.标签处理类(tag handle class):) t' ~% F1 R8 W
标签处理类是一个java类,这个类继承了tagsupport或者扩展了simpletag接口,通过这个类可以实现自定义jsp标签的具体功能
  V/ X; h4 P- W+ @" ?4 @二、自定义jsp标签的格式:: U2 e: K* H) K2 A8 r; G
1.
3 T8 Y- w! N. E" F8 ^为了使到jsp容器能够使用标签库中的自定义行为,必须满足以下两个条件:$ T! ~0 s; J6 Q' R7 i8 U
1)从一个指定的标签库中识别出代表这种自定义行为的标签# ?$ ?9 l) c  E8 U
2)找到实现这些自定义行为的具体类/ t* A% x( Y3 _# U  W/ n" _& S
第一个必需条件-找出一个自定义行为属于那个标签库-是由标签指令的前缀(taglib directive's prefix)属性完成,所以在同一个页面中使用相同前缀的元素都属于这个标签库。每个标签库都定义了一个默认的前缀,用在标签库的文档中或者页面中插入自定义标签。所以,你可以使用除了诸如jsp,jspx,java,servlet,sun,sunw(它们都是在jsp白皮书中指定的保留字)之类的前缀。/ `. l+ L" Q( b+ T) |. A
uri属性满足了以上的第二个要求。为每个自定义行为找到对应的类。这个uri包含了一个字符串,容器用它来定位tld文件。在tld文件中可以找到标签库中所有标签处理类的名称. C" V4 {1 R+ x* [1 V2 p
2. 当web应用程序启动时,容器从web-inf文件夹的目录结构的meta-inf搜索所有以.tld结尾的文件。也就是说它们会定位所有的tld文件。对于每个tld文件,容器会先获取标签库的uri,然后为每个tld文件和对应的uri创建映射关系。
8 E' k  O: [' P) c1 g在jsp页面中,我们仅需通过使用带有uri属性值的标签库指令来和具体的标签库匹配6 R5 ^: K  I7 ~. T/ d0 i
三、自定义jsp标签的处理过程:
0 R% d$ d, \4 G0 @- f" a% S3 o1 z1.在jsp中引入标签库:; z$ C1 X8 |9 X# R/ f2 e
2.在jsp中使用标签库标签
% P% k( f0 A9 E' `3.web容器根据第二个步骤中的prefix,获得第一个步骤中声明的taglib的uri属性值
. n" e& Z* D/ a/ N$ f" m& X9 F4.web容器根据uri属性在web.xml找到对应的元素 5.从元素中获得对应的元素的值 6.web容器根据元素的值从web-inf/目录下找到对应的.tld文件 7.从.tld文件中找到与tagname对应的元素 8.凑元素中获得对应的元素的值 9.web容器根据元素的值创建相应的tag handle class的实例 10. web容器调用这个实例的dostarttag/doendtag方法完成相应的处理9 p9 H6 z0 o- f: f, Z. O( R! c
四、创建和使用一个tag library的基本步骤:" n2 E( T; D/ U% e  O% }- n
1.创建标签的处理类(tag handler class)
% N. B) C0 u  k# L2.创建标签库描述文件(tag library descrptor file)
0 y: N- ~* e$ [3.在web.xml文件中配置元素 4.在jsp文件中引人标签库
3 l5 N, d, U4 A+ r8 X五、tagsupport类简介:. {  P: D; O  F/ F' n4 {$ w
1.处理标签的类必须扩展javax.servlet.jsp.tagsupport.9 s$ a( c  u6 {/ g# @% B
2.tagsupport类的主要属性:
. X$ |! }7 @: }. o- g+ K" Ta.parent属性:代表嵌套了当前标签的上层标签的处理类
6 r5 X% G5 Y# K2 v0 X# j6 `b.pagecontex属性:代表web应用中的javax.servlet.jsp.pagecontext对象& R1 N! M/ m8 a' \- |$ _* Y
3.jsp容器在调用dostarttag或者doendtag方法前,会先调用setpagecontext和setparent方法,设置pagecontext和parent。因此在标签处理类中可以直接访问pagecontext变量
$ g/ P/ I1 B* I! Q; F4.在tagsupport的构造方法中不能访问pagecontext成员变量,因为此时jsp容器还没有调用+ y; _; m9 |* o) H1 @0 W) N, N! A
setpagecontext方法对pagecontext进行初始化! }5 X4 {+ f2 Q6 w& d. S& e
六、tagsupport处理标签的方法:
1 D* P1 }  E2 l, g1.tagsupport类提供了两个处理标签的方法:  n+ f6 D* X" S
public int dostarttag() throws jspexception" _( i$ M4 D% L& i
public int doendtag() throws jspexception
, p8 ?; D. }- I8 Y$ T- ~  ?' @2.dostarttag:但jsp容器遇到自定义标签的起始标志,就会调用dostarttag()方法。
, N2 j( e$ [7 c+ adostarttag()方法返回一个整数值,用来决定程序的后续流程。
/ x- E. M4 ]3 s/ T9 t1 |a.tag.skip_body:表示?>…之间的内容被忽略
$ |! B" ?. G( X$ R, T- B$ S' Y8 q6 Q3 Z: Pb.tag.eval_body_include:表示标签之间的内容被正常执行
& |) v1 ~3 Y! y" S$ d7 y3.doendtag:但jsp容器遇到自定义标签的结束标志,就会调用doendtag()方法。doendtag()方法也返回一个整数值,用来决定程序后续流程。
" }5 Q9 y. w8 u! G! ]* @7 Ja.tag.skip_page:表示立刻停止执行网页,网页上未处理的静态内容和jsp程序均被忽略任何已有的输出内容立刻返回到客户的浏览器上。( z- ^; k3 ^; J
b.tag_eval_page:表示按照正常的流程继续执行jsp网页" X: W; s4 D4 ~7 v# l$ M# A, K
七、用户自定义的标签属性:' Y9 m4 F% D# K. {/ i4 r
如果在标签中还包含了自定义的属性,那么在标签处理类中应该将这个属性作为成员变量,并且分别提供设置和读取属性的方法。7 ]9 f, V( g( m1 r( a* P
八、创建标签处理类的步骤:: X8 {" d# E( W; a" y1 a* A5 D; l( w1 P
1.创建包含jsp网页静态文本的文件(即是要替换自定义jsp标签的文本)7 t6 a, J. I! Z# C
2.在web应用启动时装载静态文本
6 l9 x: U2 i& j# A! x; ?3.创建标签处理类# w9 j: @: o5 F# M
九、如何创建包含jsp网页静态文本的文件:
4 ~* r( D' o2 F2 g0 j9 Z1.使用java.util.properties类来存放要替换网页中自定义jsp标签的静态文本
0 t7 P2 c6 [$ k; O' X' D2.properties类代表了一系列属性的集合,其实例既可以被保存到流中,也可以从流中加载。这些文本以key/value的形式存放在web-inf目录下,例如key=value,在属性列表中这些key/value都是string类型的
- M- F8 q7 h/ w/ r十、properties类的常用api:( K4 L2 ]* Q( b  W5 U6 ^7 P
1.setproperty(string key, string value):调用hashtable类的put方法添加属性7 Z- i( O5 M8 Q* B9 ]5 D( s& a
2.getproperty(string key):获取属性列表中key对应的属性值/ ]6 f% O* n% @  O3 J8 p% j
3.load(inputstream in):从输入流对象inputstream中读取属性列表(properties list)" {  e7 V8 ^- V$ I9 h
4.store(outputstream out,string comment):使用适当的格式将属性列表的属性对写入输出流对象中,默认使用iso-88590-1编码格式,以行的方式处理输入。属性的key/value之间以”=、:”配对,以回车、换行分隔key/value配对
6 \. _9 b1 i' d( [& U; x十一、servletcontext类的常用api:
* P5 ^+ {5 y3 G4 i3 s, l7 x0 C1.getcontext(string uripath):返回服务器中uripath所代表的servletcontext对象' Y  F$ B  T5 j8 v+ U0 `5 o% O
2.getinitparameter(string name):返回servletconfig对象中name参数的值
7 i4 Q( d  v" J4 E) R1 B* [" y" l* _9 Z3.getminetype(string file):返回file参数代表的文件的mime类型
+ b) Y. n1 T# J6 \2 F1 ?3 Y; ]- @4.getrequestdispatcher(string path):返回path代表的requestdispacher对象
4 A3 ]) k9 f1 ?/ `: Q# Q5.getresourceasstream(string path):以输入流的形式返回path对应的资源,在输入留中对象可以为任意形式的数据,path参数必须以“/”开始且相对于context root4 P1 k% g& p# k: U/ u3 T
十二、如何使用servletcontxt读取并保存属性文件:
* a; f) J( |  W, v, h& e& g1.创建java.util.properties类对象5 }& F2 m  P+ e' G
2.获取servletcontext对象
' p; ]9 z' Q; z4 b3 j6 X; F3.将属性文件以输入流的形式读入到某个输入流对象中
6 C+ U( R' ?" `2 n" m4.将输入流对象加载到properties对象中; Q/ n& U+ N, f5 d/ l
5.将properties对象保存到servletcontext对象中
# O0 M( u; r" m3 a( q; V+ i十三、如何在web应用启动时装载静态文本:
( |. {6 ], u9 ]' p1.创建继承了httpservlet类的子类,在web.xml中配置这servlet时设置load-on-startup属性:
+ g8 d/ L* s, U/ Lsomeclass9 X. Q: M: s: O$ V
somepackage.someclass1. H1 I4 P. z% S) ]* @. J
2.在这个servlet的init()方法中创建java.util.properties类
2 `- V/ Z% o, S" X# D5 \3.获取当前web应用的servletcontext对象" {' `* U' O; h5 T7 p
4.将web-inf目录下的属性文件读入到输入流inputstream中:
; W& u& m, ]) p& P, Zinputstream in = context.getresourceasstring(web-inf/someproperties.properties);
0 `/ O. z0 O) D9 [) n5.将输入流加载到属性对象中! s8 D" h/ Q1 t# @
ps.load(in);! L. L5 s/ q" [* v8 T' S* p- H  E
6.将属性对象保存到上% l  m) Q. U* d# L
context.setattribute(attributename,ps);$ r* a9 W4 k* q, }- @
十四、如何创建标签处理类:; b2 n: f9 D8 K8 B' I
1.引入必需的资源:( {+ Q# n+ i! ]& ?  {
import javax.servlet.jsp.*;
# r4 s' _* z0 w7 t4 d/ B- wimport javax.servlet.http.*;
' W3 B- Y( c+ A7 Zimport java.util.*;' n2 w% V" e. ~: r/ f) O8 X
import java.io.*;8 r) _/ `9 k/ c+ L8 _9 ^5 [8 J
2.继承tagsupport类并覆盖dostarttag()/doendtag()方法
/ i; }% `  _2 |. j# z- V5 z3.从servletcontext对象中获取java.util.properties对象) p- K3 t$ Q2 B
4.从properties对象中获取key对应的属性值, U* t+ _7 Z7 l+ V) Y2 r! o3 P! [  @
5.对获取的属性进行相应的处理并输出结果- P7 q$ x- `! {* d, v( `5 R+ Q
十五、创建标签库描述文件(tag library descriptor):
$ i( O5 i0 a" O3 x& `( @5 ]- a  T9 I1.标签库描述文件,简称tld,采用xml文件格式,定义了用户的标签库。tld文件中的元素可以分成3类:
! A9 ^  O. K# _$ M$ b3 m, T2 x/ l4 Wa.:标签库元素; Z) p* j6 n! q
b.:标签元素
* p  f# }! p0 p% Yc.:标签属性元素8 L& }. ?1 R( v: p2 {1 h$ ]
2.标签库元素用来设定标签库的相关信息,它的常用属性有:, m$ u# Z# @8 X" C& X- f. ?0 _
a.shortname: 指定tag library默认的前缀名(prefix)* Z+ I, a2 U( L. c
b.uri: 设定tag library的惟一访问表示符0 S( q1 W& \" l% N5 g( {9 I
3.标签元素用来定义一个标签,它的常见属性有:* X7 m+ m5 `9 E% n- B
a.name: 设定tag的名字& }' Y/ E( |4 A. T& r7 _4 q
b.tagclass: 设定tag的处理类
# h& }6 e( L. p7 Tc.bodycontent: 设定标签的主体(body)内容
& p  ?" u( l; N0 f1).empty:表示标签中没有body
, Y" ~: W8 S, \2).jsp:表示标签的body中可以加入jsp程序代码9 F1 U3 T; m  C7 E: T
3).tagdependent:表示标签中的内容由标签自己去处理
* f& S* I  e5 r2 R+ D/ _' k4.标签属性元素用来定义标签的属性,它的常见属性有:( Q7 r% ]) `1 h) }4 |5 _
a.name:属性名称
3 d! W9 p( l* J8 q+ Q! Sb.required:属性是否必需的,默认为false3 x& l- R. Q; L2 T5 R
c.rtexprvalue:属性值是否可以为request-time表达式,也就是类似于< %=…% >的表达式
; j7 {. v2 j# R1 I; f8 z/ z十六、在web应用中使用标签:) d9 P/ K& b1 [+ N# y. P5 ^6 c" q
1.如果web应用中用到了自定义jsp标签,则必须在web.xml文件中加入元素,它用于声明所引用的标签所在的标签库
! ]3 L* Z& n, F3 |, K4 O6 |/sometaglib$ c7 k- O2 v( Y' e+ n# v/ J% W
/web-inf/sometld.tld" Q8 M- L0 T4 P. U1 O/ |
2.:设定tag library的惟一标示符,在web应用中将根据它来引用tag libray
6 _1 k) q1 e/ z# k3.:指定和tag library对应的tld文件的位置  [. w& |+ a1 [) ~) n5 u( {
4.在jsp文件中需要加入9 L, N. C, C) C) p, @: T2 B
5.prefix表示在jsp网页中引用这个标签库的标签时的前缀,uri用来指定tag library的标识符,它必须和web.xml中的属性保持一致。
: O# S4 p; p+ i6 }+ @9 D9 y! G  j3 V$ n& y5 p
更多网页制作信息请查看: 网页制作

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