zoukankan      html  css  js  c++  java
  • [原创]java WEB学习笔记42:带标签体的自定义标签,带父标签的自定义标签,el中自定义函数,自定义标签的小结

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用

    内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系。

    本人互联网技术爱好者,互联网技术发烧友

    微博:伊直都在0221

    QQ:951226918

    -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

    1.带变迁体的自定义标签

       1). 若一个变迁含有标签体,如:<jason:testJspFragment>hello word</jason:testJspFragment>

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

       2). 若配置的标签含有标签体,则JSP引擎会自动的调用 setJspBody() 方法,把 JspFragment 传递给标签自定义的处理器类,在SimpleTagSupport中还定义 了一个getBody()方法,用于返回 JspFragment 对象

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

    TestJspFragment.jsp

     1 package com.jason.tag.mytag;
     2 
     3 import java.io.IOException;
     4 import java.io.StringWriter;
     5 
     6 import javax.servlet.jsp.JspException;
     7 import javax.servlet.jsp.tagext.JspFragment;
     8 import javax.servlet.jsp.tagext.SimpleTagSupport;
     9 
    10 public class TestJspFragment extends SimpleTagSupport{
    11 
    12     @Override
    13     public void doTag() throws JspException, IOException {
    14         JspFragment bodyContent = getJspBody();
    15         //JspFragment.invoke(Writer) : Writer 即为标签体内容输出的字符流,
    16         //若为null,则输出到getJspContext().getOut() 即输出到页面上
    17         //bodyContent.invoke(null);
    18         
    19         
    20         //1.先用 StringWriter 得到标签体的内容
    21         StringWriter sw = new StringWriter();
    22         bodyContent.invoke(sw);
    23         
    24         //2.把标签体的内容变成大写
    25         String  content = sw.toString().toUpperCase();
    26         
    27         //3.获取jsp 页面的out隐含对象,输出到页面
    28         getJspContext().getOut().print(content);
    29         
    30         
    31     }
    32     
    33     
    34     
    35     
    36 }

       4). 在 tld 文件中使用<body-content></body-content> 来描述标签体的类型:

           empty:没有标签体

            scriptless:标签体可以包含 el 表达式和 JSP 动作元素,但不能包含 JSP 的脚本元素。大部分取值,采用EL表达式

             tagdependent:表示标签体交由标签本身去解析处理。若指定 tagdependent,在标签体中的所有代码都会原封不动的交给标签处理器,而不是将执行结果传递给标签处理器

     1  <!-- 带标签体的自定义标签 -->
     2  
     3  <tag>
     4      <name>testJspFragment</name>
     5      <tag-class>com.jason.tag.mytag.TestJspFragment</tag-class>
     6      <body-content>scriptless</body-content>
     7  
     8  </tag>
     9  
    10  

     2.带父标签的自定义标签

    1.父标签无法获取子标签的引用,父标签只是把子标签当做标签体来使用

    2.子标签可以通过 getParent() 方法获取父类,方法来自父标签的应用(或者继承 SimpleTagSupport ):若子标签的确有父标签,JSP 引擎(tomcat)会把代表 父标签的引用通过 setParent(JspTag parent) 赋给标签处理类

      注意:父标签的类型是 JspTag 类型。该接口是一个空接口,是来统一 SimpleTag 和 Tag 的。可以通过类型强转

    3.在 tld 配置文件中,无需为父标签有额外的配置,但,子标签是以变前体的范式存在的,所以父标签的  <body-content>scriptless</body-content>

    Mytag.tld

     1  <!-- 包含父标签的自定义标签 -->
     2  <tag>
     3      <name>parentTag</name>
     4      <tag-class>com.jason.tag.mytag.ParentTag</tag-class>
     5      <body-content>scriptless</body-content>
     6  </tag>
     7  
     8  <tag>
     9      <name>sonTag</name>
    10      <tag-class>com.jason.tag.mytag.SonTag</tag-class>
    11      <body-content>empty</body-content>
    12  </tag>
    13  

     SonTag.java

     1 package com.jason.tag.mytag;
     2 
     3 import java.io.IOException;
     4 
     5 import javax.servlet.jsp.JspException;
     6 import javax.servlet.jsp.tagext.JspTag;
     7 import javax.servlet.jsp.tagext.SimpleTagSupport;
     8 
     9 public class SonTag  extends SimpleTagSupport{
    10     
    11     @Override
    12     public void doTag() throws JspException, IOException {
    13         //1.得到 父标签的引用
    14         JspTag parent = getParent();
    15         
    16         //2.获取父标签的 name 属性
    17         ParentTag parentTag = (ParentTag) parent;
    18         String name = parentTag.getName();
    19         
    20         //3.把 name 值打印到 jsp 页面上
    21          getJspContext().getOut().print("子标签输出name:" + name);
    22      
    23     }
    24 }

    Parent.java

     1 package com.jason.tag.mytag;
     2 
     3 import java.io.IOException;
     4 
     5 import javax.servlet.jsp.JspException;
     6 import javax.servlet.jsp.tagext.SimpleTagSupport;
     7 
     8 public class ParentTag extends SimpleTagSupport{
     9     
    10     private String name = "jason";
    11     
    12     public String getName() {
    13         return name;
    14     }
    15     
    16     @Override
    17     public void doTag() throws JspException, IOException {
    18         System.out.println("parent tag name" + name);
    19         getJspBody().invoke(null);
    20         
    21     }
    22 }

     

     

     

     3.EL 自定义函数。El中还是有很多的不同的定义好的函数

    1.EL 自定义函数:在 EL 表达式中调用的某个 Java 类的静态方法,这个静态方法需在 web 应用程序中进行配置才可以被 EL 表达式调用.

      EL 自定义函数可以扩展 EL 表达式的功能,让 EL 表达式完成普通 Java 程序代码所能完成的功能

    2.EL 自定义函数开发步骤

       1)编写 EL 自定义函数映射的Java 类中的静态方法: 这个 Java 类必须带有 public 修饰符,方法必须是这个类的带有 public 修饰符的静态方法

        MyELFunc.java
     1 package com.jason.tag.mytag;
     2 
     3 public class MyELFunc {
     4     
     5     public static String concat(String str1,String str2){
     6         
     7         return str1 + str2;
     8     }
     9 
    10 }

      

      2)编写标签库描述文件(tld 文件), 在 tld 文件中描述自定义函数

      mytag.tld

    1  <!-- 描述 el 自定义函数  -->
    2  
    3  <function>
    4      <name>concat</name>
    5      <function-class>com.jason.tag.mytag.MyELFunc</function-class>
    6      <function-signature>java.lang.String  concat(java.lang.String ,java.lang.String )</function-signature>
    7  </function>
    8  

      

      3)在 JSP 页面中导入和使用自定义函数

        ${jason:concat("64645646","132135") }

    EL中的函数

     小结

    1.创建标签处理类:继承SimpleTagSupport

    2.编写tld文件,<short-name> <uri> 很重要

    3.带标签体的标签,带父标签的标签,EL的自定义函数

  • 相关阅读:
    Java实现 蓝桥杯VIP 算法训练 数的统计
    Java实现 蓝桥杯VIP 算法训练 和为T
    Java实现 蓝桥杯VIP 算法训练 友好数
    Java实现 蓝桥杯VIP 算法训练 连续正整数的和
    Java实现 蓝桥杯VIP 算法训练 寂寞的数
    Java实现 蓝桥杯VIP 算法训练 学做菜
    Java实现 蓝桥杯VIP 算法训练 暗恋
    Java实现 蓝桥杯VIP 算法训练 暗恋
    测试鼠标是否在窗口内,以及测试鼠标是否在窗口停留
    RichEdit 各个版本介绍
  • 原文地址:https://www.cnblogs.com/jasonHome/p/5562427.html
Copyright © 2011-2022 走看看