返回列表 发新帖

jsp的自定义标签教程

589.6k 10
swmozowtfl 发表于 2015-7-26 20:47:02|湖北 | 查看全部 阅读模式
一、基本概念:4 V1 V' g4 G( w8 ?* g
1.标签(tag):
1 Z$ [0 t8 s2 V5 k; I( u标签是一种xml元素,通过标签可以使jsp网页变得简洁并且易于维护,还可以方便地实现同一个jsp文件支持多种语言版本。由于标签是xml元素,所以它的名称和属性都是大小写敏感的! z$ h$ F2 F' Q  ?$ A3 o
2.标签库(tag library):
3 K4 [, O3 Y; `' K- v# J, P, M  c. J7 _由一系列功能相似、逻辑上互相联系的标签构成的集合称为标签库。" q/ M/ S$ h8 s1 i9 o
3.标签库描述文件(tag library descriptor):
8 _2 C1 q% {- |标签库描述文件是一个xml文件,这个文件提供了标签库中类和jsp中对标签引用的映射关系。它是一个配置文件,和web.xml是类似的。
! R( N/ \! Y, x+ s% h4.标签处理类(tag handle class):6 P1 I8 O' q0 P3 j
标签处理类是一个java类,这个类继承了tagsupport或者扩展了simpletag接口,通过这个类可以实现自定义jsp标签的具体功能! m( l( a5 u! U6 A4 a8 l( t
二、自定义jsp标签的格式:
$ B3 M7 Y* E- j( p1.0 e# F$ \& x, u
为了使到jsp容器能够使用标签库中的自定义行为,必须满足以下两个条件:
2 w$ m+ c0 t/ C4 ~9 l# `1)从一个指定的标签库中识别出代表这种自定义行为的标签, \" E, y3 k3 O! R" g" Z3 I) ~8 @
2)找到实现这些自定义行为的具体类3 d% ?1 V# E* v  f2 o0 f, E
第一个必需条件-找出一个自定义行为属于那个标签库-是由标签指令的前缀(taglib directive's prefix)属性完成,所以在同一个页面中使用相同前缀的元素都属于这个标签库。每个标签库都定义了一个默认的前缀,用在标签库的文档中或者页面中插入自定义标签。所以,你可以使用除了诸如jsp,jspx,java,servlet,sun,sunw(它们都是在jsp白皮书中指定的保留字)之类的前缀。% M  S' f& U; P3 a& ~
uri属性满足了以上的第二个要求。为每个自定义行为找到对应的类。这个uri包含了一个字符串,容器用它来定位tld文件。在tld文件中可以找到标签库中所有标签处理类的名称
/ o! z/ D# K0 Z1 s" }- b2. 当web应用程序启动时,容器从web-inf文件夹的目录结构的meta-inf搜索所有以.tld结尾的文件。也就是说它们会定位所有的tld文件。对于每个tld文件,容器会先获取标签库的uri,然后为每个tld文件和对应的uri创建映射关系。" P& P$ m0 |2 G) s# _
在jsp页面中,我们仅需通过使用带有uri属性值的标签库指令来和具体的标签库匹配, y! E. q( i# @( C; U
三、自定义jsp标签的处理过程:& ^* E( ]" N( L# V
1.在jsp中引入标签库:
  b( Y; G5 ^: k9 ]6 T0 {2.在jsp中使用标签库标签* d7 ^# u4 u3 Q
3.web容器根据第二个步骤中的prefix,获得第一个步骤中声明的taglib的uri属性值7 U  m7 a$ n, Y
4.web容器根据uri属性在web.xml找到对应的元素 5.从元素中获得对应的元素的值 6.web容器根据元素的值从web-inf/目录下找到对应的.tld文件 7.从.tld文件中找到与tagname对应的元素 8.凑元素中获得对应的元素的值 9.web容器根据元素的值创建相应的tag handle class的实例 10. web容器调用这个实例的dostarttag/doendtag方法完成相应的处理& o, I, r* o& `: g" l/ m
四、创建和使用一个tag library的基本步骤:4 V8 C" Y8 t  y; f( e" H, r( v9 M
1.创建标签的处理类(tag handler class)
$ m+ u" L0 C1 N7 L) X3 n6 [2.创建标签库描述文件(tag library descrptor file)
- u9 k$ o6 {; _) X6 g$ O3 r3.在web.xml文件中配置元素 4.在jsp文件中引人标签库
; e( ^$ y1 {% f) P五、tagsupport类简介:
3 K* U( i5 q; Y1 S# c' o1.处理标签的类必须扩展javax.servlet.jsp.tagsupport.
9 B7 z  S' H1 u# t7 d; E2.tagsupport类的主要属性:! M8 r: t! P( S  H$ J% B* Z1 m
a.parent属性:代表嵌套了当前标签的上层标签的处理类% k, T8 K0 f, ^2 F" Y
b.pagecontex属性:代表web应用中的javax.servlet.jsp.pagecontext对象
& o& y$ H7 q/ k$ I. G+ d1 ^% y+ C- {3.jsp容器在调用dostarttag或者doendtag方法前,会先调用setpagecontext和setparent方法,设置pagecontext和parent。因此在标签处理类中可以直接访问pagecontext变量
/ {. n$ _+ c8 E3 c' r; V) x4.在tagsupport的构造方法中不能访问pagecontext成员变量,因为此时jsp容器还没有调用
3 K1 m2 t# [+ {* _# Fsetpagecontext方法对pagecontext进行初始化
/ u. p* Q/ N2 W3 z六、tagsupport处理标签的方法:
9 z+ Q" y6 J8 ~0 [4 a1.tagsupport类提供了两个处理标签的方法:% r/ m/ T9 y: _6 l, a9 s( O
public int dostarttag() throws jspexception8 C- R5 X( h2 q9 N
public int doendtag() throws jspexception$ P0 u- V/ d. _$ ]0 ^
2.dostarttag:但jsp容器遇到自定义标签的起始标志,就会调用dostarttag()方法。
8 G6 m- k( h- F: O* Y$ q" o$ j( `dostarttag()方法返回一个整数值,用来决定程序的后续流程。
; D8 r* \2 H% h9 ja.tag.skip_body:表示?>…之间的内容被忽略
& p% F4 K' @5 h. d3 f1 o6 \" e& U$ mb.tag.eval_body_include:表示标签之间的内容被正常执行7 C5 F) u% b% `  l& ^, g
3.doendtag:但jsp容器遇到自定义标签的结束标志,就会调用doendtag()方法。doendtag()方法也返回一个整数值,用来决定程序后续流程。# |' K! P6 n. m# f- A
a.tag.skip_page:表示立刻停止执行网页,网页上未处理的静态内容和jsp程序均被忽略任何已有的输出内容立刻返回到客户的浏览器上。' q& o  W) h4 s1 P
b.tag_eval_page:表示按照正常的流程继续执行jsp网页% B1 k2 o, ?" ], s
七、用户自定义的标签属性:7 H! P0 m, G; {" d! o$ z
如果在标签中还包含了自定义的属性,那么在标签处理类中应该将这个属性作为成员变量,并且分别提供设置和读取属性的方法。! J( g$ X" @7 l. A
八、创建标签处理类的步骤:  p1 U) E, E' C: d
1.创建包含jsp网页静态文本的文件(即是要替换自定义jsp标签的文本)
7 r# C" ^2 U8 ]9 D: M2 L$ I2.在web应用启动时装载静态文本
% h1 e9 I1 r! S7 c/ ^$ M6 G6 Q& o3.创建标签处理类
! S4 r/ l( W/ n* c6 o9 _九、如何创建包含jsp网页静态文本的文件:" W  b+ ^) H* i$ [; r$ _0 Y; c1 X
1.使用java.util.properties类来存放要替换网页中自定义jsp标签的静态文本
1 |7 W6 s1 t, j- l% ]2.properties类代表了一系列属性的集合,其实例既可以被保存到流中,也可以从流中加载。这些文本以key/value的形式存放在web-inf目录下,例如key=value,在属性列表中这些key/value都是string类型的
' @, t' B4 _- ~9 H# @+ w7 f十、properties类的常用api:
6 q) i, X" }7 V1 [: D$ m  D1.setproperty(string key, string value):调用hashtable类的put方法添加属性
  L: |! M# p- I1 W3 X2.getproperty(string key):获取属性列表中key对应的属性值+ }* o# ]: v. E% F( }9 q9 h1 j
3.load(inputstream in):从输入流对象inputstream中读取属性列表(properties list)
" X; l; t% @) ^- |+ y: y4.store(outputstream out,string comment):使用适当的格式将属性列表的属性对写入输出流对象中,默认使用iso-88590-1编码格式,以行的方式处理输入。属性的key/value之间以”=、:”配对,以回车、换行分隔key/value配对7 [* r2 J. P4 F8 e
十一、servletcontext类的常用api:* m6 a2 z% O, A
1.getcontext(string uripath):返回服务器中uripath所代表的servletcontext对象
$ @/ g4 c% v( ~1 Z: U/ A2.getinitparameter(string name):返回servletconfig对象中name参数的值
5 N. c5 ?; D" E  L6 v# _: f5 a, T3.getminetype(string file):返回file参数代表的文件的mime类型
" x$ m! x5 x+ G& }% m. U; I* N% e4.getrequestdispatcher(string path):返回path代表的requestdispacher对象
1 e  y1 f! H6 p" i7 i6 U3 n8 P5.getresourceasstream(string path):以输入流的形式返回path对应的资源,在输入留中对象可以为任意形式的数据,path参数必须以“/”开始且相对于context root
, d8 E  L' f+ c2 C( @十二、如何使用servletcontxt读取并保存属性文件:
; X$ Q* {; e4 _: q. b1 ]' T1.创建java.util.properties类对象
/ Y: l' `) j4 W  H" v1 k, b2.获取servletcontext对象: W; l+ O0 a+ I% R' u
3.将属性文件以输入流的形式读入到某个输入流对象中
7 U+ a. `+ E2 H' [7 a& G4.将输入流对象加载到properties对象中
9 i+ T! d& \  ]4 M1 L6 n# m7 y/ H5 R5.将properties对象保存到servletcontext对象中
, v: I! t9 [3 G# J( F' E, S十三、如何在web应用启动时装载静态文本:; `* z- Y; O$ c) C* q) W
1.创建继承了httpservlet类的子类,在web.xml中配置这servlet时设置load-on-startup属性:/ N+ I% Y1 _8 T5 y1 J: K
someclass
% c2 n0 n7 @2 t- Vsomepackage.someclass1
- _% _. B  v$ ~. V% D2.在这个servlet的init()方法中创建java.util.properties类# K: B! M' Q/ x& w
3.获取当前web应用的servletcontext对象
; {. a; k8 u- m9 n+ @5 k. t4.将web-inf目录下的属性文件读入到输入流inputstream中:0 k7 p- X3 }7 M0 P- j* f- C
inputstream in = context.getresourceasstring(web-inf/someproperties.properties);  X) b; i% M  r! _1 _1 Z+ \, X
5.将输入流加载到属性对象中
2 \/ s! u+ I& r% L1 aps.load(in);; H% Y. m. h" e' N6 \' |+ ~
6.将属性对象保存到上3 K7 L; B- G6 ?" M. s
context.setattribute(attributename,ps);
$ y8 S0 T, y" j( T2 |; ?十四、如何创建标签处理类:
) B  y' A% M! l# G2 _1.引入必需的资源:# o- ?. N! {  R! O6 H$ g
import javax.servlet.jsp.*;
( R" {$ O4 |, O5 c# ?import javax.servlet.http.*;" g0 b$ k8 B% H% s% `
import java.util.*;
+ j: o( @7 e3 E+ ~0 v* W6 Cimport java.io.*;
' k+ \5 x6 S4 z. b9 b* \8 X/ [, M5 d2.继承tagsupport类并覆盖dostarttag()/doendtag()方法% }' [% K8 q) Y& D) ^" j0 X: F/ `
3.从servletcontext对象中获取java.util.properties对象
5 |6 n2 C# n- A5 A, {6 R6 \4.从properties对象中获取key对应的属性值
- Q5 Q$ q! a% X- c' I# h5.对获取的属性进行相应的处理并输出结果
& ]% {: Z% S: T1 p* y' s# c十五、创建标签库描述文件(tag library descriptor):
3 s+ ~/ t' N# k1 \8 a: J1.标签库描述文件,简称tld,采用xml文件格式,定义了用户的标签库。tld文件中的元素可以分成3类:) V. g4 Z, x7 @9 N9 m' T
a.:标签库元素
: n7 }' i4 ?2 m- ]+ C) w4 W# s- _b.:标签元素2 Y+ l/ M; ~2 n9 i4 u
c.:标签属性元素; Q9 Y& N$ B# ?+ Y
2.标签库元素用来设定标签库的相关信息,它的常用属性有:
; \3 L- m' U$ E5 r4 S; v* `a.shortname: 指定tag library默认的前缀名(prefix)* @2 H4 T) e' ]. D7 l$ p* a
b.uri: 设定tag library的惟一访问表示符' w) J$ |4 g: m/ n" F5 N' j
3.标签元素用来定义一个标签,它的常见属性有:
0 F. s0 p& U8 e/ i- H5 C- q& k2 U8 J6 }a.name: 设定tag的名字4 p+ R# l, P; z+ r
b.tagclass: 设定tag的处理类; X0 [8 z$ P/ f4 J
c.bodycontent: 设定标签的主体(body)内容
; P3 l$ N3 R4 d$ o1).empty:表示标签中没有body6 H5 R4 Q( g4 `  K; j4 w
2).jsp:表示标签的body中可以加入jsp程序代码
. y7 j  X; H/ \5 D: l3 K5 f& n3).tagdependent:表示标签中的内容由标签自己去处理9 ]" i, k8 A4 k1 a
4.标签属性元素用来定义标签的属性,它的常见属性有:: o* K8 k$ b/ B; M. H8 L" L
a.name:属性名称! d0 W0 ~5 k# d, @  u% p. ]4 s
b.required:属性是否必需的,默认为false
0 F/ M2 E6 V# c4 W* \! _c.rtexprvalue:属性值是否可以为request-time表达式,也就是类似于< %=…% >的表达式! }  K$ h8 l& P% R7 S
十六、在web应用中使用标签:
( J' g9 o2 W4 ]1.如果web应用中用到了自定义jsp标签,则必须在web.xml文件中加入元素,它用于声明所引用的标签所在的标签库
  b: A# C  T8 K( G/sometaglib0 W: J5 d) j" |# [7 ^# b7 ?) u
/web-inf/sometld.tld
2 X) |. t& f& |. ~2.:设定tag library的惟一标示符,在web应用中将根据它来引用tag libray) B+ K3 }; \  ]6 ~% G
3.:指定和tag library对应的tld文件的位置8 w* f. j% z- e: w: d: o4 e! ?
4.在jsp文件中需要加入
3 d; C& K# ]2 {( b9 p  |$ o) O5.prefix表示在jsp网页中引用这个标签库的标签时的前缀,uri用来指定tag library的标识符,它必须和web.xml中的属性保持一致。; C2 w' ], S( q, G  e, J& [$ H4 ^
& A8 G8 E+ S, M' G8 X
更多网页制作信息请查看: 网页制作

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