java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的 Java 程序设计语言和 Java 平台(即 JavaEE(j2ee), JavaME(j2me), JavaSE(j2se))的总称。
简单来说,我们在一个类中的某个方法,可以使用 EL 进行调用,这个能被 EL 表达式调用的方法称之为 EL 函数,但是这种方式必须满足两点要求,具体哪两点,大家可以参考下本文
简单来说,我们在一个类中的某个方法,可以使用 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" 文件模板中抄首抄尾,其中
- <?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 静态方法进行描述最重要的就是要定义
好了,接下来我们在 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,".") }
注:如果 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 方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 PHPERZ 网站的支持!
来源: http://www.phperz.com/article/18/0106/356278.html