JSP自定义标签
自定义标签的优点如下:
减少 JSP 页面对脚本的需求和依赖性
将 JSP 页面和业务逻辑分开,增加了程序的可维护性
可重复调用相同的业务逻辑,增加了程序的可重用性
使用自定义标签步骤如下:
自定义标签实现类
编写 tld 标签库描述文件
在 JSP 页面中使用自定义标签
自定义标签的语法
使用 taglib 指令指定 tld 文件的路径。<%@ taglib prefix="ex" uri="WEB-INF/custom.tld"%>
其中:prefix 指定自定义标签的前缀,uri 指定 tld 文件的路径。使用自定义标签有以下 2 种格式:
<prefix:tagname attr1=value1....attrn=valuen />
或
<prefix:tagname attr1=value1....attrn=valuen >
标签体
</prefix:tagname>
其中:prefix 表示自定义标签的前缀,tagname 表示自定义标签的名称,attr 表示自定义标签的属性,value 表示自定义标签的属性值。简单示例
下面创建一个简单的自定义标签 <bc:Hello>。1. 创建处理标签的Java类
创建处理标签的 HelloTag 类,代码如下:
package net.biancheng;
import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.SimpleTagSupport;
public class HelloTag extends SimpleTagSupport {
public void doTag() throws JspException, IOException {
JspWriter out = getJspContext().getOut();
out.println("欢迎来到编程帮,我们的网址是:www.biancheng网站站点" rel="nofollow" />
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE taglib
PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
"http://java.su网站站点" rel="nofollow" />
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="bc" uri="WEB-INF/tlds/custom.tld"%>
<!DOCTYPE html>
<html>
<head>
<title>编程帮(www.biancheng网站站点" rel="nofollow" />
图 1 自定义标签运行结果
tld标签库描述文件
tld 文件中常用的标签有 taglib、tag、attribute 和 variable。下面以 custom.tld 文件为例介绍其含义。1. <taglib>标签
<taglib> 标签用来设置整个标签库信息,其说明如下表所示。属 性 | 说 明 |
|---|---|
tlib-version | 标签库版本号 |
jsp-version | JSP版本号 |
short-name | 当前标签库的前缀 |
uri | 页面引用的自定义标签的 uri 地址 |
name | 自定义标签名称 |
tag-class | 自定义标签实现类路径 |
description | 自定义标签的功能描述 |
attribute | 自定义标签的指定属性,可以有多个 |
2. <tag>标签
<tag> 标签用来定义标签具体的内容,其说明如下表所示。属 性 | 说 明 |
|---|---|
name | 自定义标签名称 |
tag-class | 自定义标签实现类 |
body-content | 有 3 个值:empty(表示没有标签体)、JSP(表示标签体可以加入 JSP 程序代码)、tagdependent(表示标签体中的内容由标签自己处理) |
description | 自定义标签的功能描述 |
attribute | 自定义标签功能的指定属性,可以有多个 |
variable | 自定义标签的变量属性 |
3. <attribute>标签
<attribute> 标签用来定义 <tag> 标签中的属性,其说明如下表所示。属 性 | 说 明 |
|---|---|
name | 属性名称 |
description | 属性描述 |
required | 指定属性是否是必须的,默认值:false |
rtexprvalue | 属性值是否支持 JSP 表达式 |
type | 定义该属性的 Java 类型,默认值:String |
fragment | 如果声明了该属性,属性值将被视为一个 JspFragment |
使用 <attribute> 的属性时要注意元素顺序。
4. <variable> 标签
<variable> 标签用来定义 <tag> 标签中的变量属性,其说明如下表所示。属 性 | 说 明 |
|---|---|
declare | 变量声明 |
description | 变量描述 |
name-from-attribute | 指定的属性名称,其值为变量,在调用 JSP 页面时可以使用的名字 |
name-given | 变量名(标签使用时的变量名) |
scope | 变量的作用范围,有 3 个值:NESTED 开始和结束标签之间、AT_BEGIN 从开始标签到页面结束、AT_END 从结束标签之后到页面结束 |
variable-class | 变量的 Java 类型,默认值:String |
自定义标签属性
在自定义标签中设置属性,自定义标签类中必须有相应的 setter 方法。为 <bc:Hello> 标签添加 message 属性,HelloTag 类代码如下:
package net.biancheng;
import java.io.IOException;
import java.io.StringWriter;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.SimpleTagSupport;
public class HelloTag extends SimpleTagSupport {
private String message;
public void setMessage(String message) {
this.message = message;
}
StringWriter sw = new StringWriter();
public void doTag() throws JspException, IOException {
if (message != null) {
// 从属性中使用 message
JspWriter out = getJspContext().getOut();
out.println(message);
} else {
// 从内容中使用 message
getJspBody().invoke(sw);
getJspContext().getOut().println(sw.toString());
}
}
}
下面使用 <attribute> 标签为 <bc:Hello> 标签添加 message 属性:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE taglib
PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
"http://java.su网站站点" rel="nofollow" />
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="bc" uri="WEB-INF/tlds/custom.tld"%>
<!DOCTYPE html>
<html>
<head>
<title>编程帮(www.biancheng网站站点" rel="nofollow" />
<bc:Hello>
欢迎来到编程帮,我们的网址是:www.biancheng网站站点" rel="nofollow" />
package net.biancheng;
import java.io.IOException;
import java.io.StringWriter;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.SimpleTagSupport;
public class HelloTag extends SimpleTagSupport {
StringWriter sw = new StringWriter();
public void doTag() throws JspException, IOException {
getJspBody().invoke(sw);
getJspContext().getOut().println(sw.toString());
}
}
修改 custom.tld 文件,如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE taglib
PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
"http://java.su网站站点" rel="nofollow" />
- 随机文章
- 核心危机(核心危机魔石合成攻略)
- 风儿(风儿轻轻的吹)
- 儿童教育文章(儿童教育)
- 抖音卡(抖音卡顿怎么解决)
- xboxones(xboxone手柄怎么配对主机)
- 兵马俑(兵马俑介绍和历史背景)
- 陈武简历
- 帆船比赛(帆船比赛视频)
- 海猫鸣泣之时游戏(海猫鸣泣之时游戏在哪玩)
- 韩国媳妇和小雪(韩国媳妇和小雪的父亲工资是多少)
- 儋州市第二中学(儋州市第二中学录取分数线)
- 鬼泣5攻略(鬼泣5攻略第三关怎么跳)
- 地球日主题(2020年世界地球日主题)
- 和柳亚子(和柳亚子先生于田)
- 冰客(冰客果汁)
- 国外成人游戏(国外成人游戏注册需要visa信用卡)
- 充值卡代理(充值卡代理加盟)
- 东天目山(东天目山景区)
- 杭同(杭同培训中心怎么样)
- 蝙蝠给人类的一封信(蝙蝠给人类的一封信)
- 大松电饭煲(美的大松电饭煲)
- 服饰加盟(服饰加盟店招商)
- 疯狂填字(疯狂填字5)
- 点对点短信息(点对点短信息费是什么意思)
- 观音普门品(观音普门品念诵全文)
- 河北省大运会(河北省大运会时间)
- 哈利波特官网(哈利波特官网在哪里)
- 骇客神条(骇客神条怎么辨别真假)
- 杜星霖(杜星霖图片)
- 查传倜(查传倜个人生活)

