zoukankan      html  css  js  c++  java
  • JavaWeb:标签(二)

     接上一节

    setJspContext:

    一定会被 JSP 引擎所调用,先于 doTag, 把代表JSP 引擎的 pageContext 传给标签处理器类。

    带属性的自定义标签:

     1)、先在标签处理器类中定义 setter 方法,建议把所有的属性类型都设置为 String 类型。

    例如:

    private String value;
    private String count;
    
    public void setValue(String value) {
      this.value = value;
    }
    
    public void setCount(String count) {
      this.count = count;
    }

    2)、在 .tld 描述文件中来描述属性:

    例如:

    <!-- 描述当前标签的属性 -->
    <attribute>
        <!-- 属性名, 需和标签处理器类的 setter 方法定义的属性相同 -->
        <name>value</name>
        <!-- 该属性是否被必须 -->
        <required>true</required>
        <!-- rtexprvalue: runtime expression value 当前属性是否可以接受运行时表达式的动态值 -->
        <rtexprvalue>true</rtexprvalue>
    </attribute>

    3)、在页面中使用属性,属性名同 .tld 文件中定义的名字。

    例如: <hnust:hello value="${param.name }" count="10"/> 

    4)、通常情况下,开发简单标签直接继承 SimpleTagSupport 就可以了,可以直接调用其对应的 getter 方法得到对应的 API 。

     1 public class SimpleTagSupport implements SimpleTag{
     2     
     3     public void doTag() 
     4         throws JspException, IOException{}
     5     
     6     private JspTag parentTag;
     7     
     8     public void setParent( JspTag parent ) {
     9         this.parentTag = parent;
    10     }
    11     
    12     public JspTag getParent() {
    13         return this.parentTag;
    14     }
    15     
    16     private JspContext jspContext;
    17     
    18     public void setJspContext( JspContext pc ) {
    19         this.jspContext = pc;
    20     }
    21     
    22     protected JspContext getJspContext() {
    23         return this.jspContext;
    24     }
    25     
    26     private JspFragment jspBody;
    27                 
    28     public void setJspBody( JspFragment jspBody ) {
    29         this.jspBody = jspBody;
    30     }
    31     
    32     protected JspFragment getJspBody() {
    33         return this.jspBody;
    34     }   
    35 }

    带标签体的自定义标签:

    1)、若一个标签有标签体: <hnust:testJspFragment>abcdefg</hnust:testJspFragment> 

    在自定义标签的标签处理器中使用 JspFragment 对象封装标签体信息。

    2)、若配置了标签含有标签体,则 JSP 引擎会调用 setJspBody() 方法把 JspFragment 传递给标签处理器类。

    在SimpleTagSupport 中还定义了一个 getJspBody() 方法,用于返回 JspFragment 对象。

    3)、JspFragment 的 invoke(Wirter) 方法:把标签体内容从 Writer 中输出,若为 null,则等同于 invoke(getJspContext.getOut()),即直接把标签体内容输出到页面上。

    有时,可以借助 StringWriter,可以在标签处理器类中先得到标签体的内容:

      ①、利用 StringWriter 得到标签体的内容。

       StringWriter sw = new StringWriter();   bodyContent.invoke(sw); 

      ②、把标签体的内容都变为大写

       String content = sw.toString().toUpperCase(); 

    4)、在 .tld 文件中,使用 body-content 节点来描述标签体的类型:

      <body-content>: 指定标签体的类型, 大部分情况下, 取值为 scriptless 。可能取值有 3 种:empty: 没有标签体;scriptless: 标签体可以包含 el 表达式和 JSP 动作元素,但不能包含 JSP 的脚本元素;tagdependent: 表示标签体交由标签本身去解析处理。若指定 tagdependent,在标签体中的所有代码都会原封不动的交给标签处理器,而不是将执行结果传递给标签处理器。

    例如:<body-content>tagdependent</body-content>

    5)、定义一个自定义标签: <hnust:printUpper time="10">abcdefg</hnust>   把标签体的内容转为大写,并输出 time  次到浏览器上。

     1 public class TestJspFragment extends SimpleTagSupport {
     2     
     3     @Override
     4     public void doTag() throws JspException, IOException {
     5         JspFragment bodyContent = getJspBody();
     6         //JspFragment.invoke(Witer): Writer 即为标签体内容输出的字符流, 若为 null, 则
     7         //输出到 getJspContext().getOut(), 即输出到页面上.
     8         
     9         //1. 利用 StringWriter 得到标签体的内容.
    10         StringWriter sw = new StringWriter();
    11         bodyContent.invoke(sw);
    12         
    13         //2. 把标签体的内容都变为大写
    14         String content = sw.toString().toUpperCase();
    15         
    16         //3. 获取 JSP 页面的 out 隐含对象, 输出到页面上
    17         getJspContext().getOut().print(content);
    18     }
    19     
    20 }

    有父标签的标签:

    1)、父标签无法获得子标签的引用,父标签仅把子标签作为标签体来使用。

    2)、子标签可以通过 getParent() 方法来获取父标签的引用(需继承 SimpleTagSupport 或自实现 SimpleTag 接口的该方法):若子标签的确有个父标签,JSP 引擎会把代表父标签的引用通过 setParent(JspTag parent) 赋给标签处理器。

    3)、注意:父标签的类型是 JspTag 类型的,该接口是一个空接口,但是来统一 SimpleTag 和 Tag 的。实际使用需要进行类型的强制转换。

    4)、在 .tld 配置文件中,无需为父标签有额外的配置,但,子标签是以标签体的形式存在的,所以父标签的 <body-content></body-content> 需设置为 scriptless。

  • 相关阅读:
    C# 中的EventHandler
    Leetcode:Combinations 组合
    Leetcode:Minimum Path Sum
    [LeetCode] Container With Most Water
    一个数n的最少可以由多少个数的平方和组成
    单链表的归并排序
    几个常用的操作系统进程调度算法(转)
    字符串的最长重复子串(转)
    linux静态链接库与动态链接库详解
    简易的hashtable实现
  • 原文地址:https://www.cnblogs.com/daoxiaobai/p/6284104.html
Copyright © 2011-2022 走看看