自定义JSP标签

一、自定义JSP标签的执行过程

当一个含有自定义标签的JSP页面被JSP引擎(Web容器)转译成Servelt时,JSP引擎遇到自定义的标签,会把这个自定标签标识成对一个称为“标签处理类”的调用。当这个JSP页面被执行时,JSP引擎就会调用这个“标签处理类”对象,并执行其内部定义的相应操作方法,从而完成相应的功能。

从这个执行过程来看,自定义标签就是把原来编写在JSP页面的Java代码单独封装到一个Java类中,当调用自定义标签时,其实是映射调用相应的“标签处理类”来完成工作。

二、自定义JSP标签的开发流程

使用Java处理类来开发自定义JSP标签时,主要分为以下几个步骤:

(1) 创建标签的处理类(Tag Handle Class)这个类用来定义标签的行为,并在JSP引擎遇到自定义标签时调用执行。标签处理类是一个Java类,这个类只需要继承了JSP标签API中提供的接口或类就可以很简单地实现自定义JSP标签的具体功能。

(2) 创建标签库描述文件(Tag Library Descriptor File)。这个文件是描述标签库的XML文档,它描述了标签库中每个标签的属性详细信息,向JSP引擎提供有关自定义标签的标签处理程序的信息。

(3) 在web.xml文件中声明TLD的位置。(在使用一些集成框架时,这个步骤不是必须的。 例如在下面的例子中用到了spring,只要在jsp中引入即可使用。)

(4) 在JSP文件中用taglib指令引入标签库,然后使用标签库描述文件中指定的标签名来使用它。

三、JSP标签API

Javax.servlet.jsp.tagext包

JSP 1.1和1.2规范中常用的接口主要有以下3个。

Tag:此接口定义对于所有标签处理类都需要实现的方法。

IterationTag:此接口扩展了Tag接口,增加了控制重复执行标签主体的方法。

BodyTag:此接口扩展了IterationTag接口,并增加了访问和操作标签主体内容的方法。

JSP API针对这3个接口还提供了两个支持类,即TagSuppor和BodyTagSupport,用来简化自定义标签的开发。

四、标签库描述符

标签库描述符文件是一个以“.tld”结尾的标准XML文档,用来记录一个标签库内拥有哪些标签、第个标签包含哪些属性。

<taglib>元素是标签库描述符的根元素,它包含12个子元素,如

1. <description>:标签库的一个文本描述。

2. <tlib-version>:指定标签库的版本。

3. <short-name>:为标签定义简短的名字,在taglib指令中可作为首选的前缀名使用。

4. <uri>:定义一个URL,用于唯一地标识些标签库。

5. <tag>:用于指定自定义标签的相关信息。<tag>元素有12个子元素,这里只对部分元素做介绍,如下:

a) <description>:为自定义标签提供一个文本描述。

b) <display-name>:为标签指定一个简短的名字。

c) <name>:指定标签的名字。

d) <tag-class>:指定标签处理类的完整路径。

e) <body-content>:指定标签体的格式。格式有四种:

² empty:标识标签没有标签体。

² scriptless:表示标签体可以包含EL表达式和JSP的动作元素,但是不能包含JSP的脚本元素。

² JSP:表示标签体可以包含JSP代码。

² tagdependent:表示标签体由标签本身去解析处理。若指定tagdependent,那么在标签体中所写的代码将作为纯文本原封不动地传给处理类,而不是将执行的结果传给标签处理类。

f)<attribute>:该标签用于设置标签的属性。该元素有6个子元素。具体如下:

² <description>:为属性提供一个文本描述

² <name>:指定属性的名字

² <required>:指定该属性是否必须。默认为false

² <rtexprvaalue>:指定属性值是否可以在JSP运行时期动态产生

² <type>:指定属性的类型

² <fragment>:指定属性是否为JspFragment对象,默认false

g)<example>:用于提供一个使用该标签例子的信息描述。

h)<variable>:定义标签处理类提供给JSP页面使用的脚本变量。

i)<dynamic-attributes>:指定标签是否支持动态属性,取值是否支持动态属性,取值为true或者false。

j)<icon>、<tag-extension>、<tei-class>

6、<display-name>:为标签库指定一个简短的别名。

7、<small-icon>:为标签库指定大小为16x16的小图标(gif或jpeg格式),该图标可在图形界面工具中显示。

8、<large-icon>:为标签库指定大小为32x32的小图标(gif或jpeg格式),该图标可在图形界面工具中显示。

9、<validator>:为标签库提供一个验证器。

10、<listener>:为标签库提供一个监听器。

11、<tag-file>:用于描述标签文件。

12、<function>:用于指定在表达式语言中使用的函数。

--------------------------------------------------------------------以上内容为转载------------------------------------------------------------------

实践代码:<这是一个自己写的例子,测试通过>

1、创建标签的处理类(Tag Handle Class

package org.test.zTest;

import java.io.IOException;

import javax.servlet.jsp.JspException;

import javax.servlet.jsp.JspWriter;

import javax.servlet.jsp.tagext.TagSupport;

public class TagTest extends TagSupport {

private static final long serialVersionUID = 3095327982159183182L;

// 自定义标签的部分属性

private String name;

private String type;

private String value = null;

private String onclick;

private String show;

private String id;

public String getShow() {

return show;

}

public void setShow(String show) {

this.show = show;

}

public String getName() {

return name;

}

public String getId() {

return id;

}

public void setId(String id) {

this.id = id;

}

public void setName(String name) {

this.name = name;

}

public String getType() {

return type;

}

public void setType(String type) {

this.type = type;

}

public String getValue() {

return value;

}

public void setValue(String value) {

this.value = value;

}

public String getOnclick() {

return onclick;

}

public void setOnclick(String onclick) {

this.onclick = onclick;

}

@Override

public int doStartTag() throws JspException {

return SKIP_BODY;

}

@Override

public int doEndTag() throws JspException {

StringBuffer bufHtml = new StringBuffer();

if(!(show == null || "".equals(show)) && "label".equals(show)) {

bufHtml.append("<label ");

if (!(id == null || "".equals(id))) {

bufHtml.append("id=\"" + id + "\" ");

}

bufHtml.append(">"+value+"</label>");

}else {

bufHtml.append("<input ");

if (!(name == null || "".equals(name))) {

bufHtml.append("name=\"" + name + "\" ");

}

if (!(type == null || "".equals(type))) {

bufHtml.append("type=\"" + type + "\" ");

}

if (!(value == null || "".equals(value))) {

bufHtml.append("value=\"" + value + "\" ");

}

if (!(onclick == null || "".equals(onclick))) {

bufHtml.append("οnclick=\"" + onclick + "\" ");

}

bufHtml.append("/>");

}

JspWriter out = this.pageContext.getOut();

try {

out.print(bufHtml.toString());

} catch (IOException e) {

e.printStackTrace();

}

return EVAL_PAGE;

}

}

2、创建标签库描述文件(Tag Library Descriptor FiletestTag.tld

<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN""http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">

<taglib>

<tlib-version>1.0</tlib-version>

<jsp-version>1.2</jsp-version>

<short-name>csdn</short-name>

<uri>http://www.csdn.com</uri>

<description>

<![CDATA[Custom tag library for this application]]>

</description>

<tag>

<name>testTag</name>

<tag-class>org.test.zTest.TagTest </tag-class>

<body-content>jsp</body-content>

<attribute>

<name>show</name>

<required>true</required>

</attribute>

<attribute>

<name>name</name>

<required>false</required>

</attribute>

<attribute>

<name>type</name>

<required>false</required>

</attribute>

<attribute>

<name>value</name>

<required>false</required>

</attribute>

<attribute>

<name>onclick</name>

<required>false</required>

</attribute>

<attribute>

<name>id</name>

<required>false</required>

</attribute>

</tag>

</taglib>

3、在JSP文件中用taglib指令引入标签库

<%@ page language="java"import="java.util.*"pageEncoding="GBK"%>

<%@ taglib uri="/WEB-INF/testTag.tld"prefix="jc"%>

<!DOCTYPEHTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>

<head>

<title>My JSP 'tagTest.jsp' starting page</title>

<metahttp-equiv="pragma"content="no-cache">

<metahttp-equiv="cache-control"content="no-cache">

<metahttp-equiv="expires"content="0">

<metahttp-equiv="keywords"content="keyword1,keyword2,keyword3">

<metahttp-equiv="description"content="This is my page">

</head>

<scripttype="text/javascript">

function showClick() {

alert("test OK!");

}

</script>

<body>

输入文字:

<jc:testTagshow="input"name="inFont"type="text"/>

<br/>

输入密码:

<jc:testTagshow="label"id="inPsW"value="Test Ok"></jc:input>

<br/>

按钮提交:

<jc:testTag show="input"name="btnSubmit"type="submit"value="提交"/>

<br/>

按钮重置:

<jc:testTag show="input"name="btnReset"type="reset"onclick="clearContent();"value="重置"/>

<br/>

测试按钮:&nbsp;

<jc:testTag show="input"name="btnClick"type="reset"onclick="showClick();"value="按钮"/>

</body>

</html>

<完>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值