jjsp自下定义标签.docx
《jjsp自下定义标签.docx》由会员分享,可在线阅读,更多相关《jjsp自下定义标签.docx(17页珍藏版)》请在冰豆网上搜索。
jjsp自下定义标签
JSP:
自定义标签
一、一个简单的标签
EG1:
一个简单的标签:
helloTag
本实例将实现调用标签在JSP面中输出红色的字符:
“hello!
”。
说明:
本章的所有实例均放于Web应用mytags中。
(1)第一步:
开发标签实现类。
helloTag.java
packagehello;
importjavax.servlet.jsp.JspWriter;
importjavax.servlet.jsp.tagext.TagSupport;
publicclasshelloTagextendsTagSupport{
//----标签开始时调用此方法-------
publicintdoStartTag(){
try{
JspWriterout=pageContext.getOut();
out.print("标签开始了。
hello!
");
}catch(Exceptione){
System.out.println(e);
}
returnEVAL_BODY_INCLUDE;
}
//----标签结束时调用此方法-------
publicintdoEndTag(){
try{
JspWriterout=pageContext.getOut();
out.print("标签结束了。
");
}catch(Exceptione){
System.out.println(e);
}
returnEVAL_PAGE;
}
}
代码中为正确输出",对此字符用\作了转义。
(2)第二步:
编写标签描述tld文件,并将tld文件放于当前应用的/WEB-INF目录下。
myTag.tld
xmlversion="1.0"encoding="UTF-8"?
>
xmlns:
xsi="http:
//www.w3.org/2001/XMLSchema-instance"
xsi:
schemaLocation="
version="2.0">
--标签库版本-->
1.0
--标签库名称-->
myTagLib
--标签库URI-->
/myTag
--标签库中的标签-->
--helloTag-->
--标签名称-->
helloTag
--标签对应的处理类-->
hello.helloTag
--标签体内容,没有标签体则设为empty-->
empty
(3)第三步:
在Web应用的web.xml文件中声明标签库引用。
本应用中在与中增加的内容如下:
/myTag
/WEB-INF/myTag.tld
对应tld文件中的,指出tld文件的位置。
(4)第四步:
在JSP页面中声明并调用标签。
useHelloTag.jsp
<%@tagliburi="/myTag"prefix="myTag"%>
<%@pagecontentType="text/html;charset=GB2312"%>
一个简单的自定义标签
下面是应用这个简单的自定义标签的结果:
helloTag/>
二、开发带属性的标签
EG2 开发带属性的标签:
helloTagHaveProp
本实例中开发的标签在实例EG1的helloTag标签上作出改进,开发目标是在helloTag标签上增加两个属性fontSize和fontColor,fontSize用于设置字体大小,fontColor用于设置文字的颜色。
(1)第一步:
开发标签实现类。
helloTagHaveProp.java
packagehello;
importjavax.servlet.jsp.JspWriter;
importjavax.servlet.jsp.tagext.TagSupport;
publicclasshelloTagHavePropextendsTagSupport{
privateStringfontSize="3";//字体大小,默认3号
privateStringfontColor="#000000";//字体颜色,默认黑色
//----标签开始时调用此方法-------
publicintdoStartTag(){
try{
JspWriterout=pageContext.getOut();
out.print("标签开始了。
"\"size=\""+fontSize+"\">hello!
");
}catch(Exceptione){
System.out.println(e);
}
returnEVAL_BODY_INCLUDE;
}
//----标签结束时调用此方法-------
publicintdoEndTag(){
try{
JspWriterout=pageContext.getOut();
out.print("标签结束了。
");
}catch(Exceptione){
System.out.println(e);
}
returnEVAL_PAGE;
}
publicStringgetFontColor(){
returnfontColor;
}
publicvoidsetFontColor(StringfontColor){
this.fontColor=fontColor;
}
publicStringgetFontSize(){
returnfontSize;
}
publicvoidsetFontSize(StringfontSize){
this.fontSize=fontSize;
}
}
(2)第二步:
编写标签描述tld文件。
这里在myTag.tld文件中增加内容,在与之间增加的内容如下:
--helloTagHaveProp-->
--标签名称-->
helloTagHaveProp
--标签对应的处理类-->
hello.helloTagHaveProp
--标签体内容,没有标签体则设为empty-->
empty
--标签的属性声明-->
fontSize
false
fontColor
false
其中,name为属性的名称,required设置此属性是否必须设置,如果为true则在JSP页面中使用此标签时,必须给标签的这个属性赋值。
(3)第三步:
在Web应用的web.xml文件中声明标签库引用。
本例与实例108使用同一个tld文件,故不必再修改。
(4)第四步:
在JSP页面中声明并调用标签。
useHelloTagHaveProp.jsp
<%@tagliburi="/myTag"prefix="myTag"%>
<%@pagecontentType="text/html;charset=GB2312"%>
一个简单的自定义标签
下面是应用这个简单的自定义标签的结果:
helloTagHavePropfontSize="5"/>
helloTagHavePropfontSize="4"fontColor="red"/>
三、开发带标签体的标签
要开发带标签体的标签,可实现BodyTag接口,也可从BodyTag接口的实现类BodyTagSupport继承,为简化开发,推荐从BodyTagSupport类继承开发。
编写标签对应的实现类时,需要重载BodyTagSupport类几个方法:
doStartTag(),setBodyContent(),doInitBody(),doAfterBody(),doEndTag(),他们执行顺序如下:
doStartTag()→doInitBody()→setBodyContent()→doAfterBody()→doEndTag()doStartTag()方法可返回EVAL_BODY_INCLUDE或SKIP_BODY,如果返回EVAL_BODY_INCLUDE则继续执行;如果返回SKIP_BODY则接下来的doInitBody(),setBodyContent(),doAfterBody()三个方法不会被执行,而直接执行doEndTag()方法。
setBodyContent()方法用于设置标签体内容,如果在此之前要作一些初始化工作,则在doInitBody()方法中完成。
标签体内容执行完后,会调用doAfterBody()方法,此方法可返回EVAL_BODY_TAG,SKIP_BODY,
EVAL_PAGE或SKIP_PAGE。
如果返回EVAL_BODY_TAG则会再次设置标签体内容,直到返回SKIP_BODY;如果返回EVAL_PAGE则标签体执行完后会继续执行JSP页面中接下来的部分;如果返回SKIP_PAGE,则JSP页面的后续内容将不再执行。
EG3:
开发带标签体的标签:
bodyTag1
本实例将要开发一个带标签体的标签bodyTag1,这个标签有一个属性countNum,用于设置输出标签体内容的次数,输出内容为当前的系统时间。
(1)第一步:
开发标签实现类。
BodyTag1.java
packagebody;
importjavax.servlet.jsp.JspWriter;
importjavax.servlet.jsp.tagext.BodyTagSupport;
publicclassbodyTag1extendsBodyTagSupport{
privateintcountNum=0;//循环显示时间的次数
privateintcurrentNum=1;//当前执行次数
//----标签开始时调用此方法-------
publicintdoStartTag(){
try{
JspWriterout=pageContext.getOut();
out.print("标签开始了:
");
if(countNum>0)
returnEVAL_BODY_TAG;
else
returnSKIP_BODY;
}catch(Exceptione){
System.out.println(e);
returnSKIP_BODY;
}
}
//----标签体执行完后调用此方法----
publicintdoAfterBody(){
try{
JspWriterout=pageContext.getOut();
out.print("第"+currentNum+"次执行标签体。
标签体执行完毕。
");
if(countNum>1){//如果还需要执行标签体
countNum--;
currentNum++;
returnEVAL_BODY_TAG;
}elsereturnSKIP_BODY;
}catch(Exceptione){
System.out.println(e);
returnSKIP_BODY;
}
}
//----标签结束时调用此方法-------
publicintdoEndTag(){
try{
JspWriterout=pageContext.getOut();
//----输出标签体的内容----
bodyContent.writeOut(bodyContent.getEnclosingWriter());
out.print("标签结束了。
");
}catch(Exceptione){
System.out.println(e);
}
returnEVAL_PAGE;
}
publicintgetCountNum(){
returncountNum;
}
publicvoidsetCountNum(intcountNum){
this.countNum=countNum;
this.currentNum=1;
}
}
执行标签体并不会直接输出标签体中的内容,因此本实例在doEndTag()方法中一次性把执行的结果输出。
(2)第二步:
编写标签描述tld文件。
因为本章所有实例共用一个Web应用,故本例在myTag.tld文件中增加内容。
在与之间增加的内容如下:
--bodyTag1-->
--标签名称-->
bodyTag1
--标签对应的处理类-->
body.bodyTag1
--标签体内容,有标签体则设为jsp-->
jsp
--标签的属性声明-->
countNum
true
true
对于属性countNum的声明中,设置为true,表示此属性为必输项;设置为true,表示标签体支持运行时的表达式取值,如果为false则表示标签体为一个静态文本,默认情况下设置为true。
(3)第三步:
在Web应用的web.xml文件中声明标签库引用。
同样,本例与实例108使用同一个tld文件,不必再修改。
(4)第四步:
在JSP页面中声明并调用标签。
UseBodyTag1.jsp
<%@tagliburi="/myTag"prefix="myTag"%>
<%@pagecontentType="text/html;charset=GB2312"%>
<%@pageimport="java.util.Date"%>
开发带有标签体的标签
下面是应用这个带有属性的自定义标签的结果:
bodyTag1countNum="6">
现在的时间是:
<%=newDate()%>
bodyTag1>
四、开发嵌套的标签
EG4:
开发嵌套的标签:
haveChildTag
实际工程中往往需要多个标签来配合完成一定的功能,嵌套的标签存在父子关系,其中,父为外层标签,子为内层标签。
本实例将用两个简单的标签来演示,父标签则作出逻辑判断,如果isOutput属性为true,则输出实例108中的标签helloTag;如果为false,则不输出。
(1)第一步:
开发标签实现类。
内层的标签helloTag在实例108中已有,此处不再列出。
haveChildTag.java
packagehello;
importjavax.servlet.jsp.tagext.BodyTagSupport;
publicclasshaveChildTagextendsBodyTagSupport{
privatebooleanisOutput;//是否输出子标签内容
//----标签开始时调用此方法-------
publicintdoStartTag(){
if(isOutput)
returnEVAL_BODY_INCLUDE;
elsereturnSKIP_BODY;
}
//----标签结束时调用此方法-------
publicintdoEndTag(){
try{
if(bodyContent!
=null)
bodyContent.writeOut(bodyContent.getEnclosingWriter());
}catch(Exceptione){
System.out.println(e);
}
returnEVAL_PAGE;
}
publicbooleangetIsOutput(){
returnisOutput;
}
publicvoidsetIsOutput(booleanisOutput){
this.isOutput=isOutput;
}
}
(2)第二步:
编写标签描述tld文件。
本例在myTag.tld文件中增加内容。
在与之间增加的如下内容:
--haveChildTag-->
--标签名称-->
haveChildTag
--标签对应的处理类-->
hello.haveChildTag
--标签体内容,有标签体则设为jsp-->
jsp
--标签的属性声明-->
isOutput
true
true
(3)第三步:
在Web应用的web.xml文件中声明标签库引用。
同样,本例与本章前面的实例使用同一个tld文件,此处不必再修改。