自定义标签之EL函数

前几天写了篇博客回顾了一下自定义标签的,这次也来重新回顾一下自定义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表达式无法做到的。这些都需要我们在项目中进行权衡。

好了,自定义标签就到这里。

你可能感兴趣的:(自定义标签之EL函数)