JSTL fn:endsWith()函数(超详细)
💡一则或许对你有用的小广告
欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论
- 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于
Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...
,点击查看项目介绍 ;演示链接: http://116.62.199.48:7070 ;- 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;
截止目前, 星球 内专栏累计输出 90w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 3100+ 小伙伴加入学习 ,欢迎点击围观
在Web开发中,处理字符串操作是常见的需求。无论是验证文件扩展名、检查URL路径还是过滤特定后缀的内容,开发者都需要高效的方法来完成这些任务。JSTL(JavaServer Pages Standard Tag Library)作为JSP开发的标准化标签库,提供了丰富的函数库来简化开发流程。其中,fn:endsWith()
函数便是处理字符串结尾匹配的实用工具。本文将深入解析该函数的功能、使用场景及代码实现,帮助开发者快速掌握这一工具,并在实际项目中灵活运用。
1.1 JSTL的诞生背景与核心价值
JSTL是Java EE规范中的一部分,旨在通过标签库替代传统的Java代码嵌入式开发方式,提升代码的可维护性和可读性。它将常用功能封装为预定义的标签和函数,例如条件判断、循环、数据格式化等。使用JSTL可以显著减少JSP页面中的脚本片段(Scriptlet),使代码结构更清晰,同时降低因手动编写逻辑导致的错误风险。
1.2 fn库:JSTL中的字符串操作利器
fn
(Function)库是JSTL提供的一个函数集合,专为字符串操作设计。它包含endsWith()
、startsWith()
、substring()
等常用函数,开发者无需依赖复杂的Java代码即可完成字符串处理。例如,fn:endsWith()
函数的功能是判断一个字符串是否以指定后缀结尾,这一功能在文件类型验证、URL路径分析等场景中非常实用。
比喻说明:
可以将字符串想象为一列火车,fn:endsWith()
就像检查火车的最后一节车厢是否匹配某个特定车厢。例如,检查文件名是否以.jpg
结尾,就相当于检查火车的最后一节是否是“JPG车厢”。
2.1 函数语法与参数说明
fn:endsWith()
函数的语法如下:
${fn:endsWith(string, suffix)}
- 参数说明:
string
:需要检查的原始字符串。suffix
:要匹配的结尾子字符串。
参数 | 类型 | 必填 | 说明 |
---|---|---|---|
string | String | 是 | 被检查的原始字符串,若为null 或空字符串,函数返回false 。 |
suffix | String | 是 | 需要匹配的结尾子字符串,若为null 或空字符串,函数返回true (空字符串视为匹配)。 |
关键点:
当suffix
为空字符串时,函数始终返回true
,因为任何字符串都包含空字符串作为结尾。
2.2 函数返回值逻辑
函数返回一个布尔值(true
或false
),其判断逻辑如下:
- 若原始字符串以指定后缀结尾 → 返回
true
。 - 否则 → 返回
false
。
示例说明:
原始字符串: "report_2023.pdf"
后缀: ".pdf" → 返回 true
后缀: "2023" → 返回 false
3.1 文件类型验证
在Web应用中,用户上传文件时,常需验证文件扩展名是否符合要求。例如,仅允许上传图片文件(如.jpg
、.png
)。通过fn:endsWith()
函数,可以轻松实现这一逻辑:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<c:set var="fileName" value="photo.jpg" />
<c:if test="${fn:endsWith(fileName, '.jpg') || fn:endsWith(fileName, '.png')}">
<p>文件类型有效,允许上传。</p>
</c:if>
扩展思考:
若需支持更多扩展名,可通过<c:choose>
标签组合多个条件分支,或使用数组/集合存储允许的后缀列表。
3.2 URL路径分析
在构建动态页面时,可能需要根据URL路径执行不同操作。例如,检查当前页面是否以/admin/
结尾,以决定是否显示管理功能:
<c:set var="currentPath" value="${pageContext.request.requestURI}" />
<c:if test="${fn:endsWith(currentPath, '/admin/')}">
<div>当前路径属于管理后台,显示管理菜单</div>
</c:if>
注意事项:
需确保currentPath
的值包含完整路径(如/project/admin/users
),否则可能因路径长度不足导致误判。
4.1 结合其他JSTL函数增强功能
通过与其他fn
函数组合,可以实现更复杂的逻辑。例如,先用fn:toLowerCase()
将字符串转为小写,再检查后缀:
<c:set var="input" value="REPORT_2023.PDF" />
<c:set var="lowerCaseInput" value="${fn:toLowerCase(input)}" />
<c:if test="${fn:endsWith(lowerCaseInput, '.pdf')}">
<p>文件格式为PDF。</p>
</c:if>
优势:
此方法可忽略大小写差异,提升判断的鲁棒性。
4.2 处理动态后缀参数
若后缀需要动态生成(如从请求参数获取),可通过EL表达式直接传递变量:
<c:set var="userSuffix" value="${param.suffix}" />
<c:set var="testString" value="data_2023.csv" />
<c:if test="${fn:endsWith(testString, userSuffix)}">
<p>输入的后缀 <strong>${userSuffix}</strong> 匹配成功。</p>
</c:if>
安全提示:
需对userSuffix
进行输入验证,防止恶意输入导致逻辑漏洞。
5.1 函数返回false
的常见原因
-
参数类型错误:若
string
或suffix
未正确传递,可能导致空值判断失败。<!-- 错误示例:未定义变量 --> ${fn:endsWith(undefinedVar, '.txt')} → 返回 false
解决方案:使用
<c:if>
标签前,确保变量已正确定义并赋值。 -
忽略大小写差异:若需不区分大小写,应先将字符串转换为统一大小写。
5.2 性能优化建议
- 避免重复计算:若需多次调用
fn:endsWith()
,建议将结果缓存到变量中:<c:set var="isPdf" value="${fn:endsWith(fileName, '.pdf')}" /> <c:if test="${isPdf}">...</c:if>
6.1 与Java代码的对比
在传统JSP脚本片段中,需通过Java代码实现类似功能:
<%
String path = "report.pdf";
boolean isPdf = path.endsWith(".pdf");
%>
<c:if test="<%=isPdf%>">...</c:if>
而使用fn:endsWith()
可直接在EL表达式中完成,无需编写Java代码,代码简洁性显著提升。
JSTL fn:endsWith()函数
是处理字符串结尾匹配的高效工具,尤其适用于文件类型验证、路径分析等场景。通过结合其他JSTL函数和标签,开发者可以构建出更复杂、健壮的逻辑。掌握这一函数不仅能提升代码质量,还能减少开发时间,是JSP开发中值得熟练掌握的技能。建议读者在实际项目中尝试将其应用于用户输入验证、内容过滤等场景,以加深理解并积累实践经验。