自定义标签

创建客户化JSP标签的步骤:
  1创建标签的处理类
  2创建标签库描述文件
  3在JSP文件中引入标签库,然后插入标签,例如:<mm:hello/>


Servlet容器编译JSP网页时,如果遇到自定义标签,就会调用这个标签的处理类;
标签处理类必须扩展以下两个类之一
--javax.servlet.jsp.tagext.TagSupport
--javax.servlet.jsp.tagext.BodyTagSupport

TagSupport的两个重要方法:doStartTag和doEndTag
doStartTag返回skipbody int类型常量
doEndTag返回EVAL_PAGE int类型常量

BodyTagSupport的父类是TagSupport

TagSupport类的主要方法:
  setValue(String k,Object o)  在标签处理类中设置key/value
  getValue(String k) 在标签处理类中根据参数key返回匹配的value
  removeValue(String k) 在标签处理类中删除key/value
  setPageContext(PageCOntext pc) 设置PageContext对象,该方法由Servlet
容器在调用doStartTag或doEndTag方法前调用
  setParent(Tag t) 设置嵌套了当前标签的上层标签的处理类,该方法由Servlet容器在
调用doStartTag或doEndTag方法前调用
  getParent() 返回嵌套了当前标签的上层标签的处理类

TagSupport类的两个重要属性
   parent:代表嵌套了当前标签的上层标签的处理类
   pageContext :代表Web应用中的javax.servlet.jsp.PageContext对象


JSP容器在调用doStartTag或doEndTag方法前,会先调用setPageContext和setParent方法,设置pageContext和parent.
在doStartTag或doEndTag方法中可以通过getParent方法获取上层标签的处理类;在TagSupport类中定义了protected类型的pageContext成员变量,因此在标签处理类中可以直接访问pageContext变量


PageContext类
   pageContext类提供了保存和Web应用的共享数据的方法:
    public void setAttribute(String name ,Object value, int scope)
   public Object getAttribute(String name, int scope)

其中,scope参数用来指定属性存在的范围,它的可选值包括PageContext.PAGE_SCOPE
   PageContext.REQUEST_SCOPE  PageContext.SESSION_SCOPE   PageContext.APPLICATIO_SCOPE  例如:pageContext.setAttribute("username","zhagnsan",PageContext.SESSION_SCOPE);


doStartTag()方法
   当Servlet容器遇到自定义标签的起始标志,就会调用doStartTag()方法。
   doStartTag()方法返回一个整数值,用来决定程序的后续流程,它有两个可选值:
---Tag.SKIP_BODY
     表示标签之间的内容被忽略
---Tag.EVAL_BODY_INCLUDE
     表示标签之间的内容被正常执行
例如以下代码:
    <prefix:Mytag>
        hello
        ......
   </prefix:Mytag>假若<Mytag>的doStartTag()方法返回Tag.SKIP_BODY,"hello"字符串不会显示在网页上,若返回Tag.EVAL_BODY_INCLUDE,"hello"字符串将显示在网页上


doEndTag()方法
   当Servlet容器遇到自定义标签的结束标签,就会调用doStartTag()方法。
doEndtTag()方法返回一个整数值,用来决定程序的后续流程,它有两个可选值:
---Tag.SKIP_PAGE     表示立刻停止执行JSP网页,网页上未处理的静态内容和JSP程序均被忽略,任何已有的输出内容立刻返回到客户的浏览器上。
---Tag.EVAL_PAGE     表示按正常的流程继续执行JSP网页

你可能感兴趣的:(Web,jsp,servlet,浏览器)