如何从JSP访问Locale?

时间:2008-12-02 11:50:22

标签: jsp struts locale

我想根据当前Locale的值包含js文件。我试图从JSP访问它,如下所示:

<%@ page import="java.util.Locale" %>  
<% if( ((Locale) pageContext.getAttribute("org.apache.struts.action.LOCALE",PageContext.REQUEST_SCOPE)).getLanguage().equals("de")) { %>
    <script src="../themes/administration/js/languages/i18nDE.js" type="text/javascript"> </script>
<% } else { %>
    <script src="../themes/administration/js/languages/i18nEN.js" type="text/javascript"> </script>
<% } %>

但是,我收到了java.lang.NullPointerException,因为pageContext.getAttribute("org.apache.struts.action.LOCALE",PageContext.REQUEST_SCOPE)NULL

有谁知道如何解决这个问题?

10 个答案:

答案 0 :(得分:19)

目前我正在使用它:

<c:set var="localeCode" value="${pageContext.response.locale}" />

稍后可以使用${localeCode}

进行访问
  1. Scriplet模式,气馁!有关不使用scriptlet的原因,请参阅Why not use Scriptlets
  2. 可以在 scriptlet 中查询localeCode变量,其中包含:

    <%
      Object ob_localeCode = pageContext.getAttribute("localeCode");
      if (ob_localeCode != null) {
        String currentLanguageCode = (String) ob_localeCode;
      }
      //more code
    %>
    
    1. Scripletless模式正确的方法。请参阅How to avoid Java Code in JSP-Files?此处SO。
    2. 我目前正在使用spring 2.5配置。

      因此,回到原来的问题,你可以实现类似的东西:

      <c:set var="localeCode" value="${pageContext.response.locale}" />
      <c:choose>
        <c:when test="$localecode == 'de' }"> 
          <script src="../themes/administration/js/languages/i18nDE.js" type="text/javascript"> </script>
        </c:when>
        <c:otherwise>
          <script src="../themes/administration/js/languages/i18nEN.js" type="text/javascript"> </script>
        </c:otherwise>
      </c:choose>
      

      或者如果您真的想使用一些简短的代码来打动您的同事,您可以这样做:

      <c:set var="localeCode" value="${fn:toUpperCase(pageContext.response.locale)}" />
      <c:set var="availLanguages" value="EN,DE" />
      <c:if test="${!fn:contains(availLanguages,localeCode)}">
        <c:set var="localeCode" value="EN" />
      </c:if>
      
      <script src="../themes/administration/js/languages/i18n{$localeCode}.js" type="text/javascript"> </script>
      

答案 1 :(得分:4)

在Struts2中

尝试

<s:if test="#request.locale.language=='us'">
     <s:select name="gender" list="#{'M':'Male','F':'female'}" ></s:select>
 </s:if>

答案 2 :(得分:3)

Struts将语言环境放入会话中。获取区域设置的正确方法是:

Locale locale = (locale)request.getSession().getAttribute(Globals.LOCALE_KEY);

答案 3 :(得分:2)

我在Struts 1.x文档中找不到常量org.apache.struts.action.LOCALE - 应该是org.apache.struts.Globals.LOCALE_KEY吗?或者其他LOCALE_KEY常量之一?


修改:org.apache.struts.action.LOCALEorg.apache.struts.Global.LOCALE_KEY - 因此用作密钥的值本身不应该是问题。

验证LOCALE中是否设置了Request。我的理解是LOCALE_KEY如果已设置,则会在PageContext.SESSION_SCOPE中设置。

答案 4 :(得分:1)

在Struts2中,使用EL I成功使用:

${sessionScope["org.apache.struts2.action.LOCALE"]}

E.g。输出区域设置的值:

<c:out value='${sessionScope["org.apache.struts2.action.LOCALE"]}'/>

答案 5 :(得分:1)

我添加了新的例子来澄清这一点,因为这篇文章对我没什么帮助。

从jsp获取语言环境:

<%=request.getLocale()%>

它是一个ServletRequest方法a根据Accept-Language标题,返回客户端将接受内容的首选语言环境

Struts2 Locale: <s:property value="#request.locale"/>

返回Struts2 Framework的语言环境,该语言环境可能与前一个示例中的相同或不同。如果你传递param request_locale = de例如......

<s:url id="localeDE" namespace="/">
   <s:param name="request_locale" >de</s:param>
</s:url>
<s:a href="%{localeDE}" >German</s:a>

struts2#request.locale将更改为德语覆盖原始Accept-Language标头的值

答案 6 :(得分:1)

试试这个

<s:if test='locale.toString() == "si"'>
    <script src="../themes/administration/js/languages/i18nDE.js" type="text/javascript"> </script>
</s:if>
<s:elseif test='locale.toString() == "ta"'>
    <script src="../themes/administration/js/languages/i18nEN.js" type="text/javascript"> </script>
</s:elseif>
<s:else>
    ANOTHER SCRIPT
</s:else>

答案 7 :(得分:0)

Ken G.指出答案。

pageContext.getAttribute("org.apache.struts.action.LOCALE",PageContext.SESSION_SCOPE) 
应该使用

pageContext.getAttribute("org.apache.struts.action.LOCALE",PageContext.REQUEST_SCOPE)

答案 8 :(得分:0)

<%@page import="java.util.Locale"%>
<%@page import="org.apache.struts.Globals"%>


<%Locale locale = (Locale)session.getAttribute(Globals.LOCALE_KEY);
if (locale.getLanguage().equals("fr")) {%>
    <script language="JavaScript" src="lib/js/dateofday.js" type="text/javascript"></script>
    <script type="text/javascript" src="<%=request.getContextPath() %>/lib/js/jscalendar-1.0/lang/calendar-fr.js"></script>
<%} else {%>
    <script language="JavaScript" src="lib/js/dateofday-en.js" type="text/javascript"></script>
    <script type="text/javascript" src="<%=request.getContextPath() %>/lib/js/jscalendar-1.0/lang/calendar-en.js"></script>
<%}%>

答案 9 :(得分:0)

获取locale的两种最佳方法是使用动作继承的getLocale动作支持到JSP: <s:hidden name="locale"/>
<s:property value"%{locale}"/>

使用this method更改语言区域时。

不一样:
${pageContext.response.locale}