返回列表 发新帖

jsp的自定义标签教程

589.6k 10
swmozowtfl 发表于 2015-7-26 20:47:02|湖北 | 查看全部 阅读模式
一、基本概念:7 A& l) H& E, N! P
1.标签(tag):1 B/ O9 y: l/ _7 o
标签是一种xml元素,通过标签可以使jsp网页变得简洁并且易于维护,还可以方便地实现同一个jsp文件支持多种语言版本。由于标签是xml元素,所以它的名称和属性都是大小写敏感的  J& n  |0 h. M7 ~) P. c
2.标签库(tag library):
4 p) m1 y8 }' w由一系列功能相似、逻辑上互相联系的标签构成的集合称为标签库。
5 d2 r! ^. |$ V4 k! B3 H; l* |& x3.标签库描述文件(tag library descriptor):2 G' V: W9 [' B% S$ x+ n
标签库描述文件是一个xml文件,这个文件提供了标签库中类和jsp中对标签引用的映射关系。它是一个配置文件,和web.xml是类似的。* m8 C6 S; }& E* ?& j) p
4.标签处理类(tag handle class):3 q' L. e- s0 c# H
标签处理类是一个java类,这个类继承了tagsupport或者扩展了simpletag接口,通过这个类可以实现自定义jsp标签的具体功能
0 r- g3 b% l: M5 b* E1 Z3 Q二、自定义jsp标签的格式:* B  I$ O7 B/ z) \  D9 n
1.* N. @; }3 k8 k/ v- o
为了使到jsp容器能够使用标签库中的自定义行为,必须满足以下两个条件:
- H2 x+ _4 R1 @/ o1)从一个指定的标签库中识别出代表这种自定义行为的标签8 j6 g6 Q& N8 q0 ?5 o
2)找到实现这些自定义行为的具体类
, _" v$ C' ^  Z4 u, p( z6 ~1 U第一个必需条件-找出一个自定义行为属于那个标签库-是由标签指令的前缀(taglib directive's prefix)属性完成,所以在同一个页面中使用相同前缀的元素都属于这个标签库。每个标签库都定义了一个默认的前缀,用在标签库的文档中或者页面中插入自定义标签。所以,你可以使用除了诸如jsp,jspx,java,servlet,sun,sunw(它们都是在jsp白皮书中指定的保留字)之类的前缀。
4 y' ~! U! L# L& h2 |uri属性满足了以上的第二个要求。为每个自定义行为找到对应的类。这个uri包含了一个字符串,容器用它来定位tld文件。在tld文件中可以找到标签库中所有标签处理类的名称
; ?9 M+ {+ ?* C( ~1 b7 U2 e8 y' L2. 当web应用程序启动时,容器从web-inf文件夹的目录结构的meta-inf搜索所有以.tld结尾的文件。也就是说它们会定位所有的tld文件。对于每个tld文件,容器会先获取标签库的uri,然后为每个tld文件和对应的uri创建映射关系。' Y6 x: E* V0 W" v; f$ v: o( d
在jsp页面中,我们仅需通过使用带有uri属性值的标签库指令来和具体的标签库匹配
* n3 e. U: Z  f: B三、自定义jsp标签的处理过程:6 A& D" t0 g% R* y% u1 W4 a: f3 M
1.在jsp中引入标签库:, ^/ A9 W# I1 Z  Y/ O  U# r
2.在jsp中使用标签库标签& s7 [% C* M: w* k) [
3.web容器根据第二个步骤中的prefix,获得第一个步骤中声明的taglib的uri属性值
1 }" \3 u. S2 o+ c3 [4.web容器根据uri属性在web.xml找到对应的元素 5.从元素中获得对应的元素的值 6.web容器根据元素的值从web-inf/目录下找到对应的.tld文件 7.从.tld文件中找到与tagname对应的元素 8.凑元素中获得对应的元素的值 9.web容器根据元素的值创建相应的tag handle class的实例 10. web容器调用这个实例的dostarttag/doendtag方法完成相应的处理1 ?: R) [; \* x& A
四、创建和使用一个tag library的基本步骤:
8 C8 }: I' T$ Q9 P+ E1.创建标签的处理类(tag handler class)
4 w, q  D- W8 d+ P4 O! y8 K8 e- e2.创建标签库描述文件(tag library descrptor file)
9 C/ @5 |' W- ~- }5 J3.在web.xml文件中配置元素 4.在jsp文件中引人标签库
6 W. U3 \1 [) |6 Y$ Q五、tagsupport类简介:4 a, E( ^3 M8 Q, {
1.处理标签的类必须扩展javax.servlet.jsp.tagsupport.: W4 W4 ^) A, T" {) Q8 |/ J
2.tagsupport类的主要属性:$ ~$ P8 M- m; \; n1 I
a.parent属性:代表嵌套了当前标签的上层标签的处理类
5 i, O! X, C! |b.pagecontex属性:代表web应用中的javax.servlet.jsp.pagecontext对象
) f4 z+ M# N, f' M) i+ b8 ~9 b* w# Q3.jsp容器在调用dostarttag或者doendtag方法前,会先调用setpagecontext和setparent方法,设置pagecontext和parent。因此在标签处理类中可以直接访问pagecontext变量6 K* E0 p: s# O
4.在tagsupport的构造方法中不能访问pagecontext成员变量,因为此时jsp容器还没有调用8 T3 b0 i  K$ T( S$ \) X
setpagecontext方法对pagecontext进行初始化! E: P8 K7 N; x9 n6 j
六、tagsupport处理标签的方法:( u: _  o* P! Y6 U& b5 O
1.tagsupport类提供了两个处理标签的方法:4 u) l4 ^, v. e7 h
public int dostarttag() throws jspexception6 p/ O6 I3 X8 v) f$ h
public int doendtag() throws jspexception
7 Z9 L$ ^, X/ i; D' o4 S2.dostarttag:但jsp容器遇到自定义标签的起始标志,就会调用dostarttag()方法。6 e& h. T. O5 \2 d0 D1 f" N
dostarttag()方法返回一个整数值,用来决定程序的后续流程。
: Q, g* L6 n% t/ c: L9 [a.tag.skip_body:表示?>…之间的内容被忽略, ?' b0 z% X1 H3 x4 O1 r% K2 ?
b.tag.eval_body_include:表示标签之间的内容被正常执行
& }3 s2 R: V' [% e3.doendtag:但jsp容器遇到自定义标签的结束标志,就会调用doendtag()方法。doendtag()方法也返回一个整数值,用来决定程序后续流程。4 F. ]: }2 b* f7 m* A/ ~
a.tag.skip_page:表示立刻停止执行网页,网页上未处理的静态内容和jsp程序均被忽略任何已有的输出内容立刻返回到客户的浏览器上。
+ k6 U1 V: S7 P* N% }! E  ]4 Ib.tag_eval_page:表示按照正常的流程继续执行jsp网页* e: a4 x& Q- h, `
七、用户自定义的标签属性:
8 V9 R, u6 m! V  ^; |8 C" B如果在标签中还包含了自定义的属性,那么在标签处理类中应该将这个属性作为成员变量,并且分别提供设置和读取属性的方法。
* ^' e6 b0 w6 g3 I, N; n; p八、创建标签处理类的步骤:  H- t- ?9 N+ T. `/ H
1.创建包含jsp网页静态文本的文件(即是要替换自定义jsp标签的文本)
- B) \8 ^" z2 E# [9 q- p2.在web应用启动时装载静态文本
! J0 C- _) t. J# m9 X; J3.创建标签处理类
2 U9 j7 q2 M) \  L0 y8 |九、如何创建包含jsp网页静态文本的文件:
3 S1 J+ J. @5 v/ a/ h+ Z5 G1.使用java.util.properties类来存放要替换网页中自定义jsp标签的静态文本
4 U2 Q" `& i0 {2.properties类代表了一系列属性的集合,其实例既可以被保存到流中,也可以从流中加载。这些文本以key/value的形式存放在web-inf目录下,例如key=value,在属性列表中这些key/value都是string类型的
9 o$ ^  @. V' E' D$ u+ W- `十、properties类的常用api:' T9 C6 ^9 n. ^( q6 H6 \2 w
1.setproperty(string key, string value):调用hashtable类的put方法添加属性) a) A* E0 p" B7 D- _- x
2.getproperty(string key):获取属性列表中key对应的属性值
* q; \- p- o. h- ~& e3.load(inputstream in):从输入流对象inputstream中读取属性列表(properties list)
% V- E8 N- i2 E- m, o, q5 s: o5 v4.store(outputstream out,string comment):使用适当的格式将属性列表的属性对写入输出流对象中,默认使用iso-88590-1编码格式,以行的方式处理输入。属性的key/value之间以”=、:”配对,以回车、换行分隔key/value配对
% \# `0 W* y1 F6 H0 n4 S十一、servletcontext类的常用api:
5 G+ I- Q+ h! M+ X) [( c1.getcontext(string uripath):返回服务器中uripath所代表的servletcontext对象5 u5 k* L  z  l, v( [# i& R" _
2.getinitparameter(string name):返回servletconfig对象中name参数的值
6 n9 O5 J; V! _0 o3.getminetype(string file):返回file参数代表的文件的mime类型3 T6 z/ c; K1 ]; t  z; w
4.getrequestdispatcher(string path):返回path代表的requestdispacher对象7 \* F, `: C5 b/ @* |& A
5.getresourceasstream(string path):以输入流的形式返回path对应的资源,在输入留中对象可以为任意形式的数据,path参数必须以“/”开始且相对于context root2 q/ G$ K8 o* }" M
十二、如何使用servletcontxt读取并保存属性文件:0 C" S" V5 C  U
1.创建java.util.properties类对象) P" b+ ]( q$ m
2.获取servletcontext对象0 c: K( Q$ ~2 c5 t
3.将属性文件以输入流的形式读入到某个输入流对象中
0 S; r( `1 I% {  L4.将输入流对象加载到properties对象中, }% D/ X# A) w
5.将properties对象保存到servletcontext对象中" z+ v, @3 L/ o/ i: ^$ t/ v' [3 _
十三、如何在web应用启动时装载静态文本:
! A1 N  R) \, h1.创建继承了httpservlet类的子类,在web.xml中配置这servlet时设置load-on-startup属性:
8 P! P1 ]5 E" a( F/ Tsomeclass) m+ ]& O8 A) L" K8 c
somepackage.someclass1& i) Q1 Z* y1 n, O7 J: p
2.在这个servlet的init()方法中创建java.util.properties类9 U( [' a. }- {6 ]2 @/ ^" Y7 A4 Y
3.获取当前web应用的servletcontext对象
8 C7 V/ @. a% f" L' x4.将web-inf目录下的属性文件读入到输入流inputstream中:! @; L, I7 b5 u2 S
inputstream in = context.getresourceasstring(web-inf/someproperties.properties);: J" Y4 v; D0 ]' {* M9 j
5.将输入流加载到属性对象中  j' m1 ?9 U: I/ P; s
ps.load(in);7 y  j. f0 n$ T- N. h) Z+ `
6.将属性对象保存到上
. i. \! d) n( o8 |  ~' icontext.setattribute(attributename,ps);
. Y' t0 _$ V' O( {( `0 i- b十四、如何创建标签处理类:
: n8 S5 K7 h% C! `/ X& ~) P$ I1.引入必需的资源:
& V; w; H8 c: P) @1 @% Bimport javax.servlet.jsp.*;
8 X1 J1 n% M) J& ^. R7 R* @: ^/ U" bimport javax.servlet.http.*;# s  y1 D* q1 h# a: a" B9 R% Z
import java.util.*;& |+ ]% ~8 Z) d; n9 U. t
import java.io.*;
& h( W- @* @0 E2 d4 @  ?* |$ v2.继承tagsupport类并覆盖dostarttag()/doendtag()方法$ K" v; H/ H& {) \& ~; O
3.从servletcontext对象中获取java.util.properties对象5 R( f5 E* r5 n9 ?0 p5 N$ e
4.从properties对象中获取key对应的属性值
6 T# v' [0 h( s2 h+ i  P! O5.对获取的属性进行相应的处理并输出结果* n0 s3 {& a) Z1 S$ X
十五、创建标签库描述文件(tag library descriptor):: l# o$ J2 X2 U
1.标签库描述文件,简称tld,采用xml文件格式,定义了用户的标签库。tld文件中的元素可以分成3类:
3 j9 j8 |# z" X+ U- Ra.:标签库元素
9 a( U) j0 M) _3 Ab.:标签元素4 C: f/ U+ b  [9 K* b3 T8 }; b
c.:标签属性元素; J9 |" ?% n/ i3 ^/ `4 X2 ^2 Y( w
2.标签库元素用来设定标签库的相关信息,它的常用属性有:1 y7 E5 c* [1 z, o
a.shortname: 指定tag library默认的前缀名(prefix)
: E2 G) A1 \0 B3 C  u' v" b7 Bb.uri: 设定tag library的惟一访问表示符
- B* h/ C8 g& I( D3.标签元素用来定义一个标签,它的常见属性有:
5 U/ u' F( f" p! A! xa.name: 设定tag的名字& o9 z- [2 K1 a  R5 ^8 d  ~! @7 [9 \
b.tagclass: 设定tag的处理类) H$ |" e  D% S+ ^% |& M2 F7 ~* U
c.bodycontent: 设定标签的主体(body)内容' b. U$ Z6 ?1 J1 n
1).empty:表示标签中没有body/ \* Y; n  P0 a9 S$ E( ]
2).jsp:表示标签的body中可以加入jsp程序代码- D# J: {. c; @) t
3).tagdependent:表示标签中的内容由标签自己去处理1 V; e$ \  [1 K6 S: z; Y
4.标签属性元素用来定义标签的属性,它的常见属性有:! s- q$ \  i. X4 k
a.name:属性名称: E+ j3 c/ f2 M, m  r
b.required:属性是否必需的,默认为false) n" B1 |( O7 x+ V
c.rtexprvalue:属性值是否可以为request-time表达式,也就是类似于< %=…% >的表达式7 E4 D, v. Y0 }
十六、在web应用中使用标签:4 U' L! N+ K; H- P$ `
1.如果web应用中用到了自定义jsp标签,则必须在web.xml文件中加入元素,它用于声明所引用的标签所在的标签库
9 B- V% H2 q. p" k/sometaglib
1 X0 v' w0 P3 g2 J9 j/web-inf/sometld.tld
4 {" ^4 e) t( |9 t4 L& A7 I# Q2.:设定tag library的惟一标示符,在web应用中将根据它来引用tag libray# ^5 U4 T, B6 k$ a" o7 F; }
3.:指定和tag library对应的tld文件的位置
$ ~8 w7 J* |( F! |! _2 `" n4.在jsp文件中需要加入/ l0 V: Q% y6 t/ c) w, J
5.prefix表示在jsp网页中引用这个标签库的标签时的前缀,uri用来指定tag library的标识符,它必须和web.xml中的属性保持一致。& _1 a: [5 ~: t  r* r

* J+ E) i" s2 P* P: }  b更多网页制作信息请查看: 网页制作

回复|共 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技术交流平台 版权所有 All Rights Reserved. Powered by Discuz! X5.0 鄂ICP备15006301号-5|鄂公网安备 42018502006730号
关灯 在本版发帖 扫一扫添加QQ客服 返回顶部
快速回复 返回顶部 返回列表