前几天写了篇博客回顾了一下自定义标签的,这次也来重新回顾一下自定义EL函数。很多时候我们使用JSTL的同时都会使用EL表达式,而EL表达式中又有一系列的函数,比如function中的formatDate这些的,我们用得比较多的。那我们如何来自定义一个我们自己的方法,让它作为一个EL函数呢,这就是我们这次要一起来看看的东西了。
废话不多说,直接进入正题。
自定义EL函数同样也和自定义JSTL标签一样,有个基本的流程,如下:
1)定义一个类,把需要的方法写上(注意这里需要作为EL函数调用的方法必须是静态的static)。
2)标签定义文件tld
3)web.xml配置
4)JSP页面引用
基本上跟上次我们说的自定义JSTL标签一致,只是第一步不一样而已。JSTL中是继承那几个TagSupport的类,而这里不用继承,随便即可。
下面开始我们的代码了。
1)定义一个处理类:
package com.shun.customel; import java.text.SimpleDateFormat; import java.util.Date; public class DateFormatter { public static String formatDate(Date date,String pattern){ SimpleDateFormat sdf = new SimpleDateFormat(pattern); return sdf.format(date); } }
这个方法很简单,只是通过指定的格式格式化一下日期而已。
2)定义tld文件,这个文件与之前的JSTL标签文件有点不一样:
<?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/web-jsptaglibrary_2_0.xsd" version="2.0"> <description>A tag library exercising SimpleTag handlers.</description> <tlib-version>1.0</tlib-version> <uri>http://shun.com/myElFuns</uri> <function> <name>formatDate</name> <function-class>com.shun.customel.DateFormatter</function-class> <function-signature>java.lang.String formatDate(java.util.Date,java.lang.String)</function-signature> </function> </taglib>
我们这里只定义了一下函数,
name是函数的名称,是我们在JSP页面上调用的函数名;
function-class是处理这个函数的类,必须要写完全的包名;
而function-signature就是函数签名了,这里注意,除了基本类型(int,char等,String除外)外,都必须写完全的类名,包括包名,参数也一样。
当然,一个文件可以定义很多个函数,当有多个函数需要定义时,写多个function即可。
3)写完了标签定义文件,接下来当然就是web.xml了。
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> <jsp-config> <taglib> <taglib-uri>http://shun.com/myElFuns</taglib-uri> <taglib-location>/META-INF/elFuns.tld</taglib-location> </taglib> </jsp-config> </web-app>
这里跟我们上次说的一样,taglib-uri必须和之前在tld文件中定义的uri一样,而taglib-location指定了tld文件的位置。
4)前面三步做完,我们的EL自定义函数已经完成了,接下来就是使用了。但在这之前,由于我们在formatDate中需要一个Date类型的变量,而且我们的EL表达式中无法用JSP脚本,这时怎么办呢?当然,我们可以把这个参数设到request里面去。如下JSP:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ page import="java.util.Date" %> <%@ taglib uri="http://shun.com/myElFuns" prefix="myElFuns"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <%request.setAttribute("date", new Date()); %> FormatDate:${myElFuns:formatDate(date,"yyyy-MM-dd") } </body> </html>
我们直接在页面上设值。
当然,我们认为这样在页面写JSP脚本不大美观的话,可以通过servlet来设值,然后直接取出,servlet中还是只是一句代码:
request.setAttribute("date", new Date());
然后直接进行转发即可。
EL表达式对于有参数的处理相对JSTL标签来说要简单得多。但JSTL标签可以带EL表达作为属性的值,或者JSP脚本,这些是EL表达式无法做到的。这些都需要我们在项目中进行权衡。
好了,自定义标签就到这里。