如何在JSP中使用JSTL的MessageFormat格式化字符串并替换占位符
没问题,这俩问题我都帮你捋清楚,一步步来:
问题1:JSTL中使用MessageFormat格式化字符串
首先得确保你已经在JSP页面顶部引入了JSTL的fmt标签库——这是用JSTL做格式化的前提:
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
JSTL的fmt标签底层就是基于java.text.MessageFormat实现的,所以占位符规则完全一致,常见用法分两种场景:
- 直接格式化硬编码字符串
如果你的格式化模板是直接写在JSP里的,用<fmt:formatMessage>配合<fmt:param>传入占位符参数就行:
<fmt:formatMessage value="欢迎{0},您的当前积分是{1}"> <fmt:param value="${user.nickname}"/> <fmt:param value="${user.score}"/> </fmt:formatMessage>
- 从资源属性文件读取模板并格式化
如果模板存在外部属性文件(比如messages.properties)里,先通过<fmt:setBundle>绑定资源束,再用<fmt:message>调用:
假设messages.properties里有:user_greeting=欢迎{0},您的当前积分是{1}
JSP代码:
<fmt:setBundle basename="com.yourproject.messages" var="msgBundle"/> <fmt:message key="user_greeting" bundle="${msgBundle}"> <fmt:param value="${user.nickname}"/> <fmt:param value="${user.score}"/> </fmt:message>
问题2:替换环境变量字符串中的{0}为当前年份
针对这个需求,有两种实用的实现方式,你可以根据代码风格选择:
方式一:Java脚本直接处理(简单直接)
直接在JSP里写少量脚本,结合MessageFormat完成替换,适合快速实现:
<% // 从环境变量获取版权模板 String copyrightTemplate = System.getenv("NEW_COPYRIGHT"); // JDK8+推荐用LocalDate获取当前年份,更简洁直观 int currentYear = java.time.LocalDate.now().getYear(); // 格式化替换占位符 String finalCopyright = java.text.MessageFormat.format(copyrightTemplate, currentYear); %> <%= finalCopyright %>
如果是JDK7及以下版本,改用Calendar获取年份:
<% String copyrightTemplate = System.getenv("NEW_COPYRIGHT"); java.util.Calendar cal = java.util.Calendar.getInstance(); int currentYear = cal.get(java.util.Calendar.YEAR); String finalCopyright = java.text.MessageFormat.format(copyrightTemplate, currentYear); %> <%= finalCopyright %>
方式二:用JSTL标签实现(无脚本风格)
如果想尽量减少JSP中的Java脚本,用JSTL标签也能搞定,记得先引入c和fmt标签库:
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%-- 先把环境变量的值存入pageContext,方便EL表达式访问 --%> <% pageContext.setAttribute("copyrightTemplate", System.getenv("NEW_COPYRIGHT")); %> <%-- 用LocalDate获取当前年份(JDK8+) --%> <jsp:useBean id="now" class="java.time.LocalDate"/> <%-- 用fmt标签完成格式化替换 --%> <fmt:formatMessage value="${copyrightTemplate}"> <fmt:param value="${now.year}"/> </fmt:formatMessage>
两种方式最终都能把Copyright © {0} XXX中的{0}替换为当前年份,输出你想要的Copyright © 2018 XXX效果。
内容的提问来源于stack exchange,提问作者L.L
相关产品推荐
相关产品推荐

