7.6.4 使用 EL 自定义函数
在使用EL自定义函数之前必须使用tablib指令引用EL自定义函数库。代码如下:
<!-- customfun.jsp -->
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<!-- 引用EL自定义函数库 -->
<%@ taglib prefix="cfun" uri="http://www.sun.com/cfun1.0"%>
<!-- 使用matches函数 -->
${cfun:matches("^(\\w+\\.?)*\\w+@\\w+\\.\\w+$", param.email)?"Email格式正确":"Email格式错误"}
上面的代码中通过<uri>元素的值(http://www.sun.com/cfun1.0)引用了customfun.tld函数库,并将前缀设为“cfun”,然后通过${cfun:matches(...)}格式来使用matches函数。
在浏览器地址栏中输入如下的URL:
http://localhost:8080/demo/chapter7/customfun.jsp?email=abcd@126.com
浏览器将输出“格式正确”信息。
在引用EL自定义函数库时,taglib指令的uri属性不仅可以指定<uri>标签的值,还可以指定tld文件的相对路径。假设customfun.tld文件在WEB-INF目录下。则可以使用如下的代码来引用customfun.tld文件:
<!-- 相对路径开头必须加斜杠(/),表示相对于Web应用程序的根目录 -->
<%@ taglib prefix="cfun" uri="/WEB-INF/customfun.tld"%>
实际上,不管采用哪种引用方式,从技术层面看是完全一样的,如果使用<uri>元素的值来引用tld文件,JSP引擎在翻译taglib指令时,会在WEB-INF目录及其子目录中搜索所有的tld文件,直到某个tld文件中的<uri>元素的值和taglib指令的uri属性值相等为止(URI区分大小写,在使用的时候要注意这一点)。在由JSP页面生成的Servlet中,都是通过tld文件的相对路径来引用tld文件的。
如果将customfun.tld文件放到WEB-INF\lib目录中,可以使用如下的两种方式来引用custom.tld文件:
1. 使用<uri>元素的值引用customfun.tld:
<%@ taglib prefix="cfun" uri="http://www.sun.com/cfun1.0"%>
2. 使用相对路径引用customfun.tld文件:
<%@ taglib prefix="cfun" uri="/WEB-INF/lib/customfun.tld"%>
无论使用上面的哪种方式引用customfun.tld文件,最终生成的Servlet类都会使用customfun.tld文件的相对路径来引用该文件,代码如下:
package org.apache.jsp.chapter7;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*;
public final class customfun_jsp extends org.apache.jasper.runtime.HttpJspBase
implements org.apache.jasper.runtime.JspSourceDependent
{
static private org.apache.jasper.runtime.ProtectedFunctionMapper _jspx_fnmap_0;
static
{
_jspx_fnmap_0= org.apache.jasper.runtime.ProtectedFunctionMapper.
getMapForFunction("cfun:matches", chapter7.CustomFun.class, "matches",
new Class[] {java.lang.String.class, java.lang.String.class});
}
private static java.util.List _jspx_dependants;
static
{
_jspx_dependants = new java.util.ArrayList(1);
// 总是使用相对路径来引用tld文件
_jspx_dependants.add("/WEB-INF/lib/customfun.tld");
}
... ...
}
注意:虽然使用两种方式都可以成功引用tld文件,但我建议使用<uri>元素的值来引用tld文件。主要是因为如果使用这种方式引用tld文件,当tld文件的位置该变后,JSP引擎会自动寻找tld文件,而无需修改JSP页面的代码。如果使用了相对路径来引用tld文件,当tld文件的位置改变量,就必须要修改所有使用相对路径引用tld文件的JSP页面才可以使程序正常工作。