码迷,mamicode.com
首页 > Web开发 > 详细

JSP自定义标签

时间:2017-08-23 13:50:46      阅读:337      评论:0      收藏:0      [点我收藏+]

标签:分享   页面   比较   自定义   script   img   desc   blog   动态   

分两个版本,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自定义标签

标签:分享   页面   比较   自定义   script   img   desc   blog   动态   

原文地址:http://www.cnblogs.com/liunianfeiyu/p/7417391.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!