JSP和ResourceBundles

yan*_*isf 4 java jsp servlets jstl internationalization

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

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

<a href="url" title="<fmt:message key="key"/>">
Run Code Online (Sandbox Code Playgroud)

并且很难使用范围的语法

<fmt:message key="key" var="var">
<a href="url" title="${var}"> 
</fmt:message>
Run Code Online (Sandbox Code Playgroud)

有更简单的方法吗?我正在寻找像这样的东西

<a href="url" title="${messages.key}">
Run Code Online (Sandbox Code Playgroud)

Bal*_*usC 5

是的,下面是我的回答的副本.是否有<fmt:message key ="key"/>的简写?正如Bozho对你的问题的评论所述.但由于这个问题实际上是针对Spring的,我的答案并不完全适用于那里.但是,你的问题不是针对Spring的,而是针对普通的JSP/Servlet,因此不能像精确的dupe那样关闭.所以我认为这里的答案更好:


您可以创建一个类extendsResourceBundle,在Filter(基于请求路径?)的帮助下自己管理加载并将其存储在会话范围中.在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);
    }

}
Run Code Online (Sandbox Code Playgroud)

(注意TEXT_BASE_NAME不变应参考资源包文件名,上面的例子假设您已经text.properties,text_en.properties等在com.example.i18n包)

Filter:

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

JSP:

<p>${text['home.paragraph']}</p>
Run Code Online (Sandbox Code Playgroud)

如果要从某个servlet或过滤器内部更改语言环境:

Text.getCurrentInstance(request).setLocale(newLocale);
Run Code Online (Sandbox Code Playgroud)

相关/有意思方知: