java - JSP 和 ResourceBundle

标签 java jsp servlets internationalization jstl

通常使用 JSTL 和 fmt 在 JSP 中加载和使用资源包,但这需要始终使用语法 <fmt:message key=""/>访问该值。

当要本地化的文本看起来像 <a href="url" title="message">这很尴尬(尽管写起来有效):

<a href="url" title="<fmt:message key="key"/>">

并且使用范围语法很笨拙

<fmt:message key="key" var="var">
<a href="url" title="${var}"> 
</fmt:message>

有没有更简单的方法来做到这一点?我正在寻找类似的东西

<a href="url" title="${messages.key}">

最佳答案

是的,下面是我在 Is there a shorthand for <fmt:message key="key" />? 上的回答的副本正如 Bozho 对你的问题的评论中提到的那样。但由于该问题实际上是针对 Spring 的,因此我的回答并不完全适用于此。然而,您的问题不是针对 Spring 的,而是针对普通的 JSP/Servlet 的,因此不能作为精确的欺骗来关闭。所以我认为这里的答案更好:


您可以创建一个类扩展 ResourceBundle ,在 Filter(基于请求路径?)的帮助下自行管理加载并将其存储在 session 范围内。 ResourceBundle 可以通过通常的 JSP EL 方式访问。您可以像访问 Map 一样访问它。 handleGetObject()方法将在每次访问时被调用。

这是一个启动示例:

package com.example.i18n;

import java.util.Enumeration;
import java.util.Locale;
import java.util.ResourceBundle;

import javax.servlet.http.HttpServletRequest;

public class Text extends ResourceBundle {

    private static final String TEXT_ATTRIBUTE_NAME = "text";
    private static final String TEXT_BASE_NAME = "com.example.i18n.text";

    private Text(Locale locale) {
        setLocale(locale);
    }

    public static void setFor(HttpServletRequest request) {
        if (request.getSession().getAttribute(TEXT_ATTRIBUTE_NAME) == null) {
            request.getSession().setAttribute(TEXT_ATTRIBUTE_NAME, new Text(request.getLocale()));
        }
    }

    public static Text getCurrentInstance(HttpServletRequest request) {
        return (Text) request.getSession().getAttribute(TEXT_ATTRIBUTE_NAME);
    }

    public void setLocale(Locale locale) {
        if (parent == null || !parent.getLocale().equals(locale)) {
            setParent(getBundle(TEXT_BASE_NAME, locale));
        }
    }    

    @Override
    public Enumeration<String> getKeys() {
        return parent.getKeys();
    }

    @Override
    protected Object handleGetObject(String key) {
        return parent.getObject(key);
    }

}

(注意 TEXT_BASE_NAME 常量应该指资源包文件的名称,上面的示例假定您有 text.properties com.example.i18n 包中的 text_en.properties 等)

过滤器:

@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    Text.setFor((HttpServletRequest) request);
    chain.doFilter(request, response);
}

JSP:

<p>${text['home.paragraph']}</p>

如果你想从某些 servlet 或过滤器中更改语言环境:

Text.getCurrentInstance(request).setLocale(newLocale);

相关/有趣的知识:

关于java - JSP 和 ResourceBundle,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7469223/

相关文章:

java - 带有资源注释的 JNDI 查找始终为 NULL

java - 使 index.html 成为路径的一部分

java - 是否可以远程查看用户的设备?

java - 同步方法和 block 之间有什么区别?

java - jsp页面报错

java - 在标签库描述符中使用可变参数

java - 我可以获取不带 header 的 HttpServletRequest 请求正文吗?

java - 无法@AutoWire @WebServlet 中的成员

java - (Java) 在另一个数组中搜索一个数组的值的索引

java - 在 JSP 提交按钮中使用 Servlet 变量