**************************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查询数据,如果允许增加的话,在没有得到查询结果的时候增加一个空白的

解决方案 »

  1.   

    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方法,把资源释放掉。