JSP自定义标签

mac2022-06-30  20

分两个版本,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

转载于:https://www.cnblogs.com/liunianfeiyu/p/7417391.html

相关资源:jsp权限控制,jsp自定义标签实现
最新回复(0)