Servlet 自定义标签
自定义标签
1)用户定义的一种jsp标记,当一个含有自定义标签的jsp页面被jsp引擎编译成servlet时,tag标签被转化成了对一个称为 标签处理类 的对象的操作。于是,当jsp页面被jsp引擎转化为servlet后,实际上tag标签被转化为了对tag处理类的操作。
2)所有的标签处理器类都要实现 jsptag 接口,该接口中没有定义任何方法,主要作为 tag 和 simpletag 接口的父接口。编写完成标签功能的 java 类(标签处理器)
public class foreachtag extends simpletagsupport{
private collection<?> items;//集合变量名
public void setitems(collection<?> items) {
this.items = items;
}
private string var;//变量
public void setvar(string var) {
this.var = var;
}
@override
public void dotag() throws jspexception, ioexception {
if(items != null){
for(object obj: items){
// 遍历的对象放入到 pagecontext
getjspcontext().setattribute(var, obj);
//把标签体的内容直接输出到页面上.
getjspbody().invoke(null);
}
}
}
}
3)编写标签库描述(tld)文件,在tld文件中对自定义中进行描述
标签库描述(tag library description)文件简称为 tld 文件,其扩展名为 .tld,多个标签的集合就形成了一个标签库,标签库中的所有标签都必须在标签文件中进行描述。tld 文件可以放置在 web 应用程序的 web-inf 目录及其子目录中,但不能放置在 web-inf 目录下的 classes 和 lib 子目录中 。
<?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>mytag 1.2 core library</description>
<display-name>mytag core</display-name>
<tlib-version>1.2</tlib-version>
<short-name>myself</short-name>
<uri>http://myself.com/mytag/core</uri>
<tag>
<name>foreach</name>
<tag-class>com.demo.tag.foreachtag</tag-class>
<body-content>scriptless</body-content>
<attribute>
<name>items</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>var</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
<tag>
<name>choose</name>
<tag-class>com.demo.tag.choosetag</tag-class>
<body-content>scriptless</body-content>
</tag>
<tag>
<name>when</name>
<tag-class>com.demo.tag.whentag</tag-class>
<body-content>scriptless</body-content>
<attribute>
<name>test</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
<tag>
<name>otherwise</name>
<tag-class>com.demo.tag.otherwisetag</tag-class>
<body-content>scriptless</body-content>
</tag>
</taglib>
4) 在 jsp 页面使用 taglib 指令引入标签库描述文件:
<%@ taglib prefix=“” uri=“” %> uri:属性用于指定所引入的标签库描述(tld)文件中所定义的 <uri> 元素的内容;prefix 属性用于为引入的 tld 文件指定一个”引用代号”。prefix 属性可以由 jsp 文件的作者任意指定,只要与其他 taglib 指令的 prefix 属性值不同就可以。
<%@page import="com.demo.tag.customer"%>
<%@page import="java.util.arraylist"%>
<%@page import="java.util.list"%>
<%@ page language="java" contenttype="text/html; charset=utf-8" pageencoding="utf-8"%>
<%@ taglib prefix="myself" uri="http://myself.com/mytag/core" %>
<!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>show mytag</title>
</head>
<body>
<%
list<customer> customers = new arraylist<customer>();
customers.add(new customer(1, "aaa"));
customers.add(new customer(2, "bbb"));
customers.add(new customer(3, "ccc"));
customers.add(new customer(4, "ddd"));
customers.add(new customer(5, "eee"));
request.setattribute("customers", customers);
%>
<myself:foreach items="${requestscope.customers }" var="cust">
--${pagescope.cust.id } -- ${cust.name } <br>
</myself:foreach>
<br><br>
<myself:choose>
<myself:when test="${param.age > 30}">中年...</myself:when>
<myself:when test="${param.age > 20}">青年...</myself:when>
<myself:otherwise>少年...</myself:otherwise>
</myself:choose>
</body>
</html>
5)访问http://127.0.0.1:8080/demo/tag/test.jsp?age=30