Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JSP和ResourceBundle_Java_Jsp_Servlets_Internationalization_Jstl - Fatal编程技术网

Java JSP和ResourceBundle

Java JSP和ResourceBundle,java,jsp,servlets,internationalization,jstl,Java,Jsp,Servlets,Internationalization,Jstl,通常使用JSTL和fmt在JSP中加载和使用资源包,但这需要始终使用语法来访问值 当要本地化的文本看起来像 这很尴尬(尽管写起来很有效): 而且使用作用域语法非常笨拙 <fmt:message key="key" var="var"> <a href="url" title="${var}"> </fmt:message> 有没有更简单的方法?我在找像这样的东西 <a href="url" title="${messages.key}">

通常使用JSTL和fmt在JSP中加载和使用资源包,但这需要始终使用语法
来访问值

当要本地化的文本看起来像
这很尴尬(尽管写起来很有效):


而且使用作用域语法非常笨拙

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

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

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

要执行您想要的操作,您可能需要创建并注册您自己的。看看这个答案-

因此,您可以保留一个前缀,例如
MESSAGES
,并将其转换为
ResourceBundle
查找

i、 e.
${MESSAGES.key}
由您的
ELResolver
作为
bundle.getString(key)

处理。是的,下面是我的答案的副本,正如Bozho对您的问题的评论中提到的。但由于这个问题实际上是针对Spring的,所以我的答案在那里并不完全适用。然而,您的问题不是针对Spring的,而是针对普通JSP/Servlet的,因此不能完全重复。因此,我认为答案在这里更合适:


您可以创建一个
扩展的类
,通过
过滤器(基于请求路径?)自行管理加载,并将其存储在会话范围中。
ResourceBundle
可以通过通常的方式访问。您可以像访问地图一样访问它。该方法将在每次访问时调用

以下是一个启动示例:

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);
    }

}
JSP:

相关/有兴趣了解:

嗯,我不知道为什么使用声音对你来说如此“尴尬”。如果您想要上面提到的格式,那么您可以定义自己的
消息
bean并在其中处理本地化,这样您就可以从相应的资源包(根据用户的区域设置)返回值。相关:注意使用“new Text(request.getLocale())'您将丢失缓存功能,资源包将在每个请求中重新加载
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);
    }

}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    Text.setFor((HttpServletRequest) request);
    chain.doFilter(request, response);
}
<p>${text['home.paragraph']}</p>
Text.getCurrentInstance(request).setLocale(newLocale);