**************************tag file start ******************************************
package com.tags;import java.io.IOException;
import java.util.*;
import javax.servlet.jsp.*;
import javax.servlet.jsp.tagext.*;
import com.pub.*;
import com.tables.*;public class CopartnerTag extends BodyTagSupport
{
private StringBuffer output = new StringBuffer();
private CopartnerTable copartnerTable; private String keySort;
private String keyCopartnerID;
private String createNew;
public void setKeySort(String keySort)
{
this.keySort = keySort;
} public void setKeyCopartnerID(String keyCopartnerID)
{
this.keyCopartnerID = keyCopartnerID;
} public void setCreateNew(String createNew)
{
this.createNew = createNew;
}
public int doStartTag() throws JspTagException
{
copartnerTable = new CopartnerTable();
if ((keyCopartnerID == null)||(keyCopartnerID.equals("")))
{
copartnerTable.selectBySort(keySort);
}
else
{
copartnerTable.selectSingle(keyCopartnerID);
}
if (copartnerTable.size() > 0)
{
copartnerTable.goFirst();
setLoopVariable();
copartnerTable.goNext();
return EVAL_BODY_BUFFERED;
} else if ((createNew != null)&&(createNew.equals("yes")))
{
pageContext.setAttribute("copartnerCopartnerID", keyCopartnerID);
pageContext.setAttribute("copartnerName", "");
pageContext.setAttribute("copartnerAddr", "");
pageContext.setAttribute("copartnerTele", "");
pageContext.setAttribute("copartnerZip", "");
pageContext.setAttribute("copartnerConnector", "");
pageContext.setAttribute("copartnerSort", keySort);
pageContext.setAttribute("copartnerRating", "");
pageContext.setAttribute("copartnerIfContinue", "");
pageContext.setAttribute("copartnerExplain", "");
return EVAL_BODY_BUFFERED;
} return SKIP_BODY;
} public int doAfterBody() throws JspTagException
{
BodyContent bodyContent = getBodyContent();
if (bodyContent != null)
{
output.append(bodyContent.getString());
try
{
bodyContent.clear();
}
catch (IOException ex)
{
throw new JspTagException("Fatal IO Error");
}
} if (copartnerTable.isBof() != true)
{
setLoopVariable();
copartnerTable.goNext();
return EVAL_BODY_BUFFERED;
}
return SKIP_BODY;
} public int doEndTag() throws JspTagException
{
BodyContent bodyContent = getBodyContent();
if (bodyContent != null)
{
try
{
bodyContent.getEnclosingWriter().write(output.toString());
}
catch (IOException ex)
{
throw new JspTagException("Fatal IO Error");
}
}
return EVAL_PAGE;
} private void setLoopVariable()
{
pageContext.setAttribute("copartnerCopartnerID", copartnerTable.getCopartnerID());
pageContext.setAttribute("copartnerName", copartnerTable.getCopartnerName());
pageContext.setAttribute("copartnerAddr", copartnerTable.getAddr());
pageContext.setAttribute("copartnerTele", copartnerTable.getTele());
pageContext.setAttribute("copartnerZip", copartnerTable.getZip());
pageContext.setAttribute("copartnerConnector", copartnerTable.getConnector());
pageContext.setAttribute("copartnerSort", copartnerTable.getSort());
pageContext.setAttribute("copartnerRating", copartnerTable.getRating());
pageContext.setAttribute("copartnerIfContinue", copartnerTable.getIfContinue());
pageContext.setAttribute("copartnerExplain", copartnerTable.getExplain());
}
}
*********************************tag file end ********************************************************************jsp file start***********************************<wj:copartner keySort="<%=keySort%>" keyCopartnerID="<%=keyCopartnerID%>" createNew="no">
<tr>
<td nowrap><input type="checkbox" name="CheckList" value="<%=copartnerCopartnerID%>"><%=copartnerCopartnerID%></td>
<td nowrap><%=copartnerName%></td>
<td nowrap><%=copartnerAddr%></td>
<td nowrap><%=copartnerTele%></td>
<td nowrap><%=copartnerZip%></td>
<td nowrap><%=copartnerConnector%></td>
<td nowrap><%=copartnerRating%></td>
<td nowrap><%=copartnerIfContinue%></td>
<td nowrap><%=copartnerExplain%></td>
</tr>
</wj:copartner>*********************************jsp file end***********************************
根据给出的keySort和keyCopartnerID查询数据,如果允许增加的话,在没有得到查询结果的时候增加一个空白的
package com.tags;import java.io.IOException;
import java.util.*;
import javax.servlet.jsp.*;
import javax.servlet.jsp.tagext.*;
import com.pub.*;
import com.tables.*;public class CopartnerTag extends BodyTagSupport
{
private StringBuffer output = new StringBuffer();
private CopartnerTable copartnerTable; private String keySort;
private String keyCopartnerID;
private String createNew;
public void setKeySort(String keySort)
{
this.keySort = keySort;
} public void setKeyCopartnerID(String keyCopartnerID)
{
this.keyCopartnerID = keyCopartnerID;
} public void setCreateNew(String createNew)
{
this.createNew = createNew;
}
public int doStartTag() throws JspTagException
{
copartnerTable = new CopartnerTable();
if ((keyCopartnerID == null)||(keyCopartnerID.equals("")))
{
copartnerTable.selectBySort(keySort);
}
else
{
copartnerTable.selectSingle(keyCopartnerID);
}
if (copartnerTable.size() > 0)
{
copartnerTable.goFirst();
setLoopVariable();
copartnerTable.goNext();
return EVAL_BODY_BUFFERED;
} else if ((createNew != null)&&(createNew.equals("yes")))
{
pageContext.setAttribute("copartnerCopartnerID", keyCopartnerID);
pageContext.setAttribute("copartnerName", "");
pageContext.setAttribute("copartnerAddr", "");
pageContext.setAttribute("copartnerTele", "");
pageContext.setAttribute("copartnerZip", "");
pageContext.setAttribute("copartnerConnector", "");
pageContext.setAttribute("copartnerSort", keySort);
pageContext.setAttribute("copartnerRating", "");
pageContext.setAttribute("copartnerIfContinue", "");
pageContext.setAttribute("copartnerExplain", "");
return EVAL_BODY_BUFFERED;
} return SKIP_BODY;
} public int doAfterBody() throws JspTagException
{
BodyContent bodyContent = getBodyContent();
if (bodyContent != null)
{
output.append(bodyContent.getString());
try
{
bodyContent.clear();
}
catch (IOException ex)
{
throw new JspTagException("Fatal IO Error");
}
} if (copartnerTable.isBof() != true)
{
setLoopVariable();
copartnerTable.goNext();
return EVAL_BODY_BUFFERED;
}
return SKIP_BODY;
} public int doEndTag() throws JspTagException
{
BodyContent bodyContent = getBodyContent();
if (bodyContent != null)
{
try
{
bodyContent.getEnclosingWriter().write(output.toString());
}
catch (IOException ex)
{
throw new JspTagException("Fatal IO Error");
}
}
return EVAL_PAGE;
} private void setLoopVariable()
{
pageContext.setAttribute("copartnerCopartnerID", copartnerTable.getCopartnerID());
pageContext.setAttribute("copartnerName", copartnerTable.getCopartnerName());
pageContext.setAttribute("copartnerAddr", copartnerTable.getAddr());
pageContext.setAttribute("copartnerTele", copartnerTable.getTele());
pageContext.setAttribute("copartnerZip", copartnerTable.getZip());
pageContext.setAttribute("copartnerConnector", copartnerTable.getConnector());
pageContext.setAttribute("copartnerSort", copartnerTable.getSort());
pageContext.setAttribute("copartnerRating", copartnerTable.getRating());
pageContext.setAttribute("copartnerIfContinue", copartnerTable.getIfContinue());
pageContext.setAttribute("copartnerExplain", copartnerTable.getExplain());
}
}
*********************************tag file end ********************************************************************jsp file start***********************************<wj:copartner keySort="<%=keySort%>" keyCopartnerID="<%=keyCopartnerID%>" createNew="no">
<tr>
<td nowrap><input type="checkbox" name="CheckList" value="<%=copartnerCopartnerID%>"><%=copartnerCopartnerID%></td>
<td nowrap><%=copartnerName%></td>
<td nowrap><%=copartnerAddr%></td>
<td nowrap><%=copartnerTele%></td>
<td nowrap><%=copartnerZip%></td>
<td nowrap><%=copartnerConnector%></td>
<td nowrap><%=copartnerRating%></td>
<td nowrap><%=copartnerIfContinue%></td>
<td nowrap><%=copartnerExplain%></td>
</tr>
</wj:copartner>*********************************jsp file end***********************************
根据给出的keySort和keyCopartnerID查询数据,如果允许增加的话,在没有得到查询结果的时候增加一个空白的
下面,给出了,这个JSP的源代码test.jsp<%@ taglib uri="counters" prefix="util" %><html>
<head>
<title>
A Count tag
</title>
</head>
<body>
This page has been accessed <b><util:counter/></b> times.
</body>
</html>taglib指令定义了标签库及其标记的URI,这个URI指向一个标记描述信息,TLD,就是counter.tld的扩展。
Taglib指令还需要用prefix属性来指定用来访问该库标记的前缀。这里的TLD位于WEB-INF/tlds中,其实,它可以直接放在WEB-INF中,这里只是建议。1.2 定义定制标记――――TLDTLD是定义一个标记库及其标记的XML文档,下面是本例子所使用的一个TLD文件。文件的目录WEB-INF/tlds/conuter.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>Tag library</shortname>
<info>this is test tag library!</info> <tag>
<name>counter</name>
<tagclass>tags.CounterTag</tagclass>
<bodycontent>empty</bodycontent>
</tag></taglib>解释:第一行是一个XML文档,第二行表示文档的类型是taglib,并提供了文档类型定义(DTD,Document Type Definition)的URL,该DTD定义了taglib文档的结构,Servlet容器使用这个DTD来验证该taglib文档。可以使用<taglib>定义标签库,上面的例子,标签库的版本为1.0,只有符号JSP1.1或者更高版本的JSP,才能使用标记库。<tag>用于定义标签,它具有两个重要的元素,标记的<name>和<tagclass>,<tagclass>指定实现标记功能的java类,这些类的类型通常叫做标记处理程序。1.3 实现定制标记――――标记处理程序标记处理程序通过javax.servlet.jsp.tagext实现Tag接口。Tag接口定义了6种方法,我们一般只用以下几种吧doStartTag()
doEndTag()
release()下面的程序,按照上面的顺序依次调用Tag方法,标记的开始和结束部分,调用doStartTag和doEndTag方法,这两个方法,都返回integer常量,这个方法,在Tag接口中定义的。调用doEndTag方法结束后,servlet容器调用release方法,把标记处理程序保持的资源都释放掉。WEB-INF/classes/tags/CounterTag.javapackage tags;import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.TagSupport;
import javax.servlet.http.HttpServletRequest;public class CounterTag extends TagSupport {
private int count = 0;
private File file = null;
public int doStartTag() throws JspException {
try
{
checkFile();
readCount();
pageContext.getOut().print(++count);
}
catch (java.io.IOException ex)
{
throw new JspException(ex.getMessage());
}
return SKIP_BODY;
}
public int doEndTag() throws JspException {
saveCount();
return EVAL_PAGE;
}
private void checkFile() throws JspException,IOException {
if (file == null) {
file = new File(getCounterFilename());
count = 0;
}
if (!file.exists()) {
file.createNewFile();
saveCount();
}
}
private String getCounterFilename() {
HttpServletRequest req = (HttpServletRequest)pageContext.getRequest();
String servletPath = req.getServletPath();
String realPath = pageContext.getServletContext().getRealPath(servletPath); return realPath + ".Counter";
}
private void saveCount() throws JspException {
try {
FileWriter writer = new FileWriter(file);
writer.write(count);
writer.close();
}
catch (Exception ex) {
throw new JspException(ex.getMessage());
}
}
private void readCount() throws JspException {
try {
FileReader reader = new FileReader(file);
count = reader.read();
reader.close();
}
catch (Exception ex) {
throw new JspException(ex.getMessage());
}
}
}关于,这个例子,我就不多讲了,因为这个例子,涉及到java的内部类,所以就不多说,有兴趣的话,可以察看文档。1.4 在WEB-INF/web.xml中指定TLD我们打开,WEB-INF文件,里面有个web.xml文件,使用文本打开,在里面,添加上,以下的资料,<?xml version="1.0" encoding="ISO-8859-1"?><!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app> <taglib>
<taglib-uri>counters</taglib-uri>
<taglib-location>/WEB-INF/tlds/counter.tld</taglib-location>
</taglib></web-app>上面斜体字,就是我们要添加的,可以按照不通情况作相应的改变。1.5 <taglib>和<tag>下面讲讲<taglib>和<tag>的元素<taglib>相关的元素
元素 类型 说明
tlibversion 1 标记库的版本
jspversion ? 标记库依赖的JSP规范版本,默认是JSP1.1
shortname 1 由JSP页面编辑工具用来标识库的简称
uri ? 唯一标识库的URI
info ? 描述如何使用标记库
tag + 标记库中包含的标记上面的,1表示只有一种,为必选项,?表示为只有一种,为可选项,+为一种或多种<tag>相关的元素
元素 类型 说明
name 1 标记前缀后出现的名字,如<前缀:名称……
tagclass 1 标记处理程序类,标记必须实现,Tag接口
teiclass ? 定义标记的脚本编程变量的类
bodycontent ? 将标记主体内容描述为下列中的一种
● Tag dependent(标记对主体内容求值)
● JSP(默认类型)(servlet容器对主体内容求值)
● Empty(主体必须为空)
info ? 有关标记的信息
attribute * 标记属性(见下表)
attribute元素,指定标记的属性
<attribute>元素
元素 类型 说明
name 1 属性名称
request ? 如果为真,则必须指定属性值
rtexprvalue ? 如果为真,则可以用JSP请求时的属性值指定属性
1.6 标记生存周期servlet容器首先调用doStartTag方法,该标记以某种方式作出反映,然后返回SKIP_BODY,指出如果标记具有主体,就不能进行处理。然后,用doEndTag方法,返回EVAL_PAGE,所以,servlet容器进行下面的JSP操作,调用doEndTag后,就用release方法,把资源释放掉。