EL调用Java方法_动力节点Java学院整理

简单来说,我们在一个类中的某个方法,可以使用EL进行调用,这个能被EL表达式调用的方法称之为EL函数,但是这种方式必须满足以下两点要求:

  ① 在EL表达式中调用的只能是Java类的静态方法

  ② 这个Java类的静态方法需要在我们另外在自定义的TLD文件中描述

  满足以上两点才能被EL表达式调用。

语法:  ${prefix:方法名(参数列表) }

例1:使用EL函数来实现HTML语言的过滤转义

  在web工程中自定义一个HTMLFilter类,同时定义一个静态的filter方法:

 package com.bjpowernode.filter;
 public class HtmlFilter {
  public static String filter(String message) {
   if (message == null)
    return (null);
   char content[] = new char[message.length()];
   message.getChars(0, message.length(), content, 0);
   StringBuilder result = new StringBuilder(content.length + 50);
   for (int i = 0; i < content.length; i++) {
    switch (content[i]) {
    case '<':
     result.append("<");
     break;
    case '>':
     result.append(">");
     break;
    case '&':
     result.append("&");
     break;
    case '"':
     result.append(""");
     break;
    default:
     result.append(content[i]);
    }
   }
   return (result.toString());
  }
 }

  这个类中的filter方法能将HTML语言转换为普通的字符串,当然这个类和方法在Tomcat中也有示例,路径为【Tomcat】--->【webapps】--->【examples】--->【WEB-INF】--->【classes】--->【utils】,找到HTMLFilter.java就是了。 

 

  好了我们已经有静态的方法了,现在需要在TLD文件中对这个方法进行描述才能在JSP中使用。

  TLD文件需要在“WEB-INF”文件中创建和定义,在哪里找模板呢,依然可以到Tomcat中寻找。在【Tomcat】--->【webapps】--->【examples】--->【WEB-INF】--->【jsp2】中有一个“jsp2-example-taglib.tld”文件,我们就可以对这个文件复制其“首尾”啦。

  在web工程下建立“elfunction.tld”文件,从“jsp2-example-taglib.tld”文件模板中抄首抄尾,其中<function>标签也是我们需要的:

 <?xml version="1.0" encoding="UTF-8" ?>
 <taglib xmlns="http://java.sun.com/xml/ns/j2ee"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
  version="2.0">
  <description>A tag library exercising SimpleTag handlers.</description>
  <tlib-version>1.0</tlib-version>
  <short-name>SimpleTagLibrary</short-name>
  <uri>elfunction</uri>
  <function>
   <description>Converts Html to String</description>
   <name>filter</name>
   <function-class>com.bjpowernode.filter.HtmlFilter</function-class>
   <function-signature>java.lang.String filter( java.lang.String )</function-signature>
  </function>
 </taglib>

  在TLD文件中要对某Java静态方法进行描述最重要的就是要定义<function>标签,在<function>标签下,<description>只是对该方法的描述,不是必需的;<name>指定在JSP上使用该EL函数时应该使用的标签名;<function-class>指定该方法所在的类,必需提供完整类名(包括包名);<function-signature>是方法签名,就是对所使用的静态方法的声明,所有的参数都必需指定完整类名,包括返回值类型和参数列表类型。

  好了,接下来我们在JSP页面中就可使用刚才定义好的EL函数了,当然,首先我们应该现在JSP上使用tablib指定导入标签库,并定义好标签前缀(prefix):

 <%@ taglib uri="elfunction" prefix="elfn" %>

最后再在JSP页面的主体中使用EL函数:

 ${elfn:filter("<a href='www.baidu.com'>百度</a>") }

在浏览器中观察: 

 

这样,使用EL函数就将一个超链接过滤转义成普通的文本了。

  通过上面的例子,使用EL函数似乎和自定义标签一样,可以移除JSP中出现的Java代码,但是EL函数比自定义标签的不足之处在于,EL函数只能移除与web无法的方法,无法移除与web有关的方法,比如某些方法中含有HttpServletRequest、HttpServletResponse等等这样的对象,因为在定义静态方法的时候,我们无法使用到这些web对象,这些web对象都是由Tomcat服务器返回这些接口的实例对象的,这都是服务器中低层封装好的,我们平常使用静态方法根本无法获取,因此此时还是需要使用自定义标签的。

  Sun公司也帮我们制作了一个函数库,在这函数库中封装好了一些常用的EL函数,平时我们可以先看看在这个函数库中是否有满足我们需求的EL函数,如果没有再像上面一样自定义。

Sun公司定义的EL函数封装和描述在JSTL标签库中,因此在JSP页面中使用这个EL函数库时,应该先导入JSTL开发包,并在该页面中导入EL函数库。如果是使用JavaEE5.0以上的,JSTL包会自动导入,可以在【Java EE 5 Libraries】库中看到:  

在这个“jstl-1.2.jar”中,查看其“META-INF”文件,有一个“fn.tld”文件,这个就是Sun公司封装在JSTL中的EL函数的TLD文件:  

我们可以点击进去看看,这个tld文件中封装了所有Sun公司设计好的EL函数,同时也提供了taglib指令的uri,和推荐前缀(prefix): 

 

那么我们在JSP页面中导入tablib指令时只要这两个信息即可:

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

这样我们就可以在JSP页面中使用Sun公司开发好的EL函数了。

例2:   fn:toLowerCase函数

 ${fn:toLowerCase("AAA") }

输出:aaa。

例3:      fn:length()函数

${fn:length("aaa") }

输出:3

例4:  fn:length函数

 <%
   request.setAttribute("arr", new String[5]);
  %>
  ${fn:length(arr) }

输出:5

例5:使用JSTL与EL函数来遍历集合

  需同时导入JSTL与EL的tablib指令:

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

在JSP主体中的代码如下:

 <%
    ArrayList<String> list = new ArrayList<String>();
    list.add("Ding");
    list.add("LRR");
    request.setAttribute("list", list);
  %>

   <c:forEach var="i" begin="0" end="${fn:length(list)}">
    ${list[i] }  <br>
  </c:forEach>

在浏览器中观察:  

例6:      fn:join函数

  fn:join函数第一个参数为字符串数组或集合,第二个参数为将该字符串数组或集合相连起来的分隔符。

 <%
   String[] arr = {"www","bjpowernode","com"};
   pageContext.setAttribute("arr", arr);
  %>
 ${fn:join(arr,".") }

输出:www.bjpowernode.com

  注:如果fn:join函数的第二个参数为空字符串“”,那么将会把所有元素直接相连。

例7:    fn:contains函数

  fn:contains函数检测一个字符串中是否包含指定的字符串,返回值为布尔类型。注意,fn:contains函数只能检测字符串,不能以数组来检测,如果第二个参数为空字符串“”,那么fn:contains函数总是返回true。

 ${fn:contains("fjdingsd","fj") }

输出:true。

  注:fn:contains函数是大小写敏感的,如果要忽略大小写,请使用fn:containsIgnoreCase函数。

例8:  取出表单类型为checkbox的数据回显

  模拟在表单提交失败时,对于表单中类型为“checkbox”的表单项的数据,可以使用EL函数从重新转发回的request获取数据,经过一定的处理,使该页面中的表单项数据重新显示:

 <%
    request.setAttribute("hobbies", new String[]{"sing","dance"});
  %>
  <input type="checkbox" name="hobbies" value="sing"
   ${fn:contains(fn:join(hobbies,""),"sing")?'checked':'' } >唱歌 <br>
  <input type="checkbox" name="hobbies" value="dance"
   ${fn:contains(fn:join(hobbies,""),"dance")?'checked':'' }>跳舞 <br>
  <input type="checkbox" name="hobbies" value="game"
  ${fn:contains(fn:join(hobbies,""),"game")?'checked':'' }>游戏 <br>
 <input type="checkbox" name="hobbies" value="movie"
  ${fn:contains(fn:join(hobbies,""),"movie")?'checked':'' }>电影 <br>

在浏览器中观察:

例9:   fn:escapeXml函数

  功能与例1相同,对HTML语言进行过滤转义成字符串。

 ${fn:escapeXml("<a href='www.baidu.com'>百度</a>") }

浏览器中观察:

例10:自定义字符串连接的EL函数(因为在EL表达式中不支持使用”+”作为字符串的连接符)

  在一个类中定义字符串连接的静态方法:

 public class MyElFunctions {
  public static String connectString(String str1,String str2) {
   return str1+str2;
  }
 }

在【WEB-INF】中自定义TLD文件中声明这个方法,同时定义自己的uri:

 <?xml version="1.0" encoding="UTF-8" ?>
 <taglib xmlns="http://java.sun.com/xml/ns/j2ee"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
  version="2.0">
  <description>A tag library exercising SimpleTag handlers.</description>
  <tlib-version>1.0</tlib-version>
  <short-name>SimpleTagLibrary</short-name>
  <uri>myelfunction</uri>
 <function>
   <description>Connect two Strings</description>
   <name>connect</name>
   <function-class>com.bjpowernode.elfunctions.MyElFunctions</function-class>
   <function-signature>java.lang.String connectString( java.lang.String , java.lang.String )</function-signature>
  </function>
 </taglib>

在JSP页面中加入taglib声明:

 <%@ taglib uri="myelfunction" prefix="elfn" %>

在JSP页面中的主体代码为:

<%
   User u = new User();
   u.setUsername("fjdingsd");
   session.setAttribute("user", u);
  %>
  ${sessionScope.user!=null ? elfn:connect("欢迎您: ",user.username):'' }

在浏览器中观察: 

 

  通常,我们在项目中会有专门的一个类来作为EL函数的方法实现类,在这个类中都是定义EL函数的静态方法。

  在JSTL包中的fn.tld文件中还有很多EL函数,这里就不再一一介绍了,如果我们有需要,可以在这个文件中查看,基本每个函数都有示例。

  EL表达式到这里就差不多介绍完了,主要就是这四大功能(获取数据,执行运算,使用隐式对象,调用Java方法),最后就来简单说明一下EL表达式的注意事项:EL表达式是JSP2.0规范中的一门技术,因此若想正确解析EL表达式,必须使用Servlet2.4/JSP2.0技术及以上的WEB服务器。

  有些Tomcat服务器不能使用EL表达式的话,要么将Tomcat升级6及以上的版本,要么在JSP页面中加入page指令<%@ page isELIgnored="false" %>

以上所述是小编给大家介绍的EL调用Java方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!

(0)

相关推荐

  • java el简介及用法

    一.EL简介 1.语法结构 ${expression} 2.[]与.运算符 EL 提供.和[]两种运算符来存取数据. 当要存取的属性名称中包含一些特殊字符,如.或?等并非字母或数字的符号,就一定要使用 [].例如: ${user.My-Name}应当改为${user["My-Name"] } 如果要动态取值时,就可以用[]来做,而.无法做到动态取值.例如: ${sessionScope.user[data]}中data 是一个变量 3.变量 EL存取变量数据的方法很简单,例如:${us

  • 在JSTL EL中处理java.util.Map,及嵌套List的情况

    在方括号中指定键,并将相应的值作为表达式的值返回.例如,表达式 ${map['key']} 返回与 map标识符所引用的 Map 中的 "key" 键相关联的值. 当forEach 的items属性中的表达式的值是java.util.Map时,则var中命名的变量的类型就是 java.util.Map.Entry.这时var=entry的话,用表达式${entry.key}取得键名. 用表达${entry.value}得到每个entry的值.这是因为java.util.Map.Entr

  • Javaweb El表达式实例详解

    EL全称 Expression Language(表达式语言),是jsp2.0最重要的特性之一,可以利用EL表达式来访问应用程序中的数据,来消除jsp页面中的java脚本. el表达式的语法 expression例如x+y可以写成{x+y} el中的关键字 以下是el中的关键字,他们不能用做标识符: and,eq,gt,true,instanceof,or,ne,le,false,empty,not,lt,ge,null,div,mod 一.EL表达式简介 EL 全名为Expression La

  • 浅谈java里的EL表达式在JSP中不能解析的问题

    今天也碰到了el表达式无法解析的事情,于是在网上查询了下,大多说是因为web.xml中声明的版本问题 于是收集了如下版本: web-app_2_2.xsd <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN" "http://java

  • EL调用Java方法_动力节点Java学院整理

    简单来说,我们在一个类中的某个方法,可以使用EL进行调用,这个能被EL表达式调用的方法称之为EL函数,但是这种方式必须满足以下两点要求: ① 在EL表达式中调用的只能是Java类的静态方法 ② 这个Java类的静态方法需要在我们另外在自定义的TLD文件中描述 满足以上两点才能被EL表达式调用. 语法:  ${prefix:方法名(参数列表) } 例1:使用EL函数来实现HTML语言的过滤转义 在web工程中自定义一个HTMLFilter类,同时定义一个静态的filter方法: package c

  • Java枚举_动力节点Java学院整理

    enum 的全称为 enumeration, 是 JDK 5  中引入的新特性,存放在 java.lang 包中. 原始的接口定义常量 public interface IConstants { String MON = "Mon"; String TUE = "Tue"; String WED = "Wed"; String THU = "Thu"; String FRI = "Fri"; String

  • Java内部类_动力节点Java学院整理

    内部类是指在一个外部类的内部再定义一个类.类名不需要和文件夹相同.内部类可以是静态static的,也可用public,default,protected和private修饰.(而外部顶级类即类名和文件名相同的只能使用public和default). 注意:内部类是一个编译时的概念,一旦编译成功,就会成为完全不同的两类.对于一个名为outer的外部类和其内部定义的名为inner的内部类.编译完成后出现outer.class和outer$inner.class两类.所以内部类的成员变量/方法名可以和

  • Java自定义异常_动力节点Java学院整理

    废话不多说了,直接给大家贴代码了,具体代码如下所示: /*下面做了归纳总结,欢迎批评指正*/ /*自定义异常*/ class ChushulingException extends Exception { public ChushulingException(String msg) { super(msg); } } class ChushufuException extends Exception { public ChushufuException(String msg) { super(m

  • 探索Java中的equals()和hashCode()方法_动力节点Java学院整理

    equals()和hashCode()区别?  equals():反映的是对象或变量具体的值,即两个对象里面包含的值--可能是对象的引用,也可能是值类型的值.  hashCode():计算出对象实例的哈希码,并返回哈希码,又称为散列函数.根类Object的hashCode()方法的计算依赖于对象实例的D(内存地址),故每个Object对象的hashCode都是唯一的:当然,当对象所对应的类重写了hashCode()方法时,结果就截然不同了. 之所以有hashCode方法,是因为在批量的对象比

  • Java乱码问题解决方法_动力节点Java学院整理

    1.文件页面编码导致的乱码. 每一个文件(java,js,jsp,html等)都有其本身的编码格式,文件中的代码在一种编码中显示正常,在另外一种编码下就会显示出乱码. 在Eclipse中,每一个工程都会有编码格式(Text file encoding), 一般默认为GBK.而一个比较好的编程习惯是新建一个项目,优先把项目的编码设为UTF-8. 这样做的原因很简单,UTF-8包含全世界所有国家需要用到的字符,是国际编码,通用性强.几种常见的字符集,GBK,GB2312,UTF-8之间的关系如下:

  • Java中json使用方法_动力节点Java学院整理

    摘要:JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.它基于ECMAScript的一个子集. JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C.C++.C#.Java.JavaScript.Perl.Python等).这些特性使JSON成为理想的数据交换语言. 易于人阅读和编写,同时也易于机器解析和生成(网络传输速率). 一.准备工作  json是个非常重要的数据结构,在web开发中应用十分广泛.我觉得每个人都应该好好

  • 深入理解Java虚拟机_动力节点Java学院整理

    什么是Java虚拟机 Java程序必须在虚拟机上运行.那么虚拟机到底是什么呢?先看网上搜索到的比较靠谱的解释: 虚拟机是一种抽象化的计算机,通过在实际的计算机上仿真模拟各种计算机功能来实现的.Java虚拟机有自己完善的硬体架构,如处理器.堆栈.寄存器等,还具有相应的指令系统.JVM屏蔽了与具体操作系统平台相关的信息,使得Java程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行. 这种解释应该算是正确的,但是只描述了虚拟机的外部行为和功能,并没有针对内部原理

  • Java死锁_动力节点Java学院整理

    死锁是两个甚至多个线程被永久阻塞时的一种运行局面,这种局面的生成伴随着至少两个线程和两个或者多个资源.在这里我已写好一个简单的程序,它将会引起死锁方案然后我们就会明白如何分析它. Java死锁范例 ThreadDeadlock.java package com.bjpowernode.threads; public class ThreadDeadlock { public static void main(String[] args) throws InterruptedException {

  • Java正则表达式_动力节点Java学院整理

    正则表达式是什么?用我的理解就是一个表达式.用来匹配,替换,判断字符串,之前业务就出现过判断返回值是否为邮箱.在程序开发中,难免会遇到需要匹配.查找.替换.判断字符串的情况发生,而这些情况有时又比较复杂,如果用纯编码方式解决,往往会浪费程序员的时间及精力.因此,学习及使用正则表达式,便成了解决这一矛盾的主要手段. 正则表达式是一种可以用于模式匹配和替换的规范,一个正则表达式就是由普通的字符(例如字符a到z)以及特殊字符(元字符)组成的文字模式,它 用以描述在查找文字主体时待匹配的一个或多个字符串

随机推荐