jsp_自定义简单标签
程序员文章站
2022-06-09 09:49:20
...
1: 自定义简单标签
1): 为什么要自定义标签, 因为当内置标签与JSTL标签等不能满足我们的需求时
这时则需要我们程序员自定义一些功能标签
2: 自定义标签入门
1): 创建一个标签处理类,需要继承SimpleTagSupport类(这个类会实现SimpleTag接口)
2): 重写doTag方法,在这个方法里边可以写我们的逻辑代码(这个doTag由容器来调用)
如: public class HelloTag extends SimpleTagSupport{
@Override
public void doTag() throws JspException, IOException {
System.out.println("Hello 小红");
}
}
3): 接着在WEB-INF目录下创建.tld标签库文件,把页面的标签与标签处理类关联起来
<?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">
<!-- 描述 -->
<description>tz 1.0 core library</description>
<!-- 显示名称 -->
<display-name>tz core</display-name>
<!-- 版本 -->
<tlib-version>1.0</tlib-version>
<!-- 建议使用的标签前缀 -->
<short-name>tz</short-name>
<!-- tld文件的唯一标识 -->
<uri>http://www.tz.com/jsp/tz/core</uri>
<tag>
<!-- 标签名 -->
<name>hello</name>
<!-- 标签处理类的全类名 -->
<tag-class>com.tz.servlet.tag.HelloTag</tag-class>
<!-- 标签体的格式 -->
<body-content>empty</body-content>
</tag>
</taglib>
4: 在taglib指定引入自定义标签即可
5: 在页面就能使用 如: <tz:hello/>
2: 在标签处理中获取九个对象
因为容器会自动调用simpleTag接口的setJspContext(JspContext pc)方法,且会把一个PageContext对象传入
所以我们可以通过这个方法拿到那个传入的PageContext对象,从而拿到其它的对象
因为继承SimpleTagSupport类已经实现了SimpleTag接口,且给我们提供了一个getJspContext方法来获取PageContext对象
所以我们可以直接通过this.getJspContext()即可获取
3: 自定义带属性的标签
1): 在tld文件中配置添加<attribute>标签
如: <tag>
<name>myset</name>
<tag-class>com.tz.servlet.tag.SetTag</tag-class>
<body-content>empty</body-content>
<attribute>
<!-- 属性名 -->
<name>var</name>
<!-- 表示 这个属性是否必须 的 -->
<required>true</required>
<!-- 表示这个属性是否 可以接收 运行时的表达式的值(如 EL表达式) -->
<rtexprvalue>false</rtexprvalue>
</attribute>
</tag>
2: 在自定义的java类可以设置成员变量和set方法来设置接收属性值
变量我即就是标签中的属性名
ps: 属性名要与标签处理类里的属性一样
4: 自定义一个可以输出标签体的标签
1): 先需要在标签处理类中拿到一个封装标签体信息的对象--JspFragment对象
2): 因为容器在调用setsetJspBody(JspFragment jspBody)会把这个对象传入,即我们可以在这个方法里来获取,也可以直接this.getJspBody()直接获取
3): 在doTag方法中使用JspFragment对象的方法jspBody.invoke(Writer w)把信息从一个Writer中输出
@Override
public void doTag() throws JspException, IOException {
PageContext pageContext = (PageContext) this.getJspContext();
//判断test属性值 是"true" 还是 "false"
if("true".equalsIgnoreCase(test)) {
JspFragment jspBody = this.getJspBody();
/*
StringWriter sw = new StringWriter();
//获取标签体的信息
jspBody.invoke(sw);
String value = sw.toString();
//向浏览器输出标签体的信息
pageContext.getOut().write(value);
*/
//如果invoke方法里的参数为null,则会直接输出
jspBody.invoke(null);
}
}
ps: 因为继承的SimpleTagSupport类有实现SimpleTag接口且给我们提供了一个getJspBody方法来获取JspFragment对象
所以我们可以直接this.getJspBody()即可以拿到JspFragment对象
ps: 对于invoke(Writer w)方法 如果 里边的参数为null, 则就会直接向页面输出内容
4): 在tld在配置
<tag>
<name>myif</name>
<tag-class>com.tz.servlet.tag.IfTag</tag-class>
<!-- 设置标签体的格式 -->
<body-content>tagdependent</body-content>
</tag>
ps: 标签体内容的格式一般有如下几种
empty: 没有标签体
scriptless: 有标签体,且表示,可以在标签体里边使用EL表达式或者jsp标签
tagdependent: 有标签体, 会把内容完全交给标签本身处理,把内容原封不动的输出
5: 自定义标签父-子标签
如: <tz:parent scope="application">
<tz:son var="name" value="小红妹妹"/>
</tz:parent>
ps: 父标签是把子标签把标签内容输出的,所以要注意在父标签的doTag方法输出