返回列表 发新帖

jsp的自定义标签教程

589.8k 10
swmozowtfl 发表于 2015-7-26 20:47:02|湖北 | 查看全部 阅读模式
一、基本概念:8 z2 ], ]2 Q+ u+ I# U8 }
1.标签(tag):
* F9 i0 N% k- @标签是一种xml元素,通过标签可以使jsp网页变得简洁并且易于维护,还可以方便地实现同一个jsp文件支持多种语言版本。由于标签是xml元素,所以它的名称和属性都是大小写敏感的1 J( {& u. d! p$ z- d$ U. x
2.标签库(tag library):
% w- V1 a3 X/ M" A; @; e由一系列功能相似、逻辑上互相联系的标签构成的集合称为标签库。- N) U2 C7 b1 @2 h6 S
3.标签库描述文件(tag library descriptor):$ t0 K& H' _  w  J" U
标签库描述文件是一个xml文件,这个文件提供了标签库中类和jsp中对标签引用的映射关系。它是一个配置文件,和web.xml是类似的。5 f5 k( |2 m1 a. E' P, x
4.标签处理类(tag handle class):0 }" D7 b8 f5 i
标签处理类是一个java类,这个类继承了tagsupport或者扩展了simpletag接口,通过这个类可以实现自定义jsp标签的具体功能
7 n1 s9 t* X( I' Y" s6 i( y0 p8 Z二、自定义jsp标签的格式:
, m$ H, S% H) _: a/ D& ?* x, O1.
+ \7 O$ b' o+ q3 n- ]" @# `4 x为了使到jsp容器能够使用标签库中的自定义行为,必须满足以下两个条件:) u4 w* l9 b# g) ?; B4 J- c; @) P
1)从一个指定的标签库中识别出代表这种自定义行为的标签0 L: G" o( c( s: z" z% K
2)找到实现这些自定义行为的具体类
: c+ `& ], s" V  t+ }! F第一个必需条件-找出一个自定义行为属于那个标签库-是由标签指令的前缀(taglib directive's prefix)属性完成,所以在同一个页面中使用相同前缀的元素都属于这个标签库。每个标签库都定义了一个默认的前缀,用在标签库的文档中或者页面中插入自定义标签。所以,你可以使用除了诸如jsp,jspx,java,servlet,sun,sunw(它们都是在jsp白皮书中指定的保留字)之类的前缀。
% e& a% \0 @5 Q: ]9 R. Juri属性满足了以上的第二个要求。为每个自定义行为找到对应的类。这个uri包含了一个字符串,容器用它来定位tld文件。在tld文件中可以找到标签库中所有标签处理类的名称+ r# Q$ B/ b, o8 r# G$ }
2. 当web应用程序启动时,容器从web-inf文件夹的目录结构的meta-inf搜索所有以.tld结尾的文件。也就是说它们会定位所有的tld文件。对于每个tld文件,容器会先获取标签库的uri,然后为每个tld文件和对应的uri创建映射关系。
; B3 U  V; K: o; a在jsp页面中,我们仅需通过使用带有uri属性值的标签库指令来和具体的标签库匹配
1 ~/ P: a1 Q5 [. s1 M  v' i三、自定义jsp标签的处理过程:
6 [* N7 W! x) p1.在jsp中引入标签库:% J8 u4 _% ?+ u" M8 Q& h
2.在jsp中使用标签库标签
  I3 j# a5 r6 T( R) X( T3.web容器根据第二个步骤中的prefix,获得第一个步骤中声明的taglib的uri属性值0 b: t+ L1 M5 |
4.web容器根据uri属性在web.xml找到对应的元素 5.从元素中获得对应的元素的值 6.web容器根据元素的值从web-inf/目录下找到对应的.tld文件 7.从.tld文件中找到与tagname对应的元素 8.凑元素中获得对应的元素的值 9.web容器根据元素的值创建相应的tag handle class的实例 10. web容器调用这个实例的dostarttag/doendtag方法完成相应的处理+ I9 R" L% ^4 |; L
四、创建和使用一个tag library的基本步骤:& V# p: K2 k9 @: G0 r4 \7 r6 u7 d
1.创建标签的处理类(tag handler class)8 H! ~- U& g3 X! D& H
2.创建标签库描述文件(tag library descrptor file)& {7 u, }/ A$ V& R; d
3.在web.xml文件中配置元素 4.在jsp文件中引人标签库
* Z% S. z$ R( J& R五、tagsupport类简介:6 B4 _5 ?. l3 |/ B! P2 W
1.处理标签的类必须扩展javax.servlet.jsp.tagsupport.
; R9 d1 H- |! M! \& x: h: Y8 S9 f2.tagsupport类的主要属性:
. m7 u7 q' n( F3 j4 g- V: y" Oa.parent属性:代表嵌套了当前标签的上层标签的处理类
0 @5 \3 g; V. v/ w* w% t2 B" o! yb.pagecontex属性:代表web应用中的javax.servlet.jsp.pagecontext对象
/ [/ \3 d+ _4 x+ p3.jsp容器在调用dostarttag或者doendtag方法前,会先调用setpagecontext和setparent方法,设置pagecontext和parent。因此在标签处理类中可以直接访问pagecontext变量
% U( ^' S5 {: ^7 H; N4.在tagsupport的构造方法中不能访问pagecontext成员变量,因为此时jsp容器还没有调用
$ E+ U* [9 a* N; z  f. Y# d% Xsetpagecontext方法对pagecontext进行初始化
. D% K3 m9 b  j! h" {六、tagsupport处理标签的方法:
9 [( @& v- F7 X, f" n  m1.tagsupport类提供了两个处理标签的方法:
( H0 h, M: a. @1 dpublic int dostarttag() throws jspexception/ U" q# Z4 e! t3 U
public int doendtag() throws jspexception
4 I' [1 @6 [6 A6 R( Z! n0 L! C4 e2.dostarttag:但jsp容器遇到自定义标签的起始标志,就会调用dostarttag()方法。
1 Q  A+ N# P! q9 C# H2 Adostarttag()方法返回一个整数值,用来决定程序的后续流程。& E- [# Y' R) c, n$ V
a.tag.skip_body:表示?>…之间的内容被忽略0 M0 D! {- t: i
b.tag.eval_body_include:表示标签之间的内容被正常执行
, I0 l* T% j/ ]5 j! e' w% k! \3.doendtag:但jsp容器遇到自定义标签的结束标志,就会调用doendtag()方法。doendtag()方法也返回一个整数值,用来决定程序后续流程。
. B; L( L1 Q2 V$ P0 `a.tag.skip_page:表示立刻停止执行网页,网页上未处理的静态内容和jsp程序均被忽略任何已有的输出内容立刻返回到客户的浏览器上。/ z6 M. ?6 d! n' G! C
b.tag_eval_page:表示按照正常的流程继续执行jsp网页
( [& P) T  T% O七、用户自定义的标签属性:+ f  ]2 N/ {  y) Q% L0 f$ }
如果在标签中还包含了自定义的属性,那么在标签处理类中应该将这个属性作为成员变量,并且分别提供设置和读取属性的方法。
% X- a$ }0 A: ^八、创建标签处理类的步骤:3 \9 E. l1 M) W" c) }; {7 ^% _
1.创建包含jsp网页静态文本的文件(即是要替换自定义jsp标签的文本)
: w5 O3 G4 |" W+ k" {2.在web应用启动时装载静态文本
$ ?8 m% \3 X9 A2 F" ~9 ^3.创建标签处理类7 y' @2 ]" s+ h3 p) T7 u* I7 ]
九、如何创建包含jsp网页静态文本的文件:
) g- ^. g7 ?/ h& y( O1.使用java.util.properties类来存放要替换网页中自定义jsp标签的静态文本
" @- P4 k5 O6 M* c+ d2.properties类代表了一系列属性的集合,其实例既可以被保存到流中,也可以从流中加载。这些文本以key/value的形式存放在web-inf目录下,例如key=value,在属性列表中这些key/value都是string类型的
3 {7 E' A( E, M9 U& F十、properties类的常用api:1 A, F: f1 Y1 K( R' m
1.setproperty(string key, string value):调用hashtable类的put方法添加属性2 G. x/ n6 ^# s5 H2 |
2.getproperty(string key):获取属性列表中key对应的属性值
4 N) h1 }6 e: R( w3.load(inputstream in):从输入流对象inputstream中读取属性列表(properties list)
1 ^- y5 z  L) {. s: k4.store(outputstream out,string comment):使用适当的格式将属性列表的属性对写入输出流对象中,默认使用iso-88590-1编码格式,以行的方式处理输入。属性的key/value之间以”=、:”配对,以回车、换行分隔key/value配对
* [) ?( g: q, g- ]. H' s  s十一、servletcontext类的常用api:& i( i7 H' b0 x
1.getcontext(string uripath):返回服务器中uripath所代表的servletcontext对象
9 r3 s& [, m+ M& B/ m2.getinitparameter(string name):返回servletconfig对象中name参数的值3 _) h" u" `  r8 h
3.getminetype(string file):返回file参数代表的文件的mime类型
& H5 @3 |2 e4 q' T+ O( u) L2 Z, `4.getrequestdispatcher(string path):返回path代表的requestdispacher对象
7 r: F+ i5 ~7 P1 G2 m3 t8 W5.getresourceasstream(string path):以输入流的形式返回path对应的资源,在输入留中对象可以为任意形式的数据,path参数必须以“/”开始且相对于context root
7 ]% V; p* x3 Y' J十二、如何使用servletcontxt读取并保存属性文件:* \* h3 B; F" h7 q" ]
1.创建java.util.properties类对象
( }& _3 [% j' o# \# r9 K5 p2.获取servletcontext对象
; k5 c# V4 b3 W( s" K5 R3.将属性文件以输入流的形式读入到某个输入流对象中0 P. W) `' X. z
4.将输入流对象加载到properties对象中
  g3 S9 r3 U% n0 ]' R  R5.将properties对象保存到servletcontext对象中
1 w1 R& ^$ h, E& z十三、如何在web应用启动时装载静态文本:0 w- {, \9 e; W
1.创建继承了httpservlet类的子类,在web.xml中配置这servlet时设置load-on-startup属性:0 e# b9 k& W6 A
someclass+ F* \( Z1 S( L5 |% @
somepackage.someclass1
/ W( @# i8 K- J' k, N/ I2.在这个servlet的init()方法中创建java.util.properties类
/ P1 h* M. {; f3.获取当前web应用的servletcontext对象! e3 n" g; _9 O
4.将web-inf目录下的属性文件读入到输入流inputstream中:1 Z" g! R0 D* u4 c# u- A& i* I3 m
inputstream in = context.getresourceasstring(web-inf/someproperties.properties);
1 E! s+ J  m$ v0 S$ r+ E$ N& N7 |+ f5.将输入流加载到属性对象中* {# F  _, K/ t1 z9 Q( ~
ps.load(in);- B3 U3 \" \! ?" P0 y5 S
6.将属性对象保存到上
3 _" |* c4 j9 O% pcontext.setattribute(attributename,ps);
" I" L+ S, [1 c  r1 l! ?/ V十四、如何创建标签处理类:( L, s9 e6 m% N  }) T3 K
1.引入必需的资源:
; g7 a; {  u& fimport javax.servlet.jsp.*;0 l! [6 c* n! W' ?. [* R% a
import javax.servlet.http.*;+ Y* T: h% U9 i# ~( h7 O: T/ }& I
import java.util.*;" u% r( D. s% \$ V& M( K7 D
import java.io.*;9 K6 @* ^6 e: W4 Q) U7 }7 m
2.继承tagsupport类并覆盖dostarttag()/doendtag()方法
: h  M0 s3 k3 r/ S. `% x3.从servletcontext对象中获取java.util.properties对象
4 p9 J! w; x+ u0 z( b/ d% K( N4.从properties对象中获取key对应的属性值
$ I4 u% P9 F5 B: z  [0 F5.对获取的属性进行相应的处理并输出结果
+ x! N  B2 {6 z) q. z0 `十五、创建标签库描述文件(tag library descriptor):6 s: G7 C6 A6 L* I! J8 `$ [6 C
1.标签库描述文件,简称tld,采用xml文件格式,定义了用户的标签库。tld文件中的元素可以分成3类:
$ s. y( J' H- t9 r$ ha.:标签库元素# F, K/ n+ {: f& \/ F4 i; D- }
b.:标签元素
! v# k# Q: K: h  r2 x# |& Qc.:标签属性元素* N6 k6 R* Y; P" ~4 `7 K. D& {1 ?( U
2.标签库元素用来设定标签库的相关信息,它的常用属性有:; A/ t  T3 s, t  j7 `/ ^% v
a.shortname: 指定tag library默认的前缀名(prefix)2 L! r# e3 X  y& M, T! }  a
b.uri: 设定tag library的惟一访问表示符
4 h2 d9 u+ k5 O% p5 R9 [; o" h3.标签元素用来定义一个标签,它的常见属性有:1 _* X0 `0 D7 h* |6 u4 U" {
a.name: 设定tag的名字
$ @1 K" W/ I' u0 Tb.tagclass: 设定tag的处理类
5 h* E) G/ K, W6 P" ^" j$ g( {# v  Cc.bodycontent: 设定标签的主体(body)内容
1 c2 e5 e% ^  c0 Q7 {& O1).empty:表示标签中没有body
% {/ B' L' {/ O" P' N2).jsp:表示标签的body中可以加入jsp程序代码
/ Z) [" o' E" V" D' i* |! F3).tagdependent:表示标签中的内容由标签自己去处理
6 B9 n' K$ `" {4.标签属性元素用来定义标签的属性,它的常见属性有:. o8 H- y( p# Y, _, ]
a.name:属性名称4 e: V/ y' @# [4 k% z
b.required:属性是否必需的,默认为false$ u5 `: ?: l; A1 C
c.rtexprvalue:属性值是否可以为request-time表达式,也就是类似于< %=…% >的表达式
) F1 B. q" x. P$ p十六、在web应用中使用标签:: m& R& ?" W) n
1.如果web应用中用到了自定义jsp标签,则必须在web.xml文件中加入元素,它用于声明所引用的标签所在的标签库' m5 ^& X+ ~! [
/sometaglib
1 @, {+ r( p# }+ U' g9 O' D/web-inf/sometld.tld2 H" g' d9 H( v
2.:设定tag library的惟一标示符,在web应用中将根据它来引用tag libray
1 I2 n/ b. ~  t3.:指定和tag library对应的tld文件的位置% `0 w" R) [; q. h1 A$ k& {* N
4.在jsp文件中需要加入
5 p2 e7 e: f. _" F! o1 B5.prefix表示在jsp网页中引用这个标签库的标签时的前缀,uri用来指定tag library的标识符,它必须和web.xml中的属性保持一致。- s4 W7 @, |( j) Q( |* G
3 B3 N8 [" U5 \7 O0 p( _! L
更多网页制作信息请查看: 网页制作

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