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自定义标签的主要内容,如果未能解决你的问题,请参考以下文章

JSP自定义tag控件标签

jsp自定义标签

[Java] JSP笔记 - 自定义标签

JSP自定义标签的使用简化版

自定义标签

13.自定义标签