Skip to content

JSP 动作标签与自定义 EL 函数库 (TLD) 开发指南

本文探讨 JSP 动作标签(动态包含 vs 静态包含、请求转发与参数传递)、JSTL 标准函数库(fn:)的使用,以及基于 TLD 描述文件开发自定义 EL 函数库的全流程。

1. JSP 动作标签 (JSP Standard Actions)

JSP 动作标签以 <jsp:标记名> 开头,是在运行期(Request Time)由 Web 容器动态解释执行的 XML 格式标签。

1.1 请求转发与参数传递 (<jsp:forward> & <jsp:param>)

在 JSP 页面中,可以使用 <jsp:forward> 替代传统 Java 脚本片段 request.getRequestDispatcher().forward()

html
<!-- 转发请求到 /action/target.jsp,并带入参数 username 与 role -->
<jsp:forward page="/action/target.jsp">
    <jsp:param name="username" value="zhangsan" />
    <jsp:param name="role" value="admin" />
</jsp:forward>

1.2 动态包含 <jsp:include> vs 静态包含 <%@ include %>

包含方式语法格式触发时期底层实现原理适用场景
静态包含<%@ include file="header.jsp" %>翻译/编译期两个 JSP 源码直接拼接,统一编译为 1 个 .java Servlet 类静态固定的公共页头页脚
动态包含<jsp:include page="header.jsp" />运行服务期两个页面各自独立编译为 .java,运行期通过 JspRuntimeLibrary.include() 嵌入输出需动态传参或逻辑独立的组件

2. JSTL 函数库 (fn:functions)

JSTL 提供了专门处理字符串与集合的函数库,在页面顶部通过如下指令引入:

html
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>

常用内置函数清单与示例

html
<!-- 1. 字符串大小写转换与索引查找 -->
<p>${ fn:toUpperCase("hello world") }</p> <!-- 输出: HELLO WORLD -->
<p>${ fn:indexOf("abc-123", "-") }</p>    <!-- 输出: 3 -->

<!-- 2. 获取集合/字符串/数组长度 -->
<p>列表中用户数量: ${ fn:length(userList) }</p>

<!-- 3. 子串截取与包含匹配判定 -->
<p>${ fn:substring("123456", 0, 3) }</p> <!-- 输出: 123 -->
<p>${ fn:contains("admin@163.com", "@") }</p> <!-- 输出: true -->

3. 自定义 EL 函数库开发全流程 (TLD 模式)

当 JSTL 函数库无法满足特定的业务格式化要求时,开发者可以创建自定义的 EL 函数库。

步骤 1:编写 Java 类的公共静态方法 (public static)

自定义 EL 函数对应的底层 Java 方法必须是 public static 静态方法

java
package net.wanho.demo;

public class ElDemo {
    /**
     * 必须是 public static 静态方法
     */
    public static String sayHello(String name) {
        return "Hello, " + name + "!";
    }
}

步骤 2:创建 TLD (Tag Library Descriptor) 描述文件

在项目的 WEB-INF/ 目录下(如 WEB-INF/el/test.tld)创建描述文件:

xml
<?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 
                            http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
        version="2.0">
        
    <tlib-version>1.0</tlib-version>
    <short-name>myfn</short-name>
    <uri>http://www.myElfn/myfn</uri>

    <!-- 配置自定义 EL 函数 -->
    <function>
        <!-- EL 调用的函数名称 -->
        <name>test</name>
        <!-- 对应的全限定类名 -->
        <function-class>net.wanho.demo.ElDemo</function-class>
        <!-- 方法签名:返回值类型 方法名(参数类型1, 参数类型2...) -->
        <function-signature>java.lang.String sayHello(java.lang.String)</function-signature>
    </function>

</taglib>

步骤 3:在 JSP 页面中引入与表达式调用

html
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!-- 引入自定义 TLD 库,uri 必须与 test.tld 中的 <uri> 节点值完全一致 -->
<%@ taglib prefix="myfn" uri="http://www.myElfn/myfn" %>

<!DOCTYPE html>
<html>
<body>
    <!-- 表达式调用自定义函数 -->
    <h1>${ myfn:test("薛雨") }</h1>
    <!-- 最终响应输出: Hello, 薛雨! -->
</body>
</html>

基于 VitePress 构建 | 技术知识库