通知
此博客运行在jpress系统上,如果你喜欢此博客模板,请加QQ群:1061691290(whimurmur模板/jpress插件),免费下载使用

JSP自定义标签

2919人浏览 / 0人评论 | 作者:whisper  | 分类: JAVAWEB  | 标签: java web整合开发王者归来  | 

作者:whisper

链接:http://proprogrammar.com:443/article/13

声明:请尊重原作者的劳动,如需转载请注明出处


    分两个版本,JSP 1.X版和JSP 2.X版。还有一个比较简单的自定义函数。   

    一、JSP 1.X

    1. 基础版:实现Tag接口

    流程如下

    写好了类之后还要在tld文件中进行配置。tld文件可以放在web-inf下面,这样会被自动加载到。

<?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>

    如果不位于web-inf下面,要在web.xml中指定一下位置

<jsp-config>
    <taglib>
        <taglib-uri>xxx</taglib-uri>
        <taglib-location>xxx</taglib-location>
    </taglib>
</jsp-config>

    bodycontent有三种取值,empty:不允许有标签体存在, JSP:允许有标签体存在,可以为JSP代码, tagdependent:允许有标签体存在,但标签体内的代码不会被执行。

    2. 进阶版:继承TagSupport类

    已经有了 个默认的流程,只要实现doStartTag()和doEndTag()就可以了。

    如果标签带参数(属性),只需通过setter方法将属性注入即可,属性需要在tld文件中声明,如上面所写。

    rtexprvalue指明是否允许EL表达式或者Scriptlet<%= %>。如果带多个参数,就设置多个setter方法,同时在tld文件中进行相关配置。

    3:带标签体:通过BodyTag或者BodyTagSupport。

    流程如下:

    其中BodyTagSupport已经有了个默认的流程,会按照中间的线一直走。

    如果想要标签体被多次执行,可以控制doAfterBody()的返回值。doAfterBody方法内的输出是写入到bodyContent缓存中的,因此每次通过getBodyContent取出的的值会包括以前的全部输出。

    带动态属性:还需实现DynamicAttributes接口,并实现该接口的setDynamicAttribute方法,把动态属性保存起来。

    需要在tld文件中进行设置,在tag标签中加上

<dynamic-attributes>true</dynamic-attributes>

    嵌套的自定义标签

    下层标签可以通过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


亲爱的读者:有时间可以点赞评论一下

点赞(0) 打赏

全部评论

还没有评论!