前几天写了篇博客回顾了一下自定义标签的,这次也来重新回顾一下自定义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标签文件有点不一样:
A tag library exercising SimpleTag handlers. 1.0 http://shun.com/myElFuns formatDate com.shun.customel.DateFormatter java.lang.String formatDate(java.util.Date,java.lang.String)
我们这里只定义了一下函数,
name是函数的名称,是我们在JSP页面上调用的函数名;
function-class是处理这个函数的类,必须要写完全的包名;
而function-signature就是函数签名了,这里注意,除了基本类型(int,char等,String除外)外,都必须写完全的类名,包括包名,参数也一样。
当然,一个文件可以定义很多个函数,当有多个函数需要定义时,写多个function即可。
3)写完了标签定义文件,接下来当然就是web.xml了。
http://shun.com/myElFuns /META-INF/elFuns.tld
这里跟我们上次说的一样,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"%>
Insert title here
<%request.setAttribute("date", new Date()); %>
FormatDate:${myElFuns:formatDate(date,"yyyy-MM-dd") }
我们直接在页面上设值。
当然,我们认为这样在页面写JSP脚本不大美观的话,可以通过servlet来设值,然后直接取出,servlet中还是只是一句代码:
request.setAttribute("date", new Date());
然后直接进行转发即可。
EL表达式对于有参数的处理相对JSTL标签来说要简单得多。但JSTL标签可以带EL表达作为属性的值,或者JSP脚本,这些是EL表达式无法做到的。这些都需要我们在项目中进行权衡。
好了,自定义标签就到这里。