如何从JSP访问区域设置?

问题描述:

我想包含一个js文件,这取决于当前语言环境的值。我试图从JSP访问如下:如何从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

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

我在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 - 所以作为一个重要的价值本身,不应该成为问题。

确认在Request中正在设置LOCALE。我的理解是LOCALE_KEY设置在PageContext.SESSION_SCOPE,如果它被设置。

Ken G.指出了答案。

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

应改为使用

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

<%@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> 
<%}%> 

的Struts把现场的会议。获得区域设置正确的方法是:

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

目前我使用此:

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

这以后可以访问使用${localeCode}

  1. Scriplet模式,灰心!请参阅Why not use Scriptlets,以便不使用scriptlet。

localeCode变量可以一个的scriptlet内被查询以:

<% 
    Object ob_localeCode = pageContext.getAttribute("localeCode"); 
    if (ob_localeCode != null) { 
    String currentLanguageCode = (String) ob_localeCode; 
    } 
    //more code 
%> 
  1. Scripletless模式正确的路要走。见SO How to avoid Java Code in JSP-Files?
  2. 我现在使用spring 2.5 config。

    所以在这之后,回到你原来的问题,你可以实现类似:

    <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> 
    
开始=>
+2

+1为无脚本的方式。 – BalusC 2009-11-10 22:42:27

在Struts2,使用EL I成功地用于:

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

例如输出区域设置的值:

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

在Struts2尝试

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

得到locale的两个最好的方式是通过使用由动作继承,到JSP行动支持getLocale<s:hidden name="locale"/>
<s:property value"%{locale}"/>

当区域已经改变与this method

这是不一样的:
${pageContext.response.locale}

我增添了新的例子来阐明这个多一点,因为这个帖子并没有帮助我很多。

从JSP获得区域:

<%=request.getLocale()%> 

它是一个ServletRequest方法一返回首选区域设置客户端将接受内容的基础上,Accept-Language头,

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

返回Struts2框架的语言环境,可能与前面的示例中的语言环境相同或不同。如果你通过帕拉姆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头的值

尝试用这种

<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>