在jsp开发时,当jsp内置标签以及JSTL标签库都满足不了需求时,可以根据自己的需求来自定义标签。其实在jsp页面使用标签就等同于调用某个对象的某个方法。
自定义标签步骤:先定义标签处理类(如继承SimpleTagSupport类),再编写TLD文件(标签库描述库文件)。
定义标签类可以编写一个实现SimpleTag接口的类,
public class MyTag1 implements SimpleTag {
private PageContext context;
private JspFragment body;
@Override
public void doTag() throws JspException, IOException {
context.getOut().print("这是一个自定义标签");
}
@Override
public JspTag getParent() {
return null;
}
//下面三个方法都在doTag方法之前被tomcat之前调用,所以在doTag方法中就可以使用传递过来的对象
//设置标签体
@Override
public void setJspBody(JspFragment body) {
this.body =body;
}
//设置jsp上下文对象,它子类是PageContext
@Override
public void setJspContext(JspContext context) {
this.context = (PageContext) context;
}
//设置父标签
@Override
public void setParent(JspTag arg0) {
}
}
上面代码中的doTag()的方法是每次执行标签都会调用的方法,在这个方法之前有setJspBody()、setJspContext()以及setParent()方法都会比doTag先给Tomcat(服务器)调用,所以把传递过来的对象赋值给成员变量后,就可以在doTag方法里面就可以使用传过来的对象了(这里没有用到父标签所以setParent方法体没写代码),其中在doTag方法里面使用PageContext对象获取输出流输出了一句字符串。
编写好标签处理类后,还需要在配置tld文件。
一般tld文件都放在WEB-INF下,这样可以保证客户端访问不到
tld文件代码(其实是一个xml)
<?xml version="1.0" encoding="UTF-8" ?><taglib xmlns=“http://java.sun.com/xml/ns/javaee”
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd"
version=“2.1”>
1.0
tag
http://www.tianye.cn/tag1.0 >
MyTag1<!—指定当前标签名称 -->
cn.tianye.tag.MyTag1<!—指定当前对应标签出处理类 -->
empty
上面需要这注意的是元素的可选值有
empty:也就是没有标签体(如果在这里设置的是empty,那么在jsp页面上就不能有标签体。)
JSP:传统标签支持它,SimpleTag已经不支持使用JSP
(标签内容是可以有任何东西,比如EL,JSTL,HTML以及<%%>等)
scriptless:标签体内容不能是java脚本,可以是EL,JSTL,字符串等,在SimpleTag中需要标签体可以使用这选项。
tagdependent:标签体内容不作运算,全由标签处理类自行处理,无论标签体内容是EL,JSTL等,都不会作运算。(这个基本没有人会使用,因为用起来太麻烦,什么都要自己处理)
配置好tld文件后就可以在jsp页面上使用了,在使用自定义标签之前,需要先使用指令导入标签库。
使用taglib导入标签库,uri是tld文件的存放位置
<%@taglib prefix=“t” uri="/WEB-INF/tlds/tianye.tag.tld" %>
使用自定义标签
效果
自定义有标签体的标签
首先需要获取标签体对象(JspBody)、把标签体内容输出到页面、tld中指定标签内容格式为scriptless。
标签处理类代码
public class MyTag3 extends SimpleTagSupport {
@Override
public void doTag() throws JspException, IOException {
this.getJspContext().getOut().print("***************
");
//执行标签体的内容,把结果输出到页面
Writer writer = this.getJspContext().getOut();
this.getJspBody().invoke(writer);
this.getJspContext().getOut().print("
***************");
}
}注:上面的类继承了SimpleTagSupport类(SimpleTagSupport类实现了SimpleTag接口,也就是它已经把所有Tomcat(服务器)传递的对象保存了,不需要我们自己操作保存传递过来的对象了,同时也提供了get方法供子类调用),重写了doTag()方法,然后调用对象获取当前jsp输出流,执行标签体内容,把结果写入指定流中即输出到页面上。
tld文件(也就是可选项改为scriptless,其他跟前面的一样)
MyTag3
cn.tianye.tag.MyTag3
scriptless
在jsp页面上使用标签(可以标签体可以是EL,也可以是字符串)
<%request.setAttribute(“title”, “It doesn’t matter where you came from,”); %>
${requestScope.title }
what matters is who you choose to be.
效果
其中还可以自定义带有属性的标签,这里就不过多描述
————————————————
版权声明:本文为CSDN博主「田野上的风筝」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_43100896/article/details/90245839