JSP自定义标签

11个月前 (04-26)
自定义标签就是用户(开发者)自己定义的标签。自定义标签可以让 JSP 页面中不含有 Java 代码,只含有 HTML 代码和部分标签,就能实现业务逻辑的调用。

自定义标签的优点如下:
  • 减少 JSP 页面对脚本的需求和依赖性

  • 将 JSP 页面和业务逻辑分开,增加了程序的可维护性

  • 可重复调用相同的业务逻辑,增加了程序的可重用性


使用自定义标签步骤如下:

  1. 自定义标签实现类

  2. 编写 tld 标签库描述文件

  3. 在 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" />