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的自定义函数

  • 相关阅读:
    为什么不直接使用socket ,还要定义一个新的websocket 的呢
    js-权威指南-Web套接字
    CSS-蜂窝状展示区域(多个六边形)的一种实现方式
    MQTT入门介绍
    【珍惜时间】vuepro
    搭建react的vw架构时候报 Cannot load preset "advanced".
    跟我一起使用create-react-app脚手架搭建vw-layout解决方案
    【珍惜时间】iReport
    vue中 给router-view 组件的 绑定 key 的原因
    SQL Server Index详解
  • 原文地址:https://www.cnblogs.com/jasonHome/p/5562427.html
Copyright © 2011-2022 走看看