jsp自定义标签概述:
jsp在jsp1.1版本中增加了自定义标签,自定义标签是一种非常优秀的表现层组件技术,通过使用自定义标签库可以在简单的标签中封装非常复杂的功能。
为什么要是用自定义标签?
>.jsp脚本非常的丑陋,难以维护。
>.jsp脚本和HTML代码混合在一起,维护成本高。
>.jsp脚本和HTML代码混合在一起,导致美工人员难以参与开发。
基于以上的三点考虑,我们需要一种可以在html界面中使用,符合html规范,但又能完成jsp脚本功能的组件技术--这就是jsp的自定义标签。
jsp自定义标签在jsp1中非常的复杂,jsp2简化了标签库的开发,在jsp2中开发一个自定义标签一般需要三个步骤:
1,开发自定义标签处理类。
2,建立一个*.tld文件,每个 *.tld文件对应一个标签类,每个标签类中可包含多个标签。
3,在jsp中使用自定义标签。
2,简单的自定义标签输出 helloWorld
-->1,开发自定义标签:
要想jsp界面中正常使用标签,必须要有底层的代码的支持,这些代码被称为标签处理类,里面封装了复杂的功能,在jsp界面使用标签调用即可。如果想要这个类能正常的作为标签处理类,有三个前提:
a:自定义标签类都必须继承一个父类:javax.servlet.jsp.tagest.SimpleTagSupport.
b:如果标签类中包含属性,每个属性必须有对应的set()和get()方法。
c:必须重写doTag()方法,这个方法负责生成页面的内容。
标签处理类:HelloWorld.java
package www.cslc.com;
import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.SimpleTagSupport;
public class HelloWorld extends SimpleTagSupport{
public void doTag() throws JspException,IOException{
getJspContext().getOut().write("hello world ! ! !");
}
}
2:建立tld文件:
tld是tag library definition的缩写,即自定义标签库,文件的后缀是tld,每个tld文件对应一个标签库,一个标签库中可能有多个标签,tld文件也称为标签库的自定义文件。
tld文件的源例子可以在tomcat中找到:tomcat\webapps\example\WEB-INF\jsp2路径下有tld文件,这就是一个范例,修改后作为自己的tld文件:
tld文件必须放在web应用的WEB-INF路径或者其子目录下才能被加载使用。
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">
<tlib-version>1.0</tlib-version>
<short-name>MySimpleTagLibrary</short-name>
<!-- 自定义标签库块开始 -->
<uri>http://www.clsc.com/mytaglib</uri>
<tag>
<name>helloWorld</name>
<tag-class>www.cslc.com.HelloWorld</tag-class>
<body-content>empty</body-content>
</tag>
<!-- 自定义标签库块结束 -->
</taglib>
MyJsp.jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ taglib uri="http://www.clsc.com/mytaglib" prefix="mytaglib"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
</head>
<body>
<mytaglib:helloWorld/>
</body>
</html>
部署工程到tomcat,启动tomcat请求该jsp界面会出现 helloWorld!字样。
3:带属性的标签
标签要实现复杂的功能,一定离不开各种属性的支持,属性的作用基本上就等同于参数,在jsp界面可以通过这些属性来传递参数实现标签的功能,这些属性必须要有set()和get()方法。
各个例子参考上面就简单易懂,注意彩色标示即可,不再赘述:
HelloWorld.java
package www.cslc.com;
import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.SimpleTagSupport;
public class HelloWorld extends SimpleTagSupport{
private String word;
private String name;
private String toSomeOne;
public String getWord() {
return word;
}
public void setWord(String word) {
this.word = word;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getToSomeOne() {
return toSomeOne;
}
public void doTag() throws JspException,IOException{
getJspContext().getOut().write(name+"想对"+toSomeOne+"说"+word);
}
}
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">
<tlib-version>1.0</tlib-version>
<short-name>MySimpleTagLibrary</short-name>
<!-- 自定义标签库块开始 -->
<uri>http://www.clsc.com/mytaglib</uri>
<tag>
<name>helloWorld</name>
<tag-class>www.cslc.com.HelloWorld</tag-class>
<body-content>empty</body-content>
<attribute>
<name>name</name>
<!-- 是否为必须属性 -->
<required>true</required>
<!-- 是否支持jsp脚本、表达式等动态内容 -->
<fragment>true</fragment>
</attribute>
<attribute>
<name>toSomeOne</name>
<!-- 是否为必须属性 -->
<required>true</required>
<!-- 是否支持jsp脚本、表达式等动态内容 -->
<fragment>true</fragment>
</attribute>
<attribute>
<name>word</name>
<!-- 是否为必须属性 -->
<required>true</required>
<!-- 是否支持jsp脚本、表达式等动态内容 -->
<fragment>true</fragment>
</attribute>
</tag>
<!-- 自定义标签库块结束 -->
</taglib>
MyJsp.jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ taglib uri="http://www.clsc.com/mytaglib" prefix="mytaglib"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
</head>
<body>
<mytaglib:helloWorld name="aa" toSomeOne="bb" word="love you"/>
</body>
</html>
值得注意的是,标签库是表现层组件技术,所以不建议在标签库中涉及链接数据库业务逻辑,它应该只负责显示。
3,带标签体的标签
带标签体的标签可以在标签中嵌入其他内容(静态的HTML和动态的jsp内容),通常用于完成一些逻辑运算,如判断、循环等等,下面以一个循环为例子。
IteratorTag.java
package www.cslc.com;
import java.io.IOException;
import java.util.Collection;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.SimpleTagSupport;
public class IteratorTag extends SimpleTagSupport{
private String collection;
private String item;
public String getCollection() {
return collection;
}
public void setCollection(String collection) {
this.collection = collection;
}
public String getItem() {
return item;
}
public void setItem(String item) {
this.item = item;
}
@SuppressWarnings("unchecked")
public void doTag() throws JspException,IOException{
Collection itemList=(Collection)getJspContext().getAttribute(collection);
//遍历集合
for(Object s:itemList){
getJspContext().setAttribute(item, s);
getJspBody().invoke(null);
}
}
}
myItemtaglib.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">
<tlib-version>1.0</tlib-version>
<short-name>MySimpleTagLibrary</short-name>
<!-- 自定义标签库块开始 -->
<uri>http://www.clsc.com/myItemtaglib</uri>
<tag>
<name>IteratorTag</name>
<tag-class>www.cslc.com.IteratorTag</tag-class>
<body-content>scriptless</body-content>
<attribute>
<name>collection</name>
<!-- 是否为必须属性 -->
<required>true</required>
<!-- 是否支持jsp脚本、表达式等动态内容 -->
<fragment>true</fragment>
</attribute>
<attribute>
<name>item</name>
<!-- 是否为必须属性 -->
<required>true</required>
<!-- 是否支持jsp脚本、表达式等动态内容 -->
<fragment>true</fragment>
</attribute>
</tag>
<!-- 自定义标签库块结束 -->
</taglib>
index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ taglib uri="http://www.clsc.com/myItemtaglib" prefix="mytaglib"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
</head>
<body>
<%
//创建一个List对象
List<String> a=new ArrayList<String>();
a.add("aa");
a.add("bb");
a.add("cc");
pageContext.setAttribute("a",a);
%>
<mytaglib:IteratorTag item="item" collection="a">
<tr>
<td>${pageScope.item}<td>
<tr>
</mytaglib:IteratorTag>
</body>
</html>
以页面片段作为属性的标签:
jsp2规范的自定义标签还允许直接将一段“页面片段”作为属性,这种方式给自定义标签提供了更大的灵活性。