zoukankan      html  css  js  c++  java
  • 自定义taglib的开发

    自定义标签必须实现下面三个接口中的一个:Tag、IterationTag、BodyTag

    1.Tag
      如果要实现这个接口,可以通过扩展TagSupport这个类,来写自己需要的方法,而不需要把Tag接口中的所有方法实现。
      Tag接口的方法:
     doStartTag()、doEndTag()、getParent()、setParent()、release()、setPageContext()
      在Tag类代码中不能像jsp一样,直接使用out隐含对象,他有一个对象可以使用pageContext,通过它的getOut()方法可以得到out对象。在标签内部,访问任何的隐含对象,都是通过调用pageContext的set方法。

    2.IterationTag
      IterationTag接口与Tag接口类似,用于当一个自定义标签需要重复计算它的代码体的情况下。它扩展Tag接口并实现了一个新的方法 doAfterBody()来实现循环,这个方法只有从doStartTag()返回EVAL_BODY_INCLUDE时才被调用。在执行 doAfterBody()方法时,如果返回的是EVAL_BODY_AGAIN,那么将再次执行doAfterBody()方法,直到 doAfterBody()返回的是SKIP_BODY或者EVAL_BODY_INCLUDE。

    3.BodyTag
      BodyTag接口扩展了IterationTag并提供了对代码体内容进行操作的功能。就是在计算代码体的时候可以对已经形成的代码体进行修改。 BodyContent对象就是用来保存对自定义标签体计算的结果。它有一个新方法doInitBody(),这个方法只有在doStartTag()方 法返回EVAL_BODY_BUFFERED时才调用,此时它将创建一个BodyContent对象保存结果。

    扩展自定义标签:
    添加属性
     首先要在tld文件中加入一个属性元素,然后在java文件中需要定义这个属性以及它的的setter 方法。属性<attribute>元素有四个子元素分别 是<name>、<required>、<rtexprvalue>、<description>,这 里<rtexprvalue>表示的是属性是否接受scriptlet表达式的计算结果,默认情况下为false,即只能接受静态值。

    添加变量
     可以在tld文件中给自定义标签加入一个<variable>元素,它的子元素包括<name- given>表示保存变量的名字,<variable-class>表示变量的java类型,<declared>用 boolean表示这个变量是否为新的,<scope>表示变量的使用范围(AT_BEGIN表示从起始标签起,AT_END表示从终止标签 后,NESTED表示起始标签和终止标签之间)。定义了变量之后,需要在java文件中把这个变量用 pageContext.setAttribute("",object);这里key值应该就是变量对外的名字。

    使用TagExtraInfo(TEI)类
     这个对象中有两类对象可以使用,TagData(保存标签属性的信息)、VariableInfo(描述代码变量)
     一段TagExtraInfo类代码实例:
      public VariableInfo[] getVariableInfo(TagData data) {
        String variableName = data.getAttributeString("name");
        VariableInfo vi =
          new VariableInfo(variableName,"String []", true, VariableInfo.AT_END);
        VariableInfo[] tagVariables = new VariableInfo[1];
        tagVariables[0] = vi;
        return tagVariables;
      }
     可 以通过TagData类的getAttributeString方法得到某个属性的值,还有另外一个方法getAttribute也是得到某个属性的值不 过返回的是一个对象。而getVariableInfo方法必须返回一个VariableInfo数组。除此之外,还需要在tld中的元素定 义<tag-class>后加入一个<tei-class>元素,说明TEI类的全称。

    pageContext对象中含有的方法包括:getOut();getPage();getRequest();getResponse();getServletConfig();getServletContext();getSession();

    Tag接口中的返回常数意义:
    EVAL_BODY_INCLUDE:告诉服务器正文的内容,并把这些内容送入输出流
    SKIP_BODY:告诉服务器不要处理正文内容
    EVAL_PAGE:让服务器继续执行页面
    SKIP_PAGE:让服务器不要处理剩余的页面
    EVAL_BODY_AGAIN:让服务器继续处理正文内容,只有doAfterBody方法可以返回
    EVAL_BODY_BUFFERED:BodyTag接口的字段,在doStartTag()返回
    EVAL_BODY_INCLUDE、SKIP_BODY一般由doStartTag()返回,而EVAL_PAPGE、SKIP_PAGE由doEndTag()返回。

    在调用doStartTag()方法之前其实标记还调用了其他两个方法:setPageContext()和setParent();所以在后面的方法中可以使用pageContext和parent对象,如果需要的话。

    让自定义标签在页面中创建对象时必须使用一个标准的JSP对象TagExtraInfo类,它可以创建脚本变量还可以在编译的时候对标签进行检验,TEI类仅可以生成由setAttribute方法存储在PageContext对象中的变量,而并不是单独生成变量。

    通过TEI类定义脚本变量可以让使用者自己定义在页面中使用对象的名称。
    除了使用TEI类方法之外,还可以简单的在TLD中定义一个<variable>对象来使用自定义对象,用法如下:
    <variable>
     <name-from-attribute>name</name-from-attribute>
     <variable-class>String []</variable-class>
     <declare>true</declare>
     <scope>AT_END</scope>
    </variable>
    对于variable的子元素,<name-from-attribute>指的是创建的变量名称从属性name中来取得,当然也可以通过<name-given>元素来限制变量的名称。注意这两个元素是互斥

  • 相关阅读:
    C#调用java类、jar包方法
    利用IKVM在C#中调Java程序
    同样版本的jstl,都是jstl1.2版本,有个有问题,另一个没有问题
    Python安装及开发环境配置
    jQuery EasyUI parser 的使用场景
    关于HttpURLConnection.setFollowRedirects
    HttpUrlConnection 的 setDoOutput 与 setDoInput
    【Mybatis】向MySql数据库插入千万记录 单条插入方式,用时 1h16m30s
    [MyBatis]再次向MySql一张表插入一千万条数据 批量插入 用时5m24s
    [MyBatis]向MySql数据库插入一千万条数据 批量插入用时6分 之前时隐时现的异常不见了
  • 原文地址:https://www.cnblogs.com/wycg1984/p/1681582.html
Copyright © 2011-2022 走看看