java web标签_javaweb学习6——自定义标签

声明:本文只是自学过程中,记录自己不会的知识点的摘要,如果想详细学习JavaWeb,请到孤傲苍狼博客学习,JavaWeb学习点此跳转

传统标签接口中的各个方法可以返回的返回值说明:

下图列举了Tag接口、IterationTag接口和BodyTag接口中的主要方法及它们分别可以返回的返回值的说明。

5fa6f8d42656cf745d20448793c07296.png

在JSP API中也提供了IterationTag接口的默认实现类TagSupport、IterationTag接口的默认实现类TagSupport和BodyTag接口的实现类BodyTagSupport,我们在编写自定义标签的标签处理器类时,可以继承和扩展TagSupport类、IterationSupport类和BodyTagSupport类。

开发简单标签实现页面逻辑

1.控制jsp页面某一部分内容是否执行

编写一个类继承SimpleTagSupport,然后再重写doTag方法,在doTag方法里面是否调用jspFrament.invoke方法来控制标签是否执行。

packageme.gacl.web.simpletag;importjava.io.IOException;importjavax.servlet.jsp.JspException;importjavax.servlet.jsp.PageContext;importjavax.servlet.jsp.tagext.JspFragment;importjavax.servlet.jsp.tagext.SimpleTagSupport;/***@authorgacl

* SimpleTagSupport类实现了SimpleTag接口,

* SampleTagDemo1类继承SimpleTagSupport*/

public class SimpleTagDemo1 extendsSimpleTagSupport {/*简单标签使用这个方法就可以完成所有的业务逻辑

* @see javax.servlet.jsp.tagext.SimpleTagSupport#doTag()

* 重写doTag方法,控制标签体是否执行*/@Overridepublic void doTag() throwsJspException, IOException {//得到代表jsp标签体的JspFragment

JspFragment jspFragment = this.getJspBody();//得到jsp页面的的PageContext对象//PageContext pageContext = (PageContext) jspFragment.getJspContext();//调用JspWriter将标签体的内容输出到浏览器//jspFragment.invoke(pageContext.getOut());//将标签体的内容输出到浏览器

jspFragment.invoke(null);

}

}

2.控制jsp页面内容重复执行

编写一个类继承SimpleTagSupport,然后再重写doTag方法,在doTag方法里面重复调用jspFrament.invoke方法即可。

packageme.gacl.web.simpletag;importjava.io.IOException;importjavax.servlet.jsp.JspException;importjavax.servlet.jsp.tagext.JspFragment;importjavax.servlet.jsp.tagext.SimpleTagSupport;/***@authorgacl

* SimpleTagSupport类实现了SimpleTag接口,

* SampleTagDemo2类继承SimpleTagSupport*/

public class SimpleTagDemo2 extendsSimpleTagSupport {/*简单标签使用这个方法就可以完成所有的业务逻辑

* @see javax.servlet.jsp.tagext.SimpleTagSupport#doTag()

* 重写doTag方法,控制标签执行5次*/@Overridepublic void doTag() throwsJspException, IOException {//得到代表jsp标签体的JspFragment

JspFragment jspFragment = this.getJspBody();for (int i = 0; i < 5; i++) {//将标签体的内容输出到浏览器

jspFragment.invoke(null);

}

}

}

3.修改jsp页面内容输出

编写一个类继承SimpleTagSupport,然后再重写doTag方法,在doTag方法调用jspFrament.invoke方法时,让执行结果写一个自定义的缓冲中即可,然后开发人员可以取出缓冲的数据修改输出。

packageme.gacl.web.simpletag;importjava.io.IOException;importjava.io.StringWriter;importjavax.servlet.jsp.JspException;importjavax.servlet.jsp.PageContext;importjavax.servlet.jsp.tagext.JspFragment;importjavax.servlet.jsp.tagext.SimpleTagSupport;/***@authorgacl

* SimpleTagSupport类实现了SimpleTag接口,

* SampleTagDemo3类继承SimpleTagSupport*/

public class SimpleTagDemo3 extendsSimpleTagSupport {/*简单标签使用这个方法就可以完成所有的业务逻辑

* @see javax.servlet.jsp.tagext.SimpleTagSupport#doTag()

* 重写doTag方法,修改标签体里面的内容,将标签体的内容转换成大写*/@Overridepublic void doTag() throwsJspException, IOException {//得到代表jsp标签体的JspFragment

JspFragment jspFragment = this.getJspBody();

StringWriter sw= newStringWriter();//将标签体的内容写入到sw流中

jspFragment.invoke(sw);//获取sw流缓冲区的内容

String content =sw.getBuffer().toString();

content=content.toUpperCase();

PageContext pageContext= (PageContext) this.getJspContext();//将修改后的content输出到浏览器中

pageContext.getOut().write(content);

}

}

4.控制整个jsp页面是否执行

编写一个类继承SimpleTagSupport,然后再重写doTag方法,在doTag方法抛出SkipPageException异常即可,jsp收到这个异常,将忽略标签余下jsp页面的执行。

示例代码如下:

packageme.gacl.web.simpletag;importjava.io.IOException;importjavax.servlet.jsp.JspException;importjavax.servlet.jsp.SkipPageException;importjavax.servlet.jsp.tagext.SimpleTagSupport;/***@authorgacl

* SimpleTagSupport类实现了SimpleTag接口,

* SampleTagDemo4类继承SimpleTagSupport*/

public class SimpleTagDemo4 extendsSimpleTagSupport {/*简单标签使用这个方法就可以完成所有的业务逻辑

* @see javax.servlet.jsp.tagext.SimpleTagSupport#doTag()

* 重写doTag方法,控制标签余下的Jsp不执行*/@Overridepublic void doTag() throwsJspException, IOException {//抛出一个SkipPageException异常就可以控制标签余下的Jsp不执行

throw newSkipPageException();

}

}

tld文件中标签体类型设置细节

demo2

me.gacl.web.simpletag.SimpleTagDemo2

scriptless

开发好一个标签后,在tld文件中使用来描述一个标签,描述的内容包括标签名(name),标签处理器类(tag-class),标签体的内容(body-content)。

tld文件中有四种标签体(body-content)类型 :empty、scriptless、JSP、tagdependent

empty:表示该标签没有标签体

scriptless:表示该标签是有标签体的,但是标签体的内容不能是java代码

JSP:表示该标签是有标签体的,并且标签体的内容可以是任意的,包括java代码

tagdependent:表示标签体里面的内容是给标签处理器类使用的(tagdependent用得比较少,了解一下即可)

简单标签标签体的细节注意问题:

在简单标签(SampleTag)中标签体body-content的值只允许是empty、scriptless、tagdependent,不允许设置成JSP,如果设置成JSP就会出现异常:

The TLD for the class me.gacl.web.simpletag.SimpleTagDemo1 specifies an invalid body-content (JSP) for a SimpleTag

tld文件中用于描述标签属性的元素说明

元素的子元素用于描述自定义标签的一个属性,自定义标签所具有的每个属性都要对应一个元素

java类:

packageme.gacl.web.tag;importjava.io.IOException;importjavax.servlet.jsp.JspException;importjavax.servlet.jsp.tagext.JspFragment;importjavax.servlet.jsp.tagext.SimpleTagSupport;public class SimpleTagDemo2 extendsSimpleTagSupport{private intcount;public void setCount(intcount){this.count =count;

}

@Overridepublic void doTag() throwsJspException, IOException {

JspFragment jspFragment= this.getJspBody();for (int i = 1; i <= count; i++){

jspFragment.invoke(null);

}

}

}

tld代码

demo5

me.gacl.web.simpletag.SimpleTagDemo5

scriptless

描述标签的count属性

count

true

true

元素的子元素说明:

5fd7792ccfb0504d3eaa8818ea49f2f3.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值