Appearance
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>