|
如果现在的公司在使用jsp2.0以前版本的jsp,
还在使用传统标记编写定制标志处理器。那么我们还需要了解一下传统标签。
相对于2.0以后的简单标记,传统标记复杂多了
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; }
<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>
可以存放在WEB-INF下的某个位置,容器会自动寻找到。
<%@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>
要增加一个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>
效果如图所示 |
|