六狼论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 116|回复: 0

重读servlet(六)标签开发

[复制链接]

升级  76%

10

主题

10

主题

10

主题

童生

Rank: 1

积分
38
 楼主| 发表于 2013-2-7 20:17:16 | 显示全部楼层 |阅读模式
如果现在的公司在使用jsp2.0以前版本的jsp,
还在使用传统标记编写定制标志处理器。那么我们还需要了解一下传统标签。
相对于2.0以后的简单标记,传统标记复杂多了


  • 1,传统标记扩展TagSurport

public class ClassicTag extends TagSupport{)


  • 2,覆盖doStartTag,doEndTag方法

public int doStartTag() throws JspException    {        //从TagSupport继承了一个pageContext成员变量(而simpleTag doTag()声明的是JOEXCEPTION        JspWriter out = pageContext.getOut();        try        {             out.print("classic start tag out put");        }        catch(IOException ex)        {              throw new JspException("IOException -"+ex.toString());        }        //必须返回一个INT告诉容器接下去做什么        //如果有体,不要计算体,直接调用doEngTag方法        //如果有体则返回 EVAL_BODY_INCLUDE 向但与简单标记的 getJspBody().invoke(null);        return SKIP_BODY;    }     public int doEndTag() throws JspException    {         JspWriter out = pageContext.getOut();            try            {                   out.print("<br/>classic end tag out put");            }            catch(IOException ex)            {                    throw new JspException("IOException -"+ex.toString());            }         //计算余下的页面        return EVAL_PAGE;    }

  • 3,为标记创建一个LTD


<tlib-version>1.0</tlib-version>  <short-name>classistag</short-name>  <uri>classic</uri>  <!-- 传统标记定义 和 简单标记定义 没有区别-->   <tag>        <description></description>        <name>classic</name>        <tag-class>foo.ClassicTag</tag-class>        <body-content>empty</body-content>   </tag>
    4,标记的存放位置
  可以存放在WEB-INF下的某个位置,容器会自动寻找到。


  • 5,展现标记的jsp

<%@taglib prefix="clas" uri="classic"%><!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>JSP Page</title>    </head>    <body>    <h1>        <clas:classic/>           </h1>        </body></html>
    6,有体的标记

要增加一个doAfterBody() 方法。

//ClassicTag.java String[] movies = new String[]{"Spider","Big fish","Fox"};    int movieCounter;    public int doStartTag() throws JspException    {        movieCounter =0;        //从TagSupport继承了一个pageContext成员变量(而simpleTag doTag()声明的是JOEXCEPTION       pageContext.setAttribute("movie",movies[movieCounter]);       movieCounter++;       /* try        {             out.print("classic start tag out put");        }        catch(IOException ex)        {              throw new JspException("IOException -"+ex.toString());        }*/        //必须返回一个INT告诉容器接下去做什么        //如果有体,不要计算体,直接调用doEngTag方法        //如果有体则返回 EVAL_BODY_INCLUDE 向但与简单标记的 getJspBody().invoke(null);        return EVAL_BODY_INCLUDE;    }        public int doAfterBody() throws JspException    {        if(movieCounter < movies.length)        {               pageContext.setAttribute("movie",movies[movieCounter]);               movieCounter++;               return EVAL_BODY_AGAIN;        }        else        {            return SKIP_BODY;        }    }
把body改一下
<!--ClassisTag.tld-->  <body-content>scriptless</body-content>

<!--classictag.jsp-->   <ul>        <clas:classic>            <li>${movie}</li>        </clas:classic>   </ul>
效果如图所示
您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

本版积分规则

快速回复 返回顶部 返回列表