自定义JSP标签总结

自定义标签可以实现的功能:

  • 移除jsp中的java代码
  • 控制jsp中的某段程序是否执行
  • 控制jsp页面中的所有内容是否执行
  • 控制jsp中的程序重复执行
  • 修给jsp中的内容。

传统标签库 总结:

创建传统标签
  • 创建jsp标签类继承TagSupport类。
  • 重写doStartTag()方法,在doStartTag()方法中书写程序,此方法在执行开始标签的时候被服务器调用。服务器在遇到标签的时候先调用tag类的setPageContext(pageContext)方法将pageContext类传递进去。
  • 在WEB-INF下创建tld文件,在文件中对标签进行配置。


    A tag library exercising SimpleTag handlers.
    1.0
    SimpleTagLibrary
      //将此标签绑定的uri,通过此uri引用标签
    http://www.baixinping.com


    Outputs Hello, World
      //引用时的名称
    ha
      //标签类的目录
    baixinping.tag.Ha
     //标签体中是否有内容
    empty


  • 使用:<%@ taglib uri="http://www.baixinping.com" prefix="ha" %>
控制jsp中的某段程序的输出:

1、继承TagSupport
2、重写doStartTag();
3、如果doStartTag()返回TagSupport.SKIP_BODY,则不执行标签体中的内容,如果返回的是TagSupport.EVAL_BODY_INCLUDE则执行标签体中的内容。

控制jsp页面是否执行。
  • 继承TagSupport
  • 重写doEndStart()
  • 如果doEndTag()返回TagSupport.SKIP_PAGE,则不执行余下的jsp中的内容。如果返回TagSupport.EVAL_PAGE,则继续执行余下的内容。
控制部分代码重复执行
  • 继承继承TagSupport
  • 重写doAfterBody()方法,此方法在执行完标签体中的内容之后执行。
  • 如果doAfterBody()方法返回TagSupport.EVAL_BODY_AGAIN,则继续执行标签体中的内容。如果返回TagSupport.SKIP_BODY则继续执行doEndTag()方法。
修改jsp中的内容
  • 继承BodyTagSupport。此类在执行完doStartTag()完之后会自动执行setBodyContent()方法将标签体中的内容传递给标签类。然后执行doEndTag方法。
  • doEndTag()方法中通过this.getBodyContent()获取标签体内容对象,然后对其进行修改即可。

简单标签库使用 总结:

继承SimpleTagSupport。tld文件中声明有标签体使用scriptless,意思是标签体中不能有脚本代码(java程序)

简单标签执行步骤(原理):

  • 遇到简单标签之后,先实例化标签类。
  • 调用setJspContext()pageContexr()将jsp页面对象传递过来。
  • 调用setParent()方法将标签的父标签传递过来,如果没有父标签传递null.
  • 调用setJspBody()将封装了标签体内容的JspFragment对象传递过来。
  • 执行标签(调用doTag()方法),控制标签之后的内容不被执行,只需要抛出new SkipPageException()即可。
    JspFragment content = this.getJspBody();
    content.invoke(this.getJspContext().getOut());
    使用invoke()方法将内容写入对应的流缓冲区中。
  • 垃圾回收器回收标签对象(在传统标签中,标签对象会驻留在内存中继续服务之后的调用)

标签定义属性:

  • 在标签类中创建属性值,并创建set方法。
  • 在tld文件中声明属性。
            
            Outputs Hello, World
            test6
            baixinping.tag.Test6
            scriptless
            
                //属性名
                count
                //属性是否必须
                true
                //属性值是否可以使用表达式
                true
            
            

注意:set方法会自动有服务器调用,服务器赋值只能够进行8中基本数据类型转换。若是复杂类型,则在jsp页面中使用表达式。

你可能感兴趣的:(自定义JSP标签总结)