fmt:message打印带有问号的键,如“??? login.label.username ???”

时间:2015-06-03 10:49:14

标签: jsp localization jstl

我正在尝试使用基于How to internationalize a Java web application?的JSTL 1.2来使我的网站国际化。这是JSP文件的开头:

<%@ page pageEncoding="UTF-8" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<c:set var="language" value="${not empty param.language ? param.language : not empty language ? language : pageContext.request.locale}" scope="session" />
<fmt:setLocale value="${language}" />
<fmt:setBundle basename="com.bundle.test" />
<html lang="${language}">

以下是test.properties文件:

login.label.username = Username
login.label.password = Password
login.button.submit = Sign in
login.label.direction = rlt

在正文中,我包括这些行:

<label for="username"><fmt:message key="login.label.username" /></label>

但是当我在浏览器中打开JSP页面时,它输出如下:

  

??? ??? login.label.username

我希望它输出值“Username”。

这是如何引起的?如何解决?

4 个答案:

答案 0 :(得分:7)

格式???key???的消息表示无法找到与密钥关联的消息。这可能意味着您输入密钥,或者捆绑文件中缺少密钥,或者甚至整个捆绑文件在运行时类路径中不作为资源。

鉴于密钥看起来很好,并且存在于捆绑文件中,这只能意味着webapp无法将捆绑文件作为类路径资源找到。

鉴于您正在使用Maven,您应该确保已将它们放在/src/main/resources文件夹中。在您的特定情况下,包名称为com.bundle.test,您应该在那里有一个/src/main/resources/com/bundle/test.properties文件。

如果仍然无法正常工作,那么您的构建可能会变脏或损坏。清洁和重建,以确保。然后使用一些ZIP工具提取Maven生成的WAR文件并浏览其内容。它应该最终位于/WEB-INF/classes文件夹中/WEB-INF/classes/com/bundle/test.properties

答案 1 :(得分:0)

在我的web.xml中添加此代码解决了我的问题

<context-param>
    <param-name>javax.servlet.jsp.jstl.fmt.localizationContext</param-name>
    <param-value>messages</param-value>
</context-param>

答案 2 :(得分:0)

万一这对任何人都有帮助,我就会在这个问题上陷入困境。 我的项目中带有属性文件的配置文件很多,而我的问题是我没有将密钥添加到所有配置文件中,因此,这给了我一个 ??? message.key ???错误。 将密钥添加到所有配置文件属性文件后,此问题已解决。

答案 3 :(得分:-1)

如果某个消息被 ???<key>??? 替换,这意味着在配置的资源包中找不到消息密钥。

请务必在部署描述符 (web.xml) 中添加上下文初始化参数。这会建立一个资源包,可以从中加载本地化消息。

<context-param>
    <param-name>javax.servlet.jsp.jstl.fmt.localizationContext</param-name>
    <param-value>test</param-value>
</context-param>

然后将 test.properties 文件放在 IDE 项目的 source/production/resources 目录中。