JSP2自定义标签的使用方法Word下载.docx
《JSP2自定义标签的使用方法Word下载.docx》由会员分享,可在线阅读,更多相关《JSP2自定义标签的使用方法Word下载.docx(12页珍藏版)》请在冰点文库上搜索。
/taglib-uri>
taglib-location>
/WEB-INF/jsp2/jsp2-example-taglib.tld<
/taglib-location>
/taglib>
JSP解释器会将http:
//mytaglib/myTestTags1根据web.xml中的配置转化为本地路径。
当然<
taglib-uri>
中文本可以是任何值,但不能和其它的配置冲突,所以在规划时最好加上前缀,如:
//mytaglib等。
2.2.3标签库中的配置
在标签库中的配置实际上就是配置对实现类的引用,JSP解释器会根据jsp文件中对标签的引用,在标签库中找到相应的标签,然后再根据标签中的定义调用具体的实现类,本例中在jsp文件中对标签的引用:
,即引用了helloWorld这个标签,这个标签在标签库中的定义如下:
tag>
description>
OutputsHello,World<
/description>
name>
helloWorld<
/name>
tag-class>
jsp2.examples.simpletag.HelloWorldSimpleTag<
/tag-class>
body-content>
empty<
/body-content>
/tag>
该标签由四个部分组成:
(1)description:
描述该标签的作用
(2)name:
标签的名字,该名字在jsp文件使用,相当类名;
(3)tag-class:
标签的实现索引,相当于类的实现;
本例索引指定jsp2.examples.simpletag.HelloWorldSimpleTag,是一个java的类文件,应放在WEB_INF/classes/jsp2/examples/simpletag目录下的HelloWorldSimpleTag.class文件;
(4)body-content:
在jsp文件中使用标签时,标签中的内容类别,本例的值是empty,表示helloWorld这个标签中没有内容。
如果在jsp页面中在该标签中加入了内容,如<
helloWorld>
hell<
/mytag:
,页面会报错,当然<
是不会错的(注意不能有空格式)。
2.2.4类的实现
类HelloWorldSimpleTag实现如下:
packagejsp2.examples.simpletag;
importjavax.servlet.jsp.JspException;
importjavax.servlet.jsp.tagext.SimpleTagSupport;
importjava.io.IOException;
publicclassHelloWorldSimpleTagextendsSimpleTagSupport{
publicvoiddoTag()throwsJspException,IOException{
getJspContext().getOut().write("
Hello,world!
"
);
}}
(1)jsp标签调用的类一般继承于SimpleTagSupport
(2)SimpleTagSupport中实现了getJspContext()这个方法,这个方法可以获取指向jsp页面的输出流。
(3)getJspContext().getOut().write("
):
输出Hellow,World!
2.3含有变量的tag配置
2.3.1jsp文件中的标签引用及使用方法
以下是引用了带有变量标签的jsp页面:
/WEB-INF/jsp2/my_taglib.tld"
repeatnum1="
15"
>
Invocation${count}of5<
br>
repeat>
(1)<
repeatnum="
,输入参数的传入方法:
即在标签中将要传入的参数做为标签的一个属性,并指定其属性值,本例中传入参数num1,它的值为15;
(2)${count},在页面中显示输出参数的值,count是输出参数的名字
2.3.2标签库中的配置
标签库中的相应配置如下:
Repeatsthebodyofthetag'
num'
times<
repeat<
jsp2.examples.simpletag.RepeatSimpleTag<
scriptless<
--标签内容是脚本
variable>
Currentinvocationcount(1tonum)<
name-given>
count<
/name-given>
--输出参数说明
/variable>
attribute>
num<
--输入参数说明
required>
true<
/required>
rtexprvalue>
/rtexprvalue>
/attribute>
该标签由六个部分组成:
见上文
(3)tag-class:
这个例子的值是scriptless,表示标签中的内容是脚本
(5)variable:
输出参数,在jsp中使用${count}来引用这个输出变量的值,输出参数名并不是强制性的,这里只是一个约定,即要求repeat实现类最后有count这个输出参数,以便在jsp页中方便引用,如果没有也不会报错;
(6)attribute:
输入参数,在jsp中使用<
mytag:
5"
来设置这个输入参数num,这个参数名是强制性的,即要在repeat实现类中有setNum这个方法,如果没有相应的方法jsp页面会报错;
2.3.3类的实现
importjava.util.HashMap;
publicclassRepeatSimpleTag1extendsSimpleTagSupport{
privateintnum;
for(inti=0;
i<
num;
i++){
getJspContext().setAttribute("
count"
String.valueOf(i+1));
getJspBody().invoke(null);
}}
publicvoidsetNum(intnum){
this.num=num;
}}
(1)getJspContext().setAttribute定义了输出到jsp页面的输出参数count,这里的count是一个字符串,它的值可以不与标签库中variable定义相同,如,它可以是len,当然在jsp引用时应以这里为准,即使用${len}引用;
(2)setNum(intnum)方法:
接收输入参数,这个方法命名规则为set+输入参数名,该方法带一个参数,用于接收输入参数的值。
2.4函数标签的定义方法
2.4.1jsp文件中函数标签引用及使用方法
my"
span>
${my:
caps(“HELLOWORLD”)}<
/span>
(1)函数标签的引用比其它标签的引用都要简单,它的引用与高级语言中的函数调用方法类似,直接在函数名后的括号后面输入相应的参数值即可,不需要另加用标签的其它属性来说明输入参数。
2.4.2函数标签在标签库中配置
function>
Convertsthestringtoallcaps<
caps<
function-class>
jsp2.examples.el.Functions<
/function-class>
function-signature>
java.lang.Stringcaps(java.lang.String)<
/function-signature>
/function>
说明如下:
(1)这种方法的定义包含在function元素中;
函数名
(3)function-class:
该函数真正的实现class,本例中,caps函数是由WEB_INF/classes/jsp2/examples/el路径中的Functions类来实现的;
(4)function-signature:
说明函数的输入及输出参数类型,不用指明参数名。
2.4.3类的实现
packagejsp2.examples.el;
importjava.util.*;
publicclassFunctions{
publicstaticStringcaps(Stringtext){
returntext.toUpperCase();
(1)函数标签实现类就是普通的类,它不需要从某个父类继承;
(2)函数标签实现类中必须有相应的方法与标签库中相应的函数字义相同(包括函数名,输入参数个数及输入参数类型,函数的返回值);
2.5标签模板
标签模板的特点:
(1)没有tld文件在jsp中通过<
tags"
tagdir="
/WEB-INF/tags"
引用,即使用tagdir代替了uri,这里的tags是一个文件夹,不是文件,在该文件夹中包含了所需的标签模板;
(2)通过以下方式传入参数值:
tags:
displayProducts>
jsp:
attributename="
normalPrice"
....<
/jsp:
onSale"
.....
/tags:
(3)displayProducts是与/WEB-INF/tags目录中的某个文件名;
(4)通过<
…."
来赋值
(5)标签模板是一个纯文本文件,类似于html文件,而不需要通过java的类来实现标签的定义;
(6)标签模板的主要作用重在排版,而其它标签的作用重在功能的实现;
自定义标签
从图上可以看出结构。
接口的实现类:
SimpleTagSupport(Jsp2.0)、TagSupport、BodyTagSupport
步骤:
1、创建标签的处理类(TagHandlerClass)实现上述类或接口
2、创建标签库描述文件(TagLibraryDescrptorFile)即TLD文件
1.TagSupport处理标签的方法
1、TagSupport类提供了两个处理标签的方法:
publicintdoStartTag()throwsJspException
publicintdoEndTag()throwsJspException
2、doStartTag:
但JSP容器遇到自定义标签的起始标志,就会调用doStartTag()方法。
doStartTag()方法返回一个整数值,用来决定程序的后续流程。
A.Tag.SKIP_BODY:
表示?
…之间的内容被忽略;
B.Tag.EVAL_BODY_INCLUDE:
表示标签之间的内容被正常执行。
3、doEndTag:
但JSP容器遇到自定义标签的结束标志,就会调用doEndTag()方法。
doEndTag()方法也返回一个整数值,用来决定程序后续流程。
A.Tag.SKIP_PAGE:
表示立刻停止执行网页,网页上未处理的静态内容和JSP程序均被忽略任何已有的输出内容立刻返回到客户的浏览器上。
B.Tag_EVAL_PAGE:
表示按照正常的流程继续执行JSP网页。
定义标签类,实现TagSupport类:
publicclassTagSupport_DemoextendsTagSupport{
/*
*标签的自定义实现TagSupport
*/
privatePageContextpage=null;
privateintintNumber;
//该变量为标签里的属性;
publicintgetIntNumber(){
returnintNumber;
}
publicvoidsetIntNumber(intintNumber){
this.intNumber=intNumber;
@Override
publicintdoEndTag()throwsJspException{//对标签处理后其他的JSP内容的处理
try{
for(inti=0;
i<
intNumber;
i++)
page.getOut().print("
标签的使用<
);
}catch(IOExceptione){
e.printStackTrace();
}
returnEVAL_PAGE;
//JSP继续执行该标签后的内容
publicintdoStartTag()throwsJspException{//对标签内容的处理
//TODO自动生成方法存根
returnSKIP_BODY;
//不计算该标签之间的内容
publicvoidsetPageContext(PageContextpc){
this.page=pc;
}
创建标签库描述文件(TagLibraryDescriptor)
1、标签库描述文件,简称TLD,采用XML文件格式,定义了用户的标签库。
TLD文件中的元素可以分成3类:
A.标签库元素
B.标签元素
C.标签属性元素
2、标签库元素用来设定标签库的相关信息,它的常用属性有:
A.shortname:
指定TagLibrary默认的前缀名(prefix);
B.uri:
设定TagLibrary的惟一访问表示符。
3、标签元素用来定义一个标签,它的常见属性有:
A.name:
设定Tag的名字;
B.tagclass:
设定Tag的处理类;
C.bodycontent:
设定标签的主体(body)内容。
1)empty:
表示标签中没有body;
2)JSP:
表示标签的body中可以加入JSP程序代码;
3)tagdependent:
表示标签中的内容由标签自己去处理。
4、标签属性元素用来定义标签的属性,它的常见属性有:
属性名称;
B.required:
属性是否必需的,默认为false;
C.rtexprvalue:
属性值是否可以为request-time表达式,也就是类似于<
%=…%>
的表达式。
?
xmlversion="
1.0"
encoding="
UTF-8"
?
用户标签<
display-name>
S9<
/display-name>
tlib-version>
1.0<
/tlib-version>
jsp-version>
1.2<
/jsp-version>
short-name>
Q<
/short-name>
uri>
/uri>
该标签为自己定义的标签,功能为:
……<
Qhit<
com.hy.TagSupport_Demo<
jsp<
!
--属性的定义-->
<
intNumber<
class>
java.lang.Integer<
/class>
在页面中使用标签:
%@tagliburi="
prefix="
Q"
Q:
QhitintNumber="
/>
二、带标签内容的
*计算带标签内容的自定义标签
publicclassTag_Include_tagextendsBodyTagSupport{
privateintcount;
publicintgetCount(){
returncount;
publicvoidsetCount(intcount){
this.count=count;
publicintdoAfterBody()throwsJspException{
if(--count>
=0){
returnEVAL_BODY_AGAIN;
returnSKIP_BODY;
publicintdoEndTag()throwsJspException{
if(bodyContent!
=null){
try{
bodyContent.writeOut(bodyContent.getEnclosingWriter());
}catch(IOExceptione){
e.printStackTrace();
}
returnsuper.doEndTag();
publicintdoStartTag()throwsJspException{
if(count!
returnEVAL_BODY_INCLUDE;
}else{
returnSKIP_BODY;
}
publicvoidsetBodyContent(BodyContentbodyContent1){
bodyContent=bodyContent1;
demo<
com.hy.Tag_Include_tag<
<
ture<
使用标签:
democount="
3"
AAAAAAAA<
/Q:
demo>