1.1  使用定制标签――JSP文件下面显示了一个JSP页面,这个页面,使用了最简单的定制标签,这个标签,没有任何属性,也没有主体。只是一个简单的记数器,用于计算访问JSP页面的次数。
 下面,给出了,这个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方法,把资源释放掉。

解决方案 »

  1.   

    除了写tlb文件外
    是不是还要其他做什么的???因为com.jsptags.navigation.pager.PrevTag
    我这里是没有的。大侠??help!
      

  2.   

    还要写servlet 还要记得在页面中调用,上述讲的很详细了啊:) 
    是wrox beginning jsp 上的example 不过zxhong讲的很好:)
    com.jsptags.navigation.pager.PrevTag是一个taglib所在包包...\\com\\jsptags\\navigation\\pager\\目录下的PrevTag.一般可以自己写,也可以用别人写好
      

  3.   

    <shortname>pg</shortname>
      <uri>http://jsptags.com/tags/navigation/pager</uri>这是不是用了网上的标志库文件(.tld)我们用时是不是Tomcat另外配置一些东西?
    如果是,如何配置?