EL函数和自定义EL函数

简介

EL原本是JSTL1.0中的技术(所以EL和JSTL感情如此好就是自然的了),但是从JSP2.0开始,EL就分离出来纳入了JSP的标准了。但是EL函数还是和JSTL技术绑定在一起。下面将介绍如何自定义EL函数,以及JSTL中的EL函数。

自定义EL函数虽然用得很少(JSTL自带的EL函数已经够用了),但是可以帮助理解自定义tag打下基础。

自定义EL函数

一、编写Java实现函数

必须是public类中的public static 函数,每一个静态函数就可以成为一个EL函数。
必须在工程的classes下,(Eclipse 的src下),可以放到单独的包里。

package custom;

public class Functions
{
     //反转一个字符串
     public static String reverseString(String str)
     {
          return (new StringBuilder(str).reverse().toString());
     }
     //返回字符串的长度
     public static Integer stringLength(String str)
     {
          return str.length();
     }
}

二、编写.tld文件(tag library descriptor  标签库描述符),注册EL函数,使之可在JSP中被识别。

.tld文件可以放在 WEB-INF下,或者是WEB-INF下的子目录下

【这里我取名为mytag.tld 】

WEB-INF
     --mytag.tld

<!--或者 -->

WEB-INF
     --subfolder
           --mytag.tld
<?xml version="1.0" encoding="UTF-8" ?>

<taglib xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd"
    version="2.1">

<!--
     tld文件是一个XML文件,他定义了一个tag library。
     这个文件描述了一个标签库的相关信息。
     每一个tld文件可以定义多个EL函数,还有自定义标签。

-->

     <description>这是我自己的标签库哦</description>     <!-- 标签库的说明信息 -->

     <tlib-version>1.0</tlib-version>                <!-- 定义这个标签库的版本 -->

<!--
           定义函数库作者推荐的(首选的)名称空间前缀,即在JSP页面通过taglib指令导入标签库时,指定的prefix的值,
           当然,使用者可以完全不使用这个值,而是其它的值。
           例如JSTL核心库前缀是一般是c 。
           <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
-->
     <short-name>nutlee</short-name>

     <!-- 标识这个在互联网上的唯一地址,一般是作者的网站。这里的值用在将在 taglib 指令中 uri的值-->
     <uri>http://www.nutlee.com/jsp-custom</uri>

     <!-- 定义顶一个EL自定义函数 -->
     <function>
          <description>返回一个字符串的长度</description>   <!--函数的功能描述-->

          <!--EL函数名,也就是在JSP页面中使用时的名称,他可以和java代码中的函数名不一样-->
          <name>stringLength</name>

          <!--函数所在的类 -->
          <function-class>custom.Functions</function-class>

          <!-- 函数的签名和返回值类型的说明 。函数的返回类型和参数类型必须是给出全名,如:java.lang.String-->
          <function-signature>java.lang.Integer stringLength(java.lang.String)</function-signature>
     </function>

     <function>
          <description>反转一个字符串</description>
          <name>reverseString</name>
          <function-class>custom.Functions</function-class>
          <function-signature>java.lang.String reverseString(java.lang.String)</function-signature>
     </function>

     <!-- 自定义标签tag也是在这个文件中配置的,后面会讲到 -->

</taglib>

三、在web.xml中对标签库的位置进行映射(如果将自己的标签库打包为jar文件,则可以像使用JSTL那样方便,无需在web.xml中编写代码)

<!--省略-->
<jsp-config>
          <taglib>
              <taglib-uri>     <!--taglib指令下的uri属性的值-->
                   http://www.nutlee.com/jsp-custom
              </taglib-uri>
                               <!--tld文件在工程中的位置-->
               <taglib-location>/WEB-INF/mytag.tld</taglib-location>
          </taglib>

 </jsp-config>

四、在JSP文件中使用

<%@taglib uri="http://www.nutlee.com/jsp-custom" prefix="nutlee"%>

<!--省略。。。。-->

反转字符串${param.msg}:  ${nutlee:reverseString(param.msg)} <br />

字符串长度${param.msg}:  ${nutlee:stringLength(param.msg)}  <br />

<!--省略。。。。-->

打包自己的EL函数库为jar文件

如果编写的EL函数经常使用,可以打包为jar文件,这样拷贝到工程的lib下就可以导入使用了。自定义标签库的打包方法也是如此。

步骤:

测试完标签库,确保OK后,右键自定义标签所在的顶层包,【Export】-->【java】下的【JAR file】

然后用解压软件打开jar文件,将先前的tld文件添加到META-INF目录下,这样就OK了。使用时直接放到lib下,让后在JSP中导入。

JSTL中自带的EL函数

导入:

<%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>

${fn:contains(string,substring)}

判断字符串string中是否包含子串substring,是则返回true,否则false

${fn:containsIgnoreCase(string,substring)}

同上,但是忽略大小写

${fn:substring(string,beginIndex,endIndex)}

返回一个字符串string指定的起始索引的到结束索引(不包含)之间的子串

${fn:substringAfter(string,substring)}

返回string中第一次出现的substring后面的子字符串

"hello word"  , "l"  返回    "lo word"


${fn:substringBefore(string,substring )}

返回string中第一次出现的substring前面的子字符串

"hello word" ,  "l"  返回    "he"


${fn:endsWith(string,end)}

判断字符串string是否以字符串end结尾,是则返回true,否则false

${fn:startsWith(string,start)}

判断字符串string是否以字符串start开始,是则返回true,否则false

${fn:indexOf(string,substring)}

返回substring子串在string中第一次出现的索引,如果找不到则返回-1

${fn:toUpperCase(string)}

返回字符串的大写形式

${fn:toLowerCase(string)}

返回字符串的小写形式

${fn:trim(string)}

返回字符串前后的空白符返回

${fn:escapeXml(string)}

对字符串进行转码

<        &lt;

>        &gt;

&        &amp;

‘         &apos;

"        &quot;


${fn:join(stringArray,separatorString)}

将String数组中的字符串使用字符串separatorString连接。

返回连接后的字符串


${fn:split(string , delimiters)}

将字符串string根据指定的分割字符串delimiters来分割成字符串数组返回

${fn:length(squence)}

返回一个字符串的字符数,或者集合中的元素个数

${fn:replace(string,  oldStr , newStr  )}

将字符串string中的所有的oldStr子字符串替换为指定的新的字符串newStr并返回。

Apahe的实现源代码

package org.apache.taglibs.standard.functions;

import java.lang.reflect.Array;
import java.util.Collection;
import java.util.Enumeration;
import java.util.Iterator;
import java.util.Map;
import java.util.StringTokenizer;
import javax.servlet.jsp.JspTagException;
import org.apache.taglibs.standard.resources.Resources;
import org.apache.taglibs.standard.tag.common.core.Util;

public class Functions
{
  public static String toUpperCase(String input)
  {
    return input.toUpperCase();
  }

  public static String toLowerCase(String input)
  {
    return input.toLowerCase();
  }

  public static int indexOf(String input, String substring)
  {
    if (input == null) {
      input = "";
    }
    if (substring == null) {
      substring = "";
    }
    return input.indexOf(substring);
  }

  public static boolean contains(String input, String substring)
  {
    return indexOf(input, substring) != -1;
  }

  public static boolean containsIgnoreCase(String input, String substring)
  {
    if (input == null) {
      input = "";
    }
    if (substring == null) {
      substring = "";
    }
    String inputUC = input.toUpperCase();
    String substringUC = substring.toUpperCase();
    return indexOf(inputUC, substringUC) != -1;
  }

  public static boolean startsWith(String input, String substring)
  {
    if (input == null) {
      input = "";
    }
    if (substring == null) {
      substring = "";
    }
    return input.startsWith(substring);
  }

  public static boolean endsWith(String input, String substring)
  {
    if (input == null) {
      input = "";
    }
    if (substring == null) {
      substring = "";
    }
    int index = input.indexOf(substring);
    if (index == -1) {
      return false;
    }
    if ((index == 0) && (substring.length() == 0)) {
      return true;
    }
    return index == input.length() - substring.length();
  }

  public static String substring(String input, int beginIndex, int endIndex)
  {
    if (input == null) {
      input = "";
    }
    if (beginIndex >= input.length()) {
      return "";
    }
    if (beginIndex < 0) {
      beginIndex = 0;
    }
    if ((endIndex < 0) || (endIndex > input.length())) {
      endIndex = input.length();
    }
    if (endIndex < beginIndex) {
      return "";
    }
    return input.substring(beginIndex, endIndex);
  }

  public static String substringAfter(String input, String substring)
  {
    if (input == null) {
      input = "";
    }
    if (input.length() == 0) {
      return "";
    }
    if (substring == null) {
      substring = "";
    }
    if (substring.length() == 0) {
      return input;
    }
    int index = input.indexOf(substring);
    if (index == -1) {
      return "";
    }
    return input.substring(index + substring.length());
  }

  public static String substringBefore(String input, String substring)
  {
    if (input == null) {
      input = "";
    }
    if (input.length() == 0) {
      return "";
    }
    if (substring == null) {
      substring = "";
    }
    if (substring.length() == 0) {
      return "";
    }
    int index = input.indexOf(substring);
    if (index == -1) {
      return "";
    }
    return input.substring(0, index);
  }

  public static String escapeXml(String input)
  {
    if (input == null) {
      return "";
    }
    return Util.escapeXml(input);
  }

  public static String trim(String input)
  {
    if (input == null) {
      return "";
    }
    return input.trim();
  }

  public static String replace(String input, String substringBefore, String substringAfter)
  {
    if (input == null) {
      input = "";
    }
    if (input.length() == 0) {
      return "";
    }
    if (substringBefore == null) {
      substringBefore = "";
    }
    if (substringBefore.length() == 0) {
      return input;
    }
    StringBuffer buf = new StringBuffer(input.length());
    int startIndex = 0;
    int index;
    while ((index = input.indexOf(substringBefore, startIndex)) != -1)
    {
      buf.append(input.substring(startIndex, index)).append(substringAfter);
      startIndex = index + substringBefore.length();
    }
    return input.substring(startIndex);
  }

  public static String[] split(String input, String delimiters)
  {
    if (input == null) {
      input = "";
    }
    if (input.length() == 0)
    {
      String[] array = new String[1];
      array[0] = "";
      return array;
    }
    if (delimiters == null) {
      delimiters = "";
    }
    StringTokenizer tok = new StringTokenizer(input, delimiters);
    int count = tok.countTokens();
    String[] array = new String[count];
    int i = 0;
    while (tok.hasMoreTokens()) {
      array[(i++)] = tok.nextToken();
    }
    return array;
  }

  public static int length(Object obj)
    throws JspTagException
  {
    if (obj == null) {
      return 0;
    }
    if ((obj instanceof String)) {
      return ((String)obj).length();
    }
    if ((obj instanceof Collection)) {
      return ((Collection)obj).size();
    }
    if ((obj instanceof Map)) {
      return ((Map)obj).size();
    }
    int count = 0;
    if ((obj instanceof Iterator))
    {
      Iterator iter = (Iterator)obj;
      count = 0;
      while (iter.hasNext())
      {
        count++;
        iter.next();
      }
      return count;
    }
    if ((obj instanceof Enumeration))
    {
      Enumeration enum_ = (Enumeration)obj;
      count = 0;
      while (enum_.hasMoreElements())
      {
        count++;
        enum_.nextElement();
      }
      return count;
    }
    try
    {
      return Array.getLength(obj);
    }
    catch (IllegalArgumentException ex)
    {
      throw new JspTagException(Resources.getMessage("FOREACH_BAD_ITEMS"));
    }
  }

  public static String join(String[] array, String separator)
  {
    if (array == null) {
      return "";
    }
    if (separator == null) {
      separator = "";
    }
    StringBuffer buf = new StringBuffer();
    for (int i = 0; i < array.length; i++)
    {
      buf.append(array[i]);
      if (i < array.length - 1) {
        buf.append(separator);
      }
    }
    return buf.toString();
  }
}

时间: 2024-11-23 15:12:20

EL函数和自定义EL函数的相关文章

用于调试的printf函数和自定义log函数

1. 用宏定义调试用的DPRINT #define DEBUG_ENABLE #ifdef DEBUG_ENABLE #define DPRINT(fmt, args...) fprintf(stderr, "[DPRINT...][%s %d] "fmt"\n", __FILE__, __LINE__, ##args); #else #define DPRINT(fmt, ...) #endif 发布时,将#define DEBUG_ENABLE去掉即可 2. 自

EL表达式 JSTL的标签库 EL的函数 自定义EL函数 自定义标签 JSP的开发模式 注册登陆案例

EL表达式 JSTL的标签库 EL的函数 自定义EL函数 自定义标签 JSP的开发模式 注册登陆案例 EL表达式 1.获取域对象中的值 2.EL表达式支持运算 ${ num1 + num2 } EL获取常用的WEB对象 1.pageScope 获取page域对象的值 2.requestScope 获取request域对象的值 3.sessionScope 获取session域对象的值 4.applicationScope 获取application域对象的值 * 例子:向某个域中来存入值 req

Java/Android中的函数调用&amp;回调函数&amp;自定义回调函数

在做Android自定义控件时遇到要自定义回调函数的问题,想想自己还暂时没有那么精深的技术,赶紧返过头回来再重新研究Java中回调函数的问题.然而不幸的是,网上太多杂乱的帖子和博客都是转来转去,而且都是那一篇"C中的回调函数.....指针.....java....",一点看不出来是自己的思路,估计都是哪哪哪抄来的!(呵呵,要么就是吐槽对了,要么就是我水平太烂读不懂还妄加评论)还有一些很不错的文章,我会在最后参考中加上链接,大家可以看看. 那么来开始我们的正题--什么是回调函数? 我们一

EntityFramework Core 2.0自定义标量函数两种方式

前言 上一节我们讲完原始查询如何防止SQL注入问题同时并提供了几种方式.本节我们继续来讲讲EF Core 2.0中的新特性自定义标量函数. 自定义标量函数两种方式 在EF Core 2.0中我们可以将方法映射到数据库中的标量函数,我们可在LINQ中调用此方法并会被正确翻译成SQL语句,这为编写数据访问层的开发人员提供了一个很棒的功能来创建一个方法并在其上应用DbFunction特性即可.该属性会将静态CLR方法映射到数据库函数,以便可以在LINQ查询中使用此方法.默认情况下,数据库函数中的CLR

自定义el函数

1.1.1 自定义EL函数(EL调用Java的函数) 第一步:创建一个Java类.方法必须是静态方法. public static String sayHello(String name){ return "Hello " + name; } 第二步:提供一个tld文件.(tld文件标签库文件.放置在WEB-INF 下) 在tld文件中定义: <!-- 自定义EL函数 --> <function> <!-- 函数名 --> <name>s

EL函数以及自定义标签的应用

一.EL函数(调用普通类的静态方法) 编写步骤(自定义EL函数的编写步骤即自定义标签的编写步骤): ①编写一个普通的java类,提供一个静态方法,功能自定,例如下: package cn.wzbrilliant.el; public class ElFunction { public static String toUpperCase(String str){ return str.toUpperCase(); } } ②在JavaWeb应用的WEB-INF目录下建立一个扩展名是tld(tagl

黑马day06 EL之自定义EL函数

EL自定义函数(调用java方法)的步骤: 1.写一个类其中包含el要调用的函数,这个函数必须是静态的. 2.写一个tld文件在其中对要进行调用的函数进行描述 3.在jsp页面中的taglib指令将tld文件导入到要调用java方法的jsp页面中 案例:自定义进行URL编码的函数,并在jsp页面中调用. 1.自定义的函数 package cn.itheima.myfunction; import java.io.UnsupportedEncodingException; import java.

EL表达式的使用及编写和使用EL表达式的自定义函数

什么是EL表达式 Expression Language----表达式语言 EL表达式的作用 获取数据 执行运算 获取Web开发常用对象 执行Java方法 获取数据: <%     User user = new User("旺财", "幸福路", 18);     pageContext.setAttribute("pageContextUser", user);     request.setAttribute("reques

史上自定义 JavaScript 函数Top 10

史上自定义 JavaScript 函数Top 10 http://www.dustindiaz.com/top-ten-javascript/ 发布:wpulog | 发布时间: 2010年4月9日 10个被使用的最普遍的用户自定义函数,addEvent(),addLoadEvent(),getElementsByClass(),getCookie(),setCookie(), deleteCookie()等. 10) addEvent() function addEvent(elm, evTy