7.6.4 使用 EL 自定义函数

优质
小牛编辑
128浏览
2023-12-01

在使用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页面才可以使程序正常工作。