JSP自定义标签
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JSP自定义标签相关的知识,希望对你有一定的参考价值。
分两个版本,JSP 1.X版和JSP 2.X版。还有一个比较简单的自定义函数。
一、JSP 1.X
1. 基础版:实现Tag接口
流程如下
写好了类之后还要在tld文件中进行配置。tld文件可以放在web-inf下面,这样会被自动加载到。
如果不位于web-inf下面,要在web.xml中指定一下位置
<jsp-config> <taglib> <taglib-uri>xxx</taglib-uri> <taglib-location>xxx</taglib-location> </taglib> </jsp-config>
<?xml version="1.0" encoding="UTF-8" ?> <taglib .....> <taglibversion>1.0</taglibversion> <jspversion>1.1</jspversion> <shortname>xxx</shortname> <uri>xxxxxxx</uri> <info>xxxx</info> <tag> <name>xxx</name> <tagclass>xxx</tagclass> <bodycontent>xxx</bodycontent> <info>xxx</info> <attribute> <name>xxx</name> <required>true</required> <rtexprvalue>true</rtexprvalue> </attribute> </tag> </taglib>
bodycontent有三种取值,empty:不允许有标签体存在, JSP:允许有标签体存在,可以为JSP代码, tagdependent:允许有标签体存在,但标签体内的代码不会被执行。
2. 进阶版:继承TagSupport类
已经有了 个默认的流程,只要实现doStartTag()和doEndTag()就可以了。
如果标签带参数(属性),只需通过setter方法将属性注入即可,属性需要在tld文件中声明,如上面所写。
rtexprvalue指明是否允许EL表达式或者Scriptlet<%= %>。如果带多个参数,就设置多个setter方法,同时在tld文件中进行相关配置。
3:带标签体:通过BodyTag或者BodyTagSupport。
流程如下:
其中BodyTagSupport已经有了个默认的流程,会按照中间的线一直走。
如果想要标签体被多次执行,可以控制doAfterBody()的返回值。doAfterBody方法内的输出是写入到bodyContent缓存中的,因此每次通过getBodyContent取出的的值会包括以前的全部输出。
4:带动态属性:还需实现DynamicAttributes接口,并实现该接口的setDynamicAttribute方法,把动态属性保存起来。
需要在tld文件中进行设置,在tag标签中加上
<dynamic-attributes>true</dynamic-attributes>
5:嵌套的自定义标签
下层标签可以通过getParent方法获取上层标签的对象,通过其getter,setter方法获取其属性。父标签则可以通过getBodyContent在标签体执行结束后获取标签体的内容。或者子标签将相关数据通过父标签的getter,setter方法传给父标签。
二、JSP 2.X
实现SimpleTag接口,实现doTag方法,同时支持参数和标签体。使用时一般会继承SimpleTagSupport类。
doTag内通过getJspContext().getOut()获取out对象。
如果带标签体,通过getJspBody获取标签体,返回对象是一个JspFragment, 调用jspFragment.invoke(Writer)方法将内容写到相应输出中,writer为null时写到页面。
此时的tld文件要做相关改变,bodycontent变为tagdependent
如果带多个标签体,需要借助jsp:attribute标签。
<taglib:multiAttribute> <jsp:attribute name="xxx">xxxx</jsp:attribute> <jsp:attribute name="xxx">xxxx</jsp:attribute> </taglib:multiAttribute>
这样在类中要设置两个属性,类型为JspFragment。在tld文件中对属性进行设置。去掉rtexprvalue,增加
<fragment>true</fragment>
三、自定义函数
1. 写一个函数类,里面添加要自定义的静态方法。
2. 在tld文件中对函数进行描述。
<function> <description>xxx</description> <name>xxx</name> <function-class>xxx</function-class> <function-signature>xxx</function-signature> <example>xxx</example> </function>
function-signature即类似 java.lang.String substring(java.lang.String, int)的返回值全类名 方法名(参数全类名...),如果为数组,列表之类还要加上L
以上是关于JSP自定义标签的主要内容,如果未能解决你的问题,请参考以下文章