目录
一.JSP自定义标签
1.JSP标签库是什么?
是一个JSP标签集合,它封装了JSP应用的通用核心功能, 基于JSP标签我们可以理解为,是JSP应该通用功能的一种封装方式。
2.为什么要自定义标签
在进行JSP页面显示处理的时候,有时候JSTL/Struts/Spring提供的标签库并不能满足项目中显示的需求,特别是对一些要求比较高的定制化服务中,可以使用自定义的标签库去处理。
3.JSP自定义标签的生命周期
二.JSP自定义标签流程
- 创建标签助手类,继承BodyTagSupport类。
我们先定义一个out标签,继承BodyTagSupport类,该标签当val属性不为空时,页面上输出该值,如果val属性值为空,就输出defaultVal(默认值)的值。
代码如下:
代码上面打了注释
package com.yjx.test;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.BodyTagSupport;
public class OutTag extends BodyTagSupport{
private String val;
private String defaultVal;
public void setVal(String val) {
this.val = val;
}
public void setDefaultVal(String defaultVal) {
this.defaultVal = defaultVal;
}
/**
* 继承BodyTagSupport类,需要将该方法重写,进行操作。
*/
@Override
public int doStartTag(){
//将数据写出到页面上
//JspWriter 通过xx.pageContext.getOut();
JspWriter out=this.pageContext.getOut();
try {
//判断val值是否为空,为空的话输出defaultVal,不为空的话就输出val的值
if(val==null||"".equals(val)) {
out.print(defaultVal);
}else {
out.print(val);
}
} catch (Exception e) {
e.printStackTrace();
}
//跳过的意思,当执行完了,就往下执行
return SKIP_BODY;
}
}
-
if标签助手类代码
该标签判断是否为真,为真就输出该标签里面的内容,如果为假就不会输出标签里面的内容
package com.yjx.test;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.BodyTagSupport;
public class IfTag extends BodyTagSupport{
private boolean test;
public void setTest(boolean test) {
this.test = test;
}
public boolean isTest() {
return test;
}
@Override
public int doStartTag() throws JspException {
if(isTest()) {
return EVAL_BODY_INCLUDE;
}
return SKIP_BODY;
}
}
- 创建标签库描述文件(tld),添加自定义标签的配置
该文件格式xxx.tld,该文件请放在WEB-INF目录下面。
<!DOCTYPE taglib
PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
"http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">
<!-- 标签库描述符 -->
<taglib xmlns="http://java.sun.com/JSP/TagLibraryDescriptor">
<tlib-version>1.0</tlib-version>
<jsp-version>1.2</jsp-version>
<short-name>Simple Tags</short-name>
<!--这里是可以换的,但是前面得加/ -->
<uri>/zking1</uri>
<tag>
<!-- 该标签的名字 -->
<name>out</name>
<!-- 将该类导入 -->
<tag-class>com.yjx.test.OutTag</tag-class>
<!-- 定义是否为空标签,空标签是指起始标签和结束标签没有值,例如</br> -->
<body-content>empty</body-content>
<!-- 设置属性 -->
<attribute>
<!-- 属性名字,该属性名字要与类中定义的属性名字相同 -->
<name>val</name>
<!-- 是否是必填,为true就是得要填,为false不是必须要填 -->
<required>true</required>
<!-- 设置是否可以使用EL表达式,设置为true就是可以使用,为false那就是不可以-->
<rtexprvalue>true</rtexprvalue>
<!--相当于一个标签的注解 -->
<description>out标签的val属性</description>
</attribute>
<!-- 定义out标签的defautVal属性 -->
<attribute>
<name>defaultVal</name>
<required>false</required>
<rtexprvalue>false</rtexprvalue>
<description>out标签的defaultVal属性</description>
</attribute>
</tag>
<tag>
<name>if</name>
<tag-class>com.yjx.test.IfTag</tag-class>
<body-content>jsp</body-content>
<attribute>
<name>test</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
<description>if标签</description>
</attribute>
</tag>
</taglib>
标签详解:
- <tag></tag>标签:里面放一个自定义标签的所有格式规范
- <name></name>标签:该标签自定义名字
- <tag-class></tag-class>标签:将标签助手类的完整类名放入。
- <body-content></body-content>标签:在该标签里面填入empty就代表该标签为空标签,就类似于<br><input>标签,输入JSP就有标签体。
- <attribute></attribute>标签:在这个标签里写我们自定义标签的属性
- <name></name>标签:在 <attribute>标签中的<name>是标签上的属性的名字,该属性名字要和助手类中的属性名字一样。
- <required></required>标签:是否是必填,为true就是得要填,为false不是必须要填
- <rtexprvalue> </rtexprvalue>标签:设置是否可以使用EL表达式,设置为true就是可以使用,为false那就是不可以
- <description>out标签的val属性</description>:自定义属性的描述
- 测试
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib prefix="z" uri="/zking1"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<!-- out标签 -->
<z:out val="哈哈哈哈" defaultVal="hhhh"/>
<z:if test="${1==1}">
hhhhh
</z:if>
</body>
</html>
今天的学习就到这里啦!!!