jsp自定义标签
1.自定义标签类
标签类就是一个普通的类,只需要继承标签的支持类(接口)就可以,这里关于标签的支持类有如下关系图
这里可以继承BodyTagSupport,TagSupport,SimpleTagSupport等,具体继承哪个,看操作方便和实际需要。下面是一个简单demo
package com.supre.test;
import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.BodyTagSupport;
public class Test extends BodyTagSupport {
private static final long serialVersionUID = 1L;
private String name;
private String value;
private String className;
@Override
public int doEndTag() throws JspException {
JspWriter out = pageContext.getOut();
try {
String div = "<div class='"+className+"'>";
div = div + "<input type='text' value='"+value+"'/><br/>";
div = div + "<label>name:"+name+"</label><br/>";
div = div + "<span>className:"+className+"</span><br/>";
div = div +"contect:" + (bodyContent!=null?bodyContent.getString():"");
div = div + "</div>";
out.println(div);
} catch (IOException e) {
e.printStackTrace();
}
return super.doEndTag();
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
public String getClassName() {
return className;
}
public void setClassName(String className) {
this.className = className;
}
}
说明:其中属性name, value, className均对应自定义标签中的属性,需要提供get/set方法bodyContent为对象BodyTagSupport中的属性,是一个包含自定义标签体中间类容的对象,可以通过该对象取得自定义标签体中的内容,当然该对象也有可能为null
2.创建标签描述文件(.tld)
标签描述文件主要是将这个标签与一个类对应起来,同时对标签的一些属性做相应现限制。该文件定义在web项目的/WEB-INF/目录下的一个.tld文件,对上面定义的标签类有如下描述文件:WEB-INF/tag/aaa.tld
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN" "http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd">
<taglib>
<tlibversion>1.0</tlibversion>
<jspversion>1.1</jspversion>
<shortname>cc</shortname>
<uri>http://jakarta.apache.org/taglibs/struts-example-1.0</uri>
<info>tag test</info>
<tag>
<!-- 标签名 -->
<name>test</name>
<!-- 对应的自定义标签类的全类名 -->
<tagclass>com.supre.test.Test</tagclass>
<!-- 定义标签体中间支持的格式:有 empty scriptless JSP tagdependent -->
<bodycontent>JSP</bodycontent>
<!-- 定义标签属性 -->
<attribute>
<!-- 自定义标签类中的属性名字 -->
<name>name</name>
<!-- 设置是否为必须属性 -->
<required>true</required>
<!-- 设置是否支持表达式 -->
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>value</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>className</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
</taglib>
说明:其中 bodycontent中分别支持的格式:
empty:空标记,即起始标记和结束标记之间没有内容。
tagdependent:标签体内容直接被写入bodyContent,不被JSP容器解释处理
scriptless:接受文本、EL和JSP动作,但不支持出现代码,如:
<cc:test> <%=request.getProtocol()%> </cc:test>
JSP:接受所有JSP语法,如定制的或内部的tag、scripts、静态HTML、脚本元素、JSP指令和动作。
3.使用自定义标签
使用自定义标签,需要在jsp页面中先引入该标签,引入格式为:
<%@ taglib prefix="cc"uri="/WEB-INF/tag/aaa.tld" %>
其中 prefix为该标签的前缀(自定义),uri为上面定义的标签描述文件的相对路径
就上面自定义标签的简单使用
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="cc" uri="/WEB-INF/tag/aaa.tld" %>
<!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>
<cc:test name="admin" value="123123"></cc:test>
<br/>
<cc:test name="aaaaaa" value="bbbbbb" className="ccccc">
<input type="button" value="test" />
</cc:test>
</body>
</html>
结果截图:
参考博文:http://blog.csdn.net/lw001x/article/details/7589302