如何从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.LOCALE
是org.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}
- 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>
在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>
+1为无脚本的方式。 – BalusC 2009-11-10 22:42:27