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中的函数

java 函数中再定义函数_java 函数中再定义函数

java 函数中再定义函数_自定义函数_02

 

 

 

 

 

 

 

 小结

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

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

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