2008-12-02 75 views
14

我想包含一個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

有誰知道我該如何解決這個問題?

回答

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 - 所以作爲一個重要的價值本身,不應該成爲問題。

確認在Request中正在設置LOCALE。我的理解是LOCALE_KEY設置在PageContext.SESSION_SCOPE,如果它被設置。

0

Ken G.指出了答案。

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

應改爲使用

pageContext.getAttribute("org.apache.struts.action.LOCALE",PageContext.REQUEST_SCOPE) 
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> 
<%}%> 
3

的Struts把現場的會議。獲得區域設置正確的方法是:

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

目前我使用此:

<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 
%> 
  • Scripletless模式正確的路要走。見SO How to avoid Java Code in JSP-Files?
  • 我現在使用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

    1

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

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

    例如輸出區域設置的值:

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

    在Struts2嘗試

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

    得到locale的兩個最好的方式是通過使用由動作繼承,到JSP行動支持getLocale<s:hidden name="locale"/>
    <s:property value"%{locale}"/>

    當區域已經改變與this method

    這是不一樣的:
    ${pageContext.response.locale}

    1

    我增添了新的例子來闡明這個多一點,因爲這個帖子並沒有幫助我很多。

    從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頭的值

    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>