第一章:怎样使用Taglib
一、第一种方法:仅声明TLD位置
在jsp文件头部,声明:
<%@ taglib uri=”/WEB-INF/tlds/orataglib_1_0.tld” prefix=”ora”%>
这样就
ok
了
二、第二种方法:定义库名称
在
jsp
文件头部,声明:
<%@ taglib uri=”/orataglib” prefix=”ora”%>
在WEB.XML添加如下声明:
<taglib>
<taglib-uri>/orataglib</taglib-uri>
<taglib-location>/WEB-INF/tlds/orataglib_1_0.tld</taglib-location>
</taglib>
在tld里加上:
<shortname>ora</shortname>
<uri>/orataglib</uri>
三、区别
如果类不多,用tld引用就行了。否则就用库形式,便于升级,改动。
第二章:编写最简单的Taglib
一、编写HelloWorldTag 类
package mytag;
import java.io.IOException;
import javax.servlet.jsp.*;
import javax.servlet.jsp.tagext.*;
public class HelloWorldTag extends TagSupport{
public int doStartTag() throws JspTagException{
return EVAL_BODY_INCLUDE;
}
public int doEndTag() throws JspTagException{
try{
pageContext.getOut().write("Hello World");
}
catch (IOException ex){
throw new JspTagException("Error!");
}
return EVAL_PAGE;
}
}
二、编写相应TLD文件
取名为
hello.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>myTag</shortname>
<tag>
<name>hello</name>
<tagclass>mytag.HelloWorldTag</tagclass>
<bodycontent>empty</bodycontent>
</tag>
</taglib>
三、编写testtag1.jsp进行调用
<%@ page language="java"%>
<%@ taglib uri="/WEB-INF/tlds/hello.tld" prefix="mytag"%>
<html>
<body>
<mytag:hello></mytag:hello>
</body>
</html>
四、注意点
1.
实际生成的类在包
mytag
内,要把该包放到
WEB-INF/classes
目录下
2.
tld
文件里的
shortname
就是
jsp
里的
prefix
3. tld文件里的<tag>标签中,<name>表示实际类的一个别名,供jsp页面引用。<tagclass>表示实际的类
4。把tld文件放到WEB-INF 下的tlds文件夹内。
五、概述
1.
必须导入
javax.servlet.jsp.*
和
javax.servlet.jsp.tagext.*
两个包
2.
让自己的类继承
TagSupport 类,并且实现doStartTag 或 doEndTag 方法。
3.
编写tld标签,只需指定<shortname>标签,和编写具体的类标签<tag>,其他的可以复制粘贴。
4.
在jsp页面是用导入tld的办法。然后用前缀:类名的方式调用。
第三章:编写带BODY的Taglib
一、编写HelloBodyTag 类
package mytag;
import java.io.*;
import javax.servlet.jsp.*;
import javax.servlet.jsp.tagext.*;
public class HelloBodyTag extends BodyTagSupport {
public int doAfterBody() throws JspException {
BodyContent bc = getBodyContent();
JspWriter out = getPreviousOut();
try {
out.write(bc.getString());
}
catch (IOException e) {} // Ignore
return SKIP_BODY;
}
}
二、修改tld文件
加入:
<tag>
<name>HelloBodyTag</name>
<tagclass>mytag.HelloBodyTag</tagclass>
</tag>
三、 写testtag2.jsp调用
<%@ page language="java"%>
<%@ taglib uri="/WEB-INF/tlds/hello.tld" prefix="mytag"%>
<html>
<body>
<mytag:HelloBodyTag>Hello,BodyTag!</mytag:HelloBodyTag>
</body>
</html>
四、概述
1.
类最好继承
BodyTagSupport
2.
BodyContent
和
JspWriter
都是容器内的对象
3
.
GetPreviousOut
表示外层输出。对于某个
tag
来说,外层输出就是
jsp
页面。对于某个嵌套的
tag
,外层输出就是父
tag
第四章:让行为互相协作
一、编写互相协作的行为
编写这样的tag,在jsp页面调用时
<mytag:helloMan><mytag:param name=”diego” ></mytag:param></mytag: helloMan>
会得到 hello diego 的值。
二、编写两个Tag类
1.编写ParamTag 类
package mytag;
import java.net.*;
import javax.servlet.jsp.*;
import javax.servlet.jsp.tagext.*;
public class ParamTag extends TagSupport {
private String name;
public void setName(String name) {
this.name = name;
}
public int doEndTag() throws JspException {
Tag parent = findAncestorWithClass(this,
ParamParent
.class);
ParamParent
paramParent = (
ParamParent
) parent;
paramParent
.setParam(name);
return EVAL_PAGE;
}
public void release() {
name = null;
super.release();
}
}
2.编写HelloParamTag 类
package mytag;
import java.io.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*;
import javax.servlet.jsp.tagext.*;
public class HelloParamTag extends TagSupport implements ParamParent {
private String name;
public void setParam(String name) {
this.name = name;
}
public int doStartTag() {
return EVAL_BODY_INCLUDE;
}
public int doEndTag() throws JspException {
JspWriter out = pageContext.getOut();
try{
out.print("hello " + this.name );
}
catch(IOException e){
}
return EVAL_PAGE;
}
public void release() {
name = null;
super.release();
}
}
3
.编写辅助的接口
ParamParent
package mytag;
public interface ParamParent {
void setParam(String name);
}
三、修改tld文件
<tag>
<name>helloMan</name>
<tagclass>mytag.HelloParamTag</tagclass>
</tag>
<tag>
<name>param</name>
<tagclass>mytag.ParamTag</tagclass>
<attribute>
<name>name</name>
<required>false</required>
</attribute>
</tag>
四、编写testtag3.jsp进行测试
<%@ page language="java"%>
<%@ taglib uri="/WEB-INF/tlds/hello.tld" prefix="mytag"%>
<html>
<body>
<mytag:helloMan><mytag:param name="diego" ></mytag:param></mytag:helloMan>
</body>
</html>
五、设计思路
1
.嵌套行为中,一般父
Tag
实现业务逻辑,子
Tag
为父
Tag
提供参数
2
.子
Tag
通过
findAncestorWithClass
找到父
Tag
,为了达到通用化,设计接口
ParamParent
3
.在父
Tag
内实现了接口的
setParam
方法,子
Tag
通过调用该方法,设置了父
Tag
的参数
4
.父
Tag
实现业务逻辑。打印
Hello