JSP:自定义标签的详细说明

l 自定义标签主要用于移除 Jsp 页面中的 java 代码。
还能加入一些控制逻辑
      •
控制 jsp 页面某一部分内容是否执行。
      • 控制整个 jsp 页面是否执行。
      • 控制 jsp 页面内容重复执行。
      • 修改 jsp 页面内容输出。

l 使用自定义标签移除 jsp 页面中的 java 代码,只需要完成以下三个步骤:
    • 编写一个实现 Tag 接口或者SimpleTag接口的 Java ( 标签处理器类 )

     编写标签库描述符(tld)文件,在tld文件中对标签处理器类进行描述。

     在JSP页面中引入标签库并按照规则使用。

自定义标签的执行流程

lJSP引擎将遇到自定义标签时,首先创建标签处理器类的实例对象,然后按照JSP规范定义的通信规则依次调用它的方法。

  1public voidsetPageContext(PageContext pc)JSP引擎实例化标签处理器后,将调用setPageContext方法将JSP页面的pageContext对象传递给标签处理器,标签处理器以后可以通过这个pageContext对象与JSP页面进行通信。

  2public voidsetParent(Tag t)setPageContext方法执行完后,WEB容器接着调用的setParent方法将当前标签的父标签传递给当前标签处理器,如果当前标签没有父标签,则传递给setParent方法的参数值为null

  3publicintdoStartTag(),调用了setPageContext方法和setParent方法之后,WEB容器执行到自定义标签的开始标记时,就会调用标签处理器的doStartTag方法。

  4publicintdoEndTag()WEB容器执行完自定义标签的标签体后,就会接着去执行自定义标签的结束标记,此时,WEB容器会去调用标签处理器的doEndTag方法。

  5public void release(),通常WEB容器执行完自定义标签后,标签处理器会驻留在内存中,为其它请求服务器,直至停止web应用时,web容器才会调用release方法。

JSP:自定义标签的详细说明_第1张图片

简单标签SimpleTag接口

l 由于传统标签使用三个标签接口来完成不同的功能,显得过于繁琐,不利于标签技术的推广, SUN 公司为降低标签技术的学习难度,
JSP 2.0 中定义了一个更为简单、便于编写和调用的 SimpleTag 接口来实现标签的功能。实现 SimpleTag 接口的标签通常称为简单标签。简单标签共定义了 5 个方法:
          • setJspContext 方法
               • 用于把 JSP 页面的 pageContext 对象传递给标签处理器对象
          • setParent getParent 方法
               • 用于把父标签处理器对象传递给当前标签处理器对象 用于获得当前标签的父标签处理器对象
          • setJspBody 方法   
              • 用于把代表标签体的 JspFragment 对象传递给标签处理器对象
          doTag 方法

             • 用于完成所有的标签逻辑,包括输出、迭代、修改标签体内容等。在 doTag 方法中可以抛出 javax.servlet.jsp.SkipPageException 异常,
                 用于通知
WEB 容器不再执行 JSP 页面中位于结束标记后面的内容,这等效于在传统标签的 doEndTag 方法中返回 Tag.SKIP_PAGE 常量的情况。

简单标签的执行路径

l web 容器开始执行标签时,会调用如下方法完成标签的初始化
WEB 容器调用标签处理器对象的 setJspContext 方法,将代表 JSP 页面的 pageContext 对象传递给标签处理器对象。
WEB 容器调用标签处理器对象的 setParent 方法,将父标签处理器对象传递给这个标签处理器对象。注意,只有在标签存在父标签的情况下, WEB 容器才会调用这个方法。
如果调用标签时设置了属性,容器将调用每个属性对应的 setter 方法把属性值传递给标签处理器对象。如果标签的属性值是 EL 表达式或脚本表达式,则 WEB 容器首先计算表达式的值,然后把值传递给标签处理器对象。
如果简单标签有标签体,容器将调用 setJspBody 方法把代表标签体的 JspFragment 对象传递进来。
l 执行标签时:
容器调用标签处理器的 doTag () 方法,开发人员在方法体内通过操作 JspFragment 对象,就可以实现是否执行、迭代、修改标签体的目的。

JSPFragment介绍

l javax.servlet.jsp.tagext.JspFragment 类是在 JSP2.0 中定义的,它的实例对象代表 JSP 页面中的一段符合 JSP 语法规范的 JSP 片段,这段 JSP 片段中不能包含 JSP 脚本元素。
l WEB 容器在处理简单标签的标签体时,会把标签体内容用一个 JspFragment 对象表示,并调用标签处理器对象的 setJspBody 方法把 JspFragment 对象传递给标签处理器对象。 JspFragment 类中只定义了两个方法,如下所示:
        getJspContext 方法
               • 用于返回代表调用页面的 JspContext 对象 .
        publicabstract void invoke( java.io.Writer  out)
               • 用于执行 JspFragment 对象所代表的 JSP 代码片段
               • 参数 out 用于指定将 JspFragment 对象的执行结果写入到哪个输出流对象中,可以先输出到StringWriter中用于修改,如果传递给参数 out 的值为 null
                      则将执行结果写入到
JspContext.getOut () 方法返回的输出流对象中。 ( 简而言之,可以理解为写给浏览器 )

JSPFragment的invoke方法

l JspFragment.invoke 方法是 JspFragment 最重要的方法,利用这个方法可以控制是否执行和输出标签体的内容、是否迭代执行标签体的内容或对标签体的执行结果进行修改后再输出。例如:
     • 在标签处理器中如果没有调用 JspFragment.invoke 方法,其结果就相当于忽略标签体内容;
     • 在标签处理器中重复调用 JspFragment.invoke 方法,则标签体内容将会被重复执行;
     • 若想在标签处理器中修改标签体内容,只需在调用 invoke 方法时指定一个可取出结果数据的输出流对象(例如 StringWriter ),让标签体的执行结果输出到该输出流对象中,然后从该输出流对象中取出数据进行修改后再输出到目标设备,即可达到修改标签体的目的。

显示标签体

public class SimpleDemo1 extends SimpleTagSupport {

         @Override

         public void doTag() throws JspException, IOException {

                   JspFragment jf=this.getJspBody();

                   jf.invoke(this.getJspContext().getOut());

                   super.doTag();

         }

}

不显示标签体

public class SimpleDemo1 extends SimpleTagSupport {

         @Override

         public void doTag() throws JspException, IOException {

        

         }

}

//重复显示

publicclass SimpleDemo2 extends SimpleTagSupport {

    @Override

    publicvoid doTag() throws JspException, IOException {

       JspFragment jf=this.getJspBody();

       for(int i=0;i<5;i++)

           jf.invoke(this.getJspContext().getOut());

//与这个等价jf.invoke(null);

       super.doTag();

    }

}

//修改标签内容

public class SimpleDemo3 extends SimpleTagSupport {

         @Override

         public void doTag() throws JspException, IOException {

                   JspFragment jf=this.getJspBody();

                   StringWriter sw=new StringWriter();     

                   jf.invoke(sw);

                  

                   String content=sw.toString();

                   content=content.toUpperCase();  

                  

                   this.getJspContext().getOut().write(content);                

         }

}

//停止显示标签后面文档内容

publicclass SimpleDemo4 extends SimpleTagSupport {

    @Override

    publicvoid doTag() throws JspException, IOException {

       thrownew SkipPageException(); 

    }

}


开发带有属性的自定义标签
l 自定义标签可以定义一个或多个属性,这样,在 JSP 页面中应用自定义标签时就可以设置这些属性的值,通过这些属性为标签处理器传递参数信息,从而提高标签的灵活性和复用性。
l 要想让一个自定义标签具有属性,通常需要完成两个任务:
        • 在标签处理器中编写每个属性对应的 setter 方法
        • TLD 文件中描术标签的属性
l 为自定义标签定义属性时,每个属性都必须按照 JavaBean 的属性命名方式,在标签处理器中定义属性名对应的 setter 方法,用来接收 JSP 页面调用自定义标签时传递进来的属性值。 例如属性 url ,在标签处理器类中就要定义相应的 setUrl (String url ) 方法。
l 在标签处理器中定义相应的 set 方法后, JSP 引擎在解析执行开始标签前,也就是调用 doStartTag 方法前,会调用 set 属性方法,为标签设置属性。

元素名

是否必须指定

描     

description

用于指定属性的描述信息。

name

用于指定属性的名称。属性名称是大小写敏感的,并且不能以jsp_jspjavasun开头。

required

用于指定在JSP页面中调用自定义标签时是否必须设置这个属性。其取值包括truefalse,默认值为falsetrue表示必须设置,否则可以设置也可以不设置该属性。

rtexprvalue

rtexprvalueruntime expression value(运行时表达式)的英文简写,用于指定属性值是一个静态值或动态值。其取值包括truefalse,默认值为falsefalse表示只能为该属性指定静态文本值,例如"123"true表示可以为该属性指定一个JSP动态元素,动态元素的结果作为属性值,例如JSP表达式<%=value %>

type

用于指定属性值的Java类型。


将自己写的标签打包






你可能感兴趣的:(JSP:自定义标签的详细说明)