自定义EL函数
EL函数不支持字符串连接的操作,即${“ab”+”cd”}这样的都不支持,可以通过自定义函数来解决这个问题。
下面以实现“将一个字符串转全部换为大写”的功能为例,来讲解自定义 EL 函数的过程。
1.定义Java方法
自定义一个类名为upper的类,创建一个静态方法:
package fun;
public class upper { public static String toUpper(String str) { return str.toUpperCase(); } }
就是一个简单的静态函数 他把字符串转为大写返回。
2.创建标签
在 Web 项目的/WEB-INF 目录下,新建一个扩展名为.tld 的 XML 文件,例如 bihu.tld。 tld的全称是Tag Library Definition,标签库定义,之后将定义好的函数,在这个文件中进行注册。
这个文件的名字你可以随便取,但一定要放在WEB-INF 这个目录下:
先讲一下这个tld文件中 需要什么和一些注解:
1️⃣ 这玩意: 头啊 复制就好了 别去记啊 用不着:
<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 http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd" version="2.0">
2️⃣ 版本号标签:随便来个即可
<!-- 指定定义的当前函数库版本号。随意指定。 --> <tlib-version>1.0</tlib-version>
3️⃣函数库名称: 随便定义啊 一般和你文件名一样 这个name在JSP中导入要用的 【指定该函数库的名称,一个函数库一个名称】
<!-- 指定该函数库的名称,一个函数库一个名称,随意命名,通常与文件名相同,这个名称在后面 JSP 中要使用。 --> <short-name>bihu</short-name>
4️⃣uri: 这玩意也是随便来 但是! 一般为自己公司域名 而且 在JSP中导入也要用到
<!-- 指定该函数库所对应的 URL,一个函数库一个 URL, URL 随意,在后面 JSP 中要使用该 URL --> <uri>bihu.com</uri>
5️⃣方法标签: 【<function>】
下面是你定义的方法的配置:包含3个: <name> 、 <function-class> 、 <function-signature>
name是你在JSP的EL表达式用的方法名
function-class 是这个方法的位置 包位
function-signature 是这个方法的解析 准确到包名 !!! 即: 返回值 方法名 (方法参数...)
signature | sɪɡnətʃər | 签名;署名;签字;签署;明显特征;鲜明特色;识别标志 |
<function> <!-- 指定将来在 JSP 的 EL 中使用该函数的名称。一般与类中静态方法同名。 --> <name>toUpper</name> <!-- 指定该函数定义在哪个类中 --> <function-class>fun.upper</function-class> <!-- 指定类中的方法 --> <function-signature>java.lang.String toUpper( java.lang.String )</function-signature> </function>
那么我们既然创建了静态方法toUpper,他属于fun包下,那么我们自定义一个EL函数:
index.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%-- 这里用taglib 指令 导入函数库中的 uri 和 一个 prefix 函数库名 --%> <%@ taglib uri="bihu.com" prefix="bihu"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>EL 自定义函数 的讲解</title> </head> <body> <%-- 这里用的是 bihu 这个 函数库 bihu这个函数库里面的 toUpper方法: --%> ${bihu:toUpper("abcd") } </body> </html>
然后我们看 tld 文件: 【bihu.tld】 记住啊!一定要存在WEB-INF这个文件夹下面!
<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 http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd" version="2.0"> <tlib-version>1.0</tlib-version> <short-name>bihu</short-name> <uri>bihu.com</uri> <function> <name>toUpper</name> <function-class>fun.upper</function-class> <function-signature>java.lang.String toUpper( java.lang.String )</function-signature> </function> </taglib>
自行对应 upper类、JSP文件、bihu.tld文件 一一对应啊 :
其实你会发现他用的是我们刚开始讲的 taglib指令 然后用 函数库【tld文件】 中的 uri 和 short-name 在JSP中定位导入!
而 EL表达式中是通过 函数库【tld文件】中 的 short-name 和 name【function 下的】,那么对应就是:
${short-name:name("assbcd") }
不用了解那么深 但是你的看得懂里面的 映射 和 标签即可!