zoukankan      html  css  js  c++  java
  • 10.自定义EL函数和自定义标签

    需要在JSP页面中进行一些常见逻辑操作(如对字符串进行操作),首先考虑是否可以用到sun公司提供的EL函数库(fn.tld)和JSTL 核心标签库

    如果sun公司的EL函数库没有或者无法满足,就需要自己写 自定义标签或者写一个EL函数

    自定义EL函数:

    1.写这样一个 满足你的逻辑的函数(必须是静态的)

    1 public class elDemo {
    2     
    3     public static String demo(String str) {
    4         return str;
    5     }
    6 
    7 }

    2.这个Java类的静态方法需要在TLD文件中描述,才可以被EL表达式调用

     1 <?xml version="1.0" encoding="UTF-8" ?>  
     2 <taglib xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
     3     xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee web-jsptaglibrary_2_0.xsd"  
     4     version="2.0"> 
     5 
     6 
     7   <tlib-version>1.0</tlib-version>
     8   <jsp-version>1.2</jsp-version>
     9   <short-name>el</short-name>
    10   <uri>/el</uri>
    11 
    12 
    13   <function> 
    14       <name>demo</name>
    15       <function-class>elDemo</function-class>
    16       <function-signature>java.lang.String demo (java.lang.String)</function-signature>    
    17   </function>
    18 
    19 
    20 
    21 </taglib>

    3.在jsp页面去使用

     1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
     2 <%@taglib uri="/el" prefix="el" %>
     3 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
     4 <html>
     5   <head>
     6     <title>My JSP '2.jsp' starting page</title>
     7   </head>
     8   
     9   <body>
    10     ${el:demo("sss") }   
    11   </body>
    12 </html>

    自定义标签

    1.传统自定义标签:

      1.遇到自定义标签,首先实例化标签对应的标签处理器类

      2.调用setPageContext方法,把页面的pageContext对象 传递给标签处理器类

      3.看标签是否有父标签,有则把父标签作为一个对象,调用setParent方法调用该对象

      //(上面是自动的(服务器做的),但是需要做到:1.在JSP页面中,写好taglib指令,并合理调用自定义标签 2.写好标签处理器类 3.写好tld文件(抄头抄尾))

      4.完成以上标签的初始化工作后,服务器就开始执行标签,这时遇到标签的开始标签 ,就调用doStartTag方法

      5.如果标签有标签体,这时服务器一般会执行标签体

      6.服务器遇到JSP页面结束标签,则调用处理器的doEndTag方法

      7.整个标签执行完后,服务器一般会调用release方法释放标签工作时所占用的资源

     1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
     2 <%@taglib uri="/foreachTag" prefix="c"%>
     3 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
     4 <html>
     5   <head>
     6     <title>My JSP '3.jsp' starting page</title>
     7   </head>
     8   
     9   <body>
    10     <%
    11         List list = new ArrayList();
    12         list.add("aaa");
    13         list.add("bbb");
    14         list.add("ccc");
    15         list.add("dddd");
    16         request.setAttribute("list", list);
    17                                 
    18      %>
    19      <c:foreach var="str" items="${list }">
    20      ${str }
    21      </c:foreach>
    22   </body>
    23 </html>
    //标签处理器类  自定义foreach标签
    public class foreachTag extends SimpleTagSupport {
        private Object items;
        private String var;
            
        public void setItems(Object items) {
            this.items = items;
        }
    
        public void setVar(String var) {
            this.var = var;
        }
    
        @Override
        public void doTag() throws JspException, IOException {
            List list = (List) items;
            Iterator it = list.iterator();
            
            while(it.hasNext()) {
                Object value = it.next();
                this.getJspContext().setAttribute(var, value);
                this.getJspBody().invoke(null);
            }
        }    
    }
     1 <?xml version="1.0" encoding="UTF-8" ?>
     2 
     3 <!DOCTYPE taglib
     4         PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
     5         "http://java.sun.com/j2ee/dtd/web-jsptaglibrary_1_2.dtd">
     6 
     7 
     8 <taglib>
     9   <tlib-version>1.0</tlib-version>
    10   <jsp-version>1.2</jsp-version>
    11   <short-name>simple</short-name>
    12   <uri>/foreachTag</uri>
    13 
    14 
    15   <tag>
    16     <name>foreach</name>
    17     <tag-class>com.Tag.foreachTag</tag-class>
    18     <body-content>scriptless</body-content>
    19 
    20     <attribute>
    21         <name>var</name>
    22         <required>true</required> 
    23         <rtexprvalue>true</rtexprvalue>
    24     </attribute>
    25         <attribute>
    26         <name>items</name>
    27         <required>true</required> 
    28         <rtexprvalue>true</rtexprvalue>
    29     </attribute>
    30   </tag>
    31 </taglib>

    2.简单自定义标签(及属性的设置)

      1.遇到简单标签,同样先实例化标签对应的标签处理器类

      2.调用setJspContext,把页面pageContext传递给标签处理器类

      3.调用setParent方法,把父标签传递进去,如果没有,则传递null

      //(上面是自动的,但是需要做到:1.在JSP页面中,写好taglib指令,并合理调用自定义标签 2.写好标签处理器类 3.写好tld文件(抄头抄尾)

      4.调用setJspBody方法,把封装了标签体JspFragment传递给标签处理器类

      5.执行页面中的自定义标签,执行标签实际上就是调用doTag方法

     1 public class SimpleTag extends SimpleTagSupport {
     2 
     3     private int count;
     4     
     5     public void setCount(int count) {
     6         this.count = count;
     7     }
     8     @Override
     9     public void doTag() throws JspException, IOException {
    10         
    11         JspFragment jf = this.getJspBody();
    12         for(int i = 0;i<count;i++) {
    13             jf.invoke(null);
    14         }
    15     }
    16     
    17 }
     1 <?xml version="1.0" encoding="UTF-8" ?>
     2 
     3 <!DOCTYPE taglib
     4         PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
     5         "http://java.sun.com/j2ee/dtd/web-jsptaglibrary_1_2.dtd">
     6 
     7 
     8 <taglib>
     9   <tlib-version>1.0</tlib-version>
    10   <jsp-version>1.2</jsp-version>
    11   <short-name>simple</short-name>
    12   <uri>/sTag</uri>
    13 
    14 
    15   <tag>
    16     <name>sTag</name>
    17     <tag-class>com.Tag.SimpleTag</tag-class>
    18     <body-content>scriptless</body-content>
    19 
    20     <attribute>
    21         <name>count</name>
    22         <required>true</required> 
    23         <rtexprvalue>true</rtexprvalue>
    24     </attribute>
    25   </tag>
    26 
    27 
    28 </taglib>



    注意:

      1.简单自定义标签在tld文件中 <body-content>srcipt</body-content> 传统自定义标签 <body-content>JSP</body-content>

      2.设置带属性的标签的步骤:1.在标签处理器类中编写每个属性对应的setter方法 2.在TLD文件中描述标签的属性

      3.在设置带属性的标签时,除了基本的name(属性名)的设置,还有:

      <required>true</required> (这个元素设置该属性是否必须)

      <rtexprvalue>true</rtexprvalue> (这个元素设置该属性是否支持运行时表达式(这样就支持了el表达式)为属性赋值 一般都设置为true)

      4.传统自定义标签的生命周期为创建该自定义标签到工程结束;;简单自定义标签的生命周期为 创建该标签,到完成上面的5步,就自动销毁

  • 相关阅读:
    Spring Boot中使用logback日志框架
    Java日志框架-logback配置文件参考(转)
    Java日志框架-logback配置文件多环境日志配置(开发、测试、生产)(原始解决方法)
    MySQL取每组的前N条记录
    跟大佬一起读源码:CurrentHashMap的扩容机制
    源码速读及点睛:HashMap
    求两个Linux文本文件的交集、差集、并集
    哪个先执行:@PostConstruct和@Bean的initMethod?
    Android Studio3.0 Error:Execution failed for task ':app:javaPreCompileDebug' 错误
    Android原生项目集成React Native
  • 原文地址:https://www.cnblogs.com/xuzekun/p/7358971.html
Copyright © 2011-2022 走看看