jsp2的自定义标签基本用法

16 篇文章 0 订阅
1 篇文章 0 订阅
jsp规范的1.1版中增加了自定义标签库规范,自定义标签库是一种非常优秀的表现层组件技术.通过使用自定义标签库么可以在简单的标签中封装复杂的功能.
jsp标签库的作用:主要为了取代丑陋的jsp脚本.在HTML页面中插入jsp脚本有如下坏处:jsp脚本非常丑陋,难以阅读.
jsp脚本和html代码混杂,维护成本高.
html页面中嵌入jsp脚本,导致美工人员难以参与开发.
为了能够解决上述三点,需要一种可以在页面中使用的标签,这种标签具有和HTML标签类似的语法.但又可以完成jsp脚本的功能-这种标签就是jsp自定义标签.
在jsp2中开发标签库只需要如下步骤:
1.开发自定义标签处理类
2. 建立一个.tld文件.每个*.tld文件对应一个标签库,每个标签库可包含多个标签
3.在jsp文件中使用自定义标签.

开发自定义标签类
在jsp页面使用一个简单的标签时,底层实际上由标签处理类提供支持,从而可以通过简单的标签来封装复杂的功能,从而使团队更好地协作开发
自定义标签类应该继承一个父类:javax.sevlet.jsp.tegext.tagetxt.SimpleTagSupport.除此之外,jsp自定义标签类还有如下要求:
1.如果标签类包含属性,每个属性都有对应地getter和setter方法.
2.重写doTag()方法,这个方法负责生成页面内容.

建立TLD文件
TLD标签库定义,文件地后缀使tld,每个TLD文件对应一个标签,一个标签中可包含多个标签.TLD文件也称为标签库定义文件.
标签库定义文件地根元素使taglib,可以包含多个tag子元素,每个tag子元素都定义一个标签.通常我们可以到wEB容器下复制一个标签库定义文件,并在此基础上进行修改即可.
<?xml version="1.0" encoding="UTF-8"?>
<taglib xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
    version="2.0">
    <description>A tag library exercising SimpleTag handlers.</description>
    <tlib-version>1.0</tlib-version>
    

    <short-name>mytaglib</short-name>
    <uri>http://www.crazyit.org/mytaglib</uri>
    <tag>
    <name>helloWorld</name>
    <tag-class>demo.HelloWorldTag</tag-class>
    <body-content>empty</body-content>
    </tag>
</taglib>

上面地标签库定义文件也是一个标准的XML文件,该XML文件的根元素是taglib元素,因此我们每次编写标签库定义文件时都直接添加该元素即可.
taglib的子元素:
tlib-version:
指定该标签库实现的版本,这是一个作为表示的内部版本号,对程序没有太大的作用.
short-name:该标签库的默认短名,该名称通常也没有太大的用处
uri:这个属性很重要,它指定该标签库的URL,相当于指定该标签库的唯一标识,jsp页面中使用标签库文件时就是根据该URL属性来定位标签库的.

除此之外,taglib元素下可以包含多个tag元素,每个tag元素定义一个标签,tag元素下允许出现的的子元素.
name:该标签库的名称,这个子元素很重要,jsp页面中就是根据该名称来使用标签的.
tag-class:指定标签的处理类,毋庸置疑,这个子元素非常重要,它指定了标签由那个标签处理类来处理.
body-content:这个子元素也很重要.它指定标签体内容.该子元素的值可以是如下几个:
empty:指定该标签只能作为空标签使用.
tagdependent:指定标签处理类自己负责处理标签体
scriptless:指定该标签的标签体可以是静态HTML元素,表达式语言,但不允许出现jsp脚本.
dynamic-attribute:指定该标签是否支持动态属性.只有当定义动态属性标签时,才需要该子元素
jsp2规范不再推荐使用jsp,所以JSP2自定义标签的标签体中不能包含jsp脚本.所以,实际上body-content元素的值不可以时jsp.
定义了上面的标签库定义文件后,将标签库文件放在web应用的WEB-INF路径或任意子路径下,javaweb规范自动加载该文件,则该文件定义的标签库也将生效.

使用标签库
在jsp页面中确定指定的标签需要亮点
1.标签库URL:确定使用哪个标签库.
2.标签名:确定使用哪个标签

使用标签库分为以下两个步骤:
1.导入标签库:使用taglib编译指令导入标签库,就是将标签库和指定前缀关联起来
2.使用标签:在jsp页面中使用自定义标签.
<%@taglib uri="" prefix=""%>
uri:确定标签库的URL
prefix:指定标签库前缀,即所有使用该前缀的标签将由此标签库处理

案例:使用自定义标签输出"hello World",并显示当前时间.如下图:

helloWorldTag.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@taglib uri="http://www.crazyit.org/mytaglib" prefix="mytag"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<h2>标签库的内容</h2>
<mytag:helloWorld/><br>
</body>
</html>
mytaglib.tld
<?xml version="1.0" encoding="UTF-8"?>
<taglib xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
    version="2.0">
    <description>A tag library exercising SimpleTag handlers.</description>
    <tlib-version>1.0</tlib-version>
    <short-name>mytaglib</short-name>
    <uri>http://www.crazyit.org/mytaglib</uri>
    <tag>
    <name>helloWorld</name>
    <tag-class>demo.HelloWorldTag</tag-class>
    <body-content>empty</body-content>
    </tag>
</taglib>

HelloWorldTag.java
package demo;

import java.io.IOException;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.SimpleTagSupport;

public class HelloWorldTag extends SimpleTagSupport{

	@Override
	public void doTag() throws JspException, IOException {
		// TODO Auto-generated method stub
		getJspContext().getOut().write("hello World  "+new java.util.Date());
	}

}
如下图:
从实例代码中可以看出:jsp中没有了jsp脚本,jsp脚本已经被自定义标签取代了.代码看起来更简洁,明了.分工更加明确.


带属性的标签:
前面的属性标签既没有属性,也没有标签体,用法,功能都比较简单.实际上还有如下两种常用的标签:
1.带属性的标签
带属性标签必须为每个属性提供对应的setter和getter方法.
2.带标签体的标签
案例:连接数据库,使用自定义标签输出数据库中所有的信息.
如下图:
queryTag.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%@taglib uri="http://www.crazyit.org/taglib" prefix="tag"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
	<tag:QueryTag url="jdbc:mysql://localhost:3306/date" user="root"
		pass="123456" driver="com.mysql.jdbc.Driver" sql="select *from student" />
</body>
</html>

taglib.tld
<?xml version="1.0" encoding="UTF-8"?>
<taglib xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
	version="2.0">
	<description>A tag library exercising SimpleTag handlers.</description>
	<tlib-version>1.0</tlib-version>
	<short-name>taglib</short-name>
	<uri>http://www.crazyit.org/taglib</uri>
	<tag>
		<name>QueryTag</name>
		<tag-class>demo.QueryTag</tag-class>
		<body-content>empty</body-content>
		<attribute>
			<name>driver</name>
			<required>true</required>
			<fragment>true</fragment>
		</attribute>
		<attribute>
			<name>url</name>
			<required>true</required>
			<fragment>true</fragment>
		</attribute>
		<attribute>
			<name>user</name>
			<required>true</required>
			<fragment>true</fragment>
		</attribute>
		<attribute>
                        <!-- 设置该属性名,子元素的值是字符串内容 -->
			<name>pass</name>
                        <!-- 设置该属性是否为必需属性,该元素的值true或者false -->
			<required>true</required>
                         <!--设置该属性是否支持jsp,表达式等动态内容,子元素的值是true或者false -->
			<fragment>true</fragment>
		</attribute>
		<attribute>
			<name>sql</name>
			<required>true</required>
			<fragment>true</fragment>
		</attribute>
	</tag>
</taglib>


QueryTag.java(这个自定义标签,说来也奇怪,分明是让jsp脚本不跟html混淆在一起,现在又把HTML跟java一起?应该还有另一种更好的解决方式....)
QueryTag .java
package demo;

import java.io.IOException;
import java.io.Writer;
import java.sql.DriverManager;
import java.sql.ResultSet;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.SimpleTagSupport;

public class QueryTag extends SimpleTagSupport {

	public String getDriver() {
		return driver;
	}

	public void setDriver(String driver) {
		this.driver = driver;
	}

	public String getUrl() {
		return url;
	}

	public void setUrl(String url) {
		this.url = url;
	}

	public String getUser() {
		return user;
	}

	public void setUser(String user) {
		this.user = user;
	}

	public String getPass() {
		return pass;
	}

	public void setPass(String pass) {
		this.pass = pass;
	}

	public String getSql() {
		return sql;
	}

	public void setSql(String sql) {
		this.sql = sql;
	}

	private String driver;
	private String url;
	private String user;
	private String pass;
	private String sql;

	@Override
	public void doTag() throws JspException, IOException {
		// TODO Auto-generated method stub
		try {
			Class.forName(driver);
			java.sql.Connection connection = DriverManager.getConnection(url, user, pass);
			java.sql.Statement statement = connection.createStatement();
			ResultSet rSet = statement.executeQuery(sql);
			Writer out = getJspContext().getOut();
			out.write("<table border='1' cellspacing='0'>");
			while (rSet.next()) {
				out.write("<tr><td>");
				out.write(rSet.getString(1));
				out.write("</td><td>");
				out.write(rSet.getString(2));
				out.write("</td></tr>");
			}
			out.write("</table>");

		} catch (ClassNotFoundException e) {
			// TODO: handle exception
			e.printStackTrace();
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
	}

}

运行后,如下图:
数据库中:

在jsp页面中只需要使用简单的标签,即可完成"复杂"的功能:执行数据库查询,并将查询结果在页面上以表格形式显示.
自定义标签的目的:以简单的标签,隐藏复杂的逻辑.标签是表现层组件,不应该包含任何业务实现代码,更不应该执行数据库访问,它只负责显示逻辑.


案例:动态属性标签
有时候.属性的个数是不明确的,这时候,就需要借助动态属性的标签了.
动态属性标签比普通标签多了如下两个额外请求:
1.标签处理类还需要实现DynamicAttributes接口.
2.配置标签时通过<dynamic-attribute>一元素指定该标签支持动态属性.
如下图:动态添加属性名和属性值并显示在页面上
dyAtt.jsp(页面显示)
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <%@taglib uri="http://www.crazyit.org/Dytaglib"  prefix="mytag"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<mytag:DynaTag name="crazyit" url="crazyit.org"/>
<mytag:DynaTag 书名="jsp" 介格="99.0" 出版时间 = "2008" 描述="java"/>
</body>
</html>

Dytglib.tld(配置文件)
<?xml version="1.0" encoding="UTF-8"?>
<taglib xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
    version="2.0">
    <description>A tag library exercising SimpleTag handlers.</description>
    <tlib-version>1.0</tlib-version>
    <short-name>Dytaglib</short-name>
    <uri>http://www.crazyit.org/Dytaglib</uri>
    <tag>
    <name>DynaTag</name>
    <tag-class>demo.DynaTag</tag-class>
    <body-content>empty</body-content>
    <dynamic-attributes>true</dynamic-attributes>
    </tag>
    
</taglib>
DynaTag.java(自定义动态标签)
package demo;
import java.io.IOException;
import java.util.ArrayList;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.DynamicAttributes;
import javax.servlet.jsp.tagext.SimpleTagSupport;

public class DynaTag extends SimpleTagSupport implements DynamicAttributes {
	private ArrayList<String> keys = new ArrayList<String>();
	private ArrayList<Object> values = new ArrayList<Object>();

	@Override
	public void doTag() throws JspException, IOException {
		// TODO Auto-generated method stub
		JspWriter out = getJspContext().getOut();
		out.println("<ol>");
		for (int i = 0; i < keys.size(); i++) {
			String key = keys.get(i);
			Object value = values.get(i);
			out.println("<li>" + key + "=" + value + "</li>");
		}
		out.println("</ol>");
	}

	@Override
	public void setDynamicAttribute(String url, String loca, Object value) throws JspException {
		// TODO Auto-generated method stub
		keys.add(loca);
		values.add(value);
	}

}
关于自定义标签还有以下两种情况(后续补充):


1.带标签体的标签


2.以页面片段作为属性的标签


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值