Spring中fmt标签无法读取属性文件问题求助
解决JSP中fmt标签读取属性文件显示
??key??的问题 这种显示??key??的情况我之前开发时也踩过类似的坑,大概率是属性文件加载路径、配置或者fmt标签使用环节出了问题,咱们一步步排查解决:
1. 先确认属性文件的编译输出路径
你把属性文件放在JavaSource/resources/xxx_en.properties,但运行时应用是从编译后的classpath读取文件的,所以得先检查:
- 如果是Maven项目,查看
target/classes目录下有没有xxx_en.properties; - 如果是普通Web项目,查看
WEB-INF/classes目录下是否存在该文件。
如果找不到,说明构建配置没把resources目录的文件复制到编译目录:
- Maven项目可以检查
pom.xml的<resources>配置,确保包含了资源目录:<build> <resources> <resource> <directory>src/main/resources</directory> <includes> <include>*.properties</include> </includes> </resource> </resources> </build> - 普通Web项目需要在IDE中把
JavaSource/resources标记为源目录(比如IDEA中右键目录→Mark Directory as→Resources Root)。
2. 检查Spring上下文的messageSource配置是否正确
你提到已经做了映射配置,要注意几个关键点:
- 配置的
basename不要带.properties后缀和语言后缀(比如_en),Spring会自动根据当前Locale匹配对应的属性文件:<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource"> <!-- 这里用classpath:xxx,Spring会自动找xxx_en.properties、xxx_zh.properties等 --> <property name="basename" value="classpath:xxx"/> <!-- 一定要指定编码,避免乱码或读取失败 --> <property name="defaultEncoding" value="UTF-8"/> </bean> - 确保
messageSource的bean id是messageSource(Spring默认会找这个id的bean作为消息源),如果自定义了id,需要在相关配置中明确指定。
3. 检查JSP中fmt标签的使用是否规范
- 首先要在JSP顶部引入fmt标签库:
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> - 确保当前请求的Locale是英文(en),或者直接在JSP中指定Locale:
<!-- 手动设置Locale为英文,确保匹配xxx_en.properties --> <fmt:setLocale value="en"/> <!-- 读取属性文件中的键 --> <fmt:message key="your.message.key"/>
如果没有设置Locale,Spring会使用系统默认Locale,如果默认不是英文,就会尝试加载对应语言的属性文件(比如xxx_zh.properties),如果该文件不存在,就会显示??key??。
4. 检查属性文件的编码和格式
- 属性文件默认编码是ISO-8859-1,如果你用了UTF-8保存,一定要在Spring的messageSource配置中指定
defaultEncoding="UTF-8",否则会出现乱码或读取失败; - 确保属性文件的键值对格式正确,比如
greeting=Hello, World!,不要有多余的空格、特殊字符,键名要注意大小写敏感。
5. 确认Spring上下文的可见性
如果是Spring MVC项目,要确保messageSource配置在根上下文(比如applicationContext.xml)中,而不是DispatcherServlet的子上下文(比如spring-servlet.xml),这样JSP才能访问到消息源。
按照上面的步骤逐一排查,应该就能解决??key??的问题了。
内容的提问来源于stack exchange,提问作者Soham
相关产品推荐
相关产品推荐

