JSP 标签学习笔记
1.标签类型
JSP2.0规范之后,标签分为两类:传统标签和简单标签。
传统标签继承Tag接口,简单继承集成SimpleTag接口
2.标签开发步骤
(1)基于Tag或者SimpleTag或他们的子接口(Support类)开发标签动作类
(2)在web-inf目录下的tld下定义标签说明
(3)jsp中引用标签(共有三种方法)
3.标签开发
(0)关于标签参数传递
只需要在标签动作类中,定义方法,然后getter/setter
接下来,在.tld文件中声明<attribute>,最后jsp中,就可以用类似<mytag:hello p1="" p2="" />类似的方法向Java类传递参数了。
(1)Tag接口与TagSupport
Tag,父接口,标签的鼻祖,继承自JspTag。
重点覆盖
doStartTag():标签开始时候执行的动作,要返回EVAL_BODY_INCLUDE 或者 SKIP_BODY,前者执行标签体,后者不执行。
doEndTag():标签结束时候执行的动作,要返回EVAL_PAGE 或者 SKIP_PAGE。前者继续执行剩余JSP,后者放弃执行剩余JSP。
Tag的其他几个方法很少用到,所以可以直接继承辅助类TagSupport
(2)IterationTag 、 BodyTag和BodyTagSupport
这三个都是为了处理重复标签(循环)的情况。特别注意,这些标签接口(类)是有缓存的,这个对线程安全非常不利。
IterationTag多出来了doAfterBody()方法。即下次调用同样标签就不重复创建了。
doAfterBody(),在每次处理标签体后被调用,如果没有标签体要处理,则不被调用。需要返回EVAL_BODY_AGAIN或者SKIP_BODY,前者表示重复执行标签体,后者则不在执行下次。
BodyTag继承了IterationTag,可以对标签体执行后的内容进行处理。
(3)SimpleTag
这个接口没有缓冲,每次调用标签就创建一个新的实例。
重要方法:doTag()
doTag(),在这里写要执行的Tag动作即可。
setJspBody(),如果覆盖了这个方法,则可以传入标签体内容,例如<tag>abcde</tag>,但是要设置.tld文件中<tag>的<body-content>tagdependent</body-content>
那么abcde的值就会传入,但是你无法获得她,只能直接输出。
4.tld配置
记住一点就好了,必须以.tld为拓展名,必须放在web-inf和其子目录下。
一个简单的模板如下:
de><?xml version="1.0" encoding="UTF-8"?>
<taglib version="2.0" 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 web-jsptaglibrary_2_0.xsd">
<tlib-version>1.0</tlib-version>
<short-name>writer</short-name>
<uri>tags/MessageWriter</uri>
<tag>
<name>write</name>
<tag-class>com.lilijun.tags.MessageWriterTagHandler</tag-class>
<body-content>JSP</body-content>
<attribute>
<name>fontColor</name>
<required>true</required>>
</attribute>
</tag>
</taglib>
5.在jsp中使用
有三种方法:
(1)web.xml中配置一个<taglib>节点,如下:
<jsp-config>
<taglib>
<taglib-uri>de>de>/mytag</taglib-uri>
<taglib-location>/WEB-INF/tlds/hello.tld</taglib-location>
</taglib>
</jsp-config>
JSP中如下写:
<%@ taglib uri="/mytag" prefix="mytag" %>
(2)不在web.xml中配置,直接在JSP中使用TLD文件的位置:
JSP中如下写:
<%@ taglib uri="/web-inf/tlds/hello.tld" prefix="mytag" %>
(3)在jsp中直接指定tag的url
<%@ taglib uri="/mytag" prefix="mytag" %>
下面是一个基于SimpleTag的例子:
标签动作Java类:
package tag;
import java.io.IOException;
import javax.servlet.jsp.JspContext;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.JspFragment;
import javax.servlet.jsp.tagext.SimpleTagSupport;
/***
* 测试的简单标签
* @author liheyuan
*
*/
public class HelloTag1 extends SimpleTagSupport
{
/**测试属性name*/
private String name;
/**标签体*/
private JspFragment body;
public void setJspBody(JspFragment body)
{
this.body = body;
}
public void doTag()throws JspException,IOException
{
JspContext ctx = this.getJspContext();
JspWriter out = ctx.getOut();
out.println("<h1>"+name+",</h1>");
body.invoke(out);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
tld定义
<?xml version="1.0" encoding="UTF-8"?>
<!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>tagSample</short-name>
<uri>/mytag</uri>
<tag>
<name>hello1</name>
<tag-class>tag.HelloTag1</tag-class>
<body-content>tagdependent</body-content>
<attribute>
<name>name</name>
<type>java.lang.String</type>
</attribute>
</tag>
</taglib>
JSP
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="/mytag" 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:hello1 name="李赫元" >
你好!
</mytag:hello1>
</body>
</html>
JSP2.0规范之后,标签分为两类:传统标签和简单标签。
传统标签继承Tag接口,简单继承集成SimpleTag接口
2.标签开发步骤
(1)基于Tag或者SimpleTag或他们的子接口(Support类)开发标签动作类
(2)在web-inf目录下的tld下定义标签说明
(3)jsp中引用标签(共有三种方法)
3.标签开发
(0)关于标签参数传递
只需要在标签动作类中,定义方法,然后getter/setter
接下来,在.tld文件中声明<attribute>,最后jsp中,就可以用类似<mytag:hello p1="" p2="" />类似的方法向Java类传递参数了。
(1)Tag接口与TagSupport
Tag,父接口,标签的鼻祖,继承自JspTag。
重点覆盖
doStartTag():标签开始时候执行的动作,要返回EV
doEndTag():标签结束时候执行的动作,要返回EV
Tag的其他几个方法很少用到,所以可以直接继承辅助类TagSupport
(2)IterationTag 、 BodyTag和BodyTagSupport
这三个都是为了处理重复标签(循环)的情况。特别注意,这些标签接口(类)是有缓存的,这个对线程安全非常不利。
IterationTag多出来了doAfterBody()方法。即下次调用同样标签就不重复创建了。
doAfterBody(),在每次处理标签体后被调用,如果没有标签体要处理,则不被调用。需要返回EV
BodyTag继承了IterationTag,可以对标签体执行后的内容进行处理。
(3)SimpleTag
这个接口没有缓冲,每次调用标签就创建一个新的实例。
重要方法:doTag()
doTag(),在这里写要执行的Tag动作即可。
setJspBody(),如果覆盖了这个方法,则可以传入标签体内容,例如<tag>abcde</tag>,但是要设置.tld文件中<tag>的<body-content>tagdependent</body-content>
那么abcde的值就会传入,但是你无法获得她,只能直接输出。
4.tld配置
记住一点就好了,必须以.tld为拓展名,必须放在web-inf和其子目录下。
一个简单的模板如下:
<taglib version="2.0" 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 web-jsptaglibrary_2_0.xsd">
<tlib-version>1.0</tlib-version>
<short-name>writer</short-name>
<uri>tags/MessageWriter</uri>
<tag>
<name>write</name>
<tag-class>com.lilijun.tags.MessageWriterTagHandler</tag-class>
<body-content>JSP</body-content>
<attribute>
<name>fontColor</name>
<required>true</required>>
</attribute>
</tag>
</taglib>
5.在jsp中使用
有三种方法:
(1)web.xml中配置一个<taglib>节点,如下:
<jsp-config>
<taglib>
<taglib-uri>
</jsp-config>
JSP中如下写:
<%@ taglib uri="/mytag" prefix="mytag" %>
(2)不在web.xml中配置,直接在JSP中使用TLD文件的位置:
<%@ taglib uri="/web-inf/tlds/hello.tld" prefix="mytag" %>
下面是一个基于SimpleTag的例子:
标签动作Java类:
package tag;
imp
imp
imp
imp
imp
imp
/***
* 测试的简单标签
* @author liheyuan
*
*/
public class HelloTag1 extends SimpleTagSupport
{
/**测试属性name*/
private String name;
/**标签体*/
private JspFragment body;
public void setJspBody(JspFragment body)
{
this.body = body;
}
public void doTag()throws JspException,IOException
{
JspContext ctx = this.getJspContext();
JspWriter out = ctx.getOut();
out.println("<h1>"+name+",</h1>");
body.invoke(out);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
tld定义
<?xml version="1.0" encoding="UTF-8"?>
<!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>tagSample</short-name>
<uri>/mytag</uri>
<tag>
<name>hello1</name>
<tag-class>tag.HelloTag1</tag-class>
<body-content>tagdependent</body-content>
<attribute>
<name>name</name>
<type>java.lang.String</type>
</attribute>
</tag>
</taglib>
JSP
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="/mytag" 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:hello1 name="李赫元" >
你好!
</mytag:hello1>
</body>
</html>