[英]java error in jsp/jstl page
我有以下代碼:
<c:choose>
<c:when test="${empty sessionScope.languageRB}">
<html:hidden property="language" value="en"/>
<html:hidden property="country" value="GB"/>
</c:when>
<c:otherwise test="${not empty sessionScope.languageRB}">
<html:hidden property="language" value="<%=languageRB.getString("style.language")%>"/>
<html:hidden property="country" value="<%=languageRB.getString("style.country")%>"/>
</c:otherwise>
</c:choose>
languageRB是存儲在會話中的屬性,類型為ResourceBundle。 我要執行以下操作:如果session中存在languageRB,則使用括號中的字符串值定義屬性,否則將屬性設置為默認值。
我收到以下錯誤:
org.apache.jasper.JasperException: Unable to compile class for JSP:
An error occurred at line: 89 in the jsp file: /pages/common002-preparelogin.jsp
languageRB cannot be resolved
88: <c:otherwise test="${not empty sessionScope.languageRB}">
89: <html:hidden property="language" value="<%=languageRB.getString("style.language")%>"/>
90: <html:hidden property="country" value="<%=languageRB.getString("style.country")%>"/>
首先,您不應混用scriptlet和taglibs / EL。 使用一個或另一個。 十多年來, 正式禁止使用 腳本 ,因此您應該忘記它們,並堅持使用taglibs / EL。 造成您的具體問題的原因是,無論JSTL標簽庫的結果如何,總是會調用腳本 。 它們不會根據編碼與taglib同步運行。 您可以將其可視化如下: scriptlet首先從上到下運行,然后輪到taglibs / EL從上到下運行。 您應該使用EL來訪問資源束屬性。 EL的另一個優點是它是null安全的,它不會拋出NPE,而只是繞過屬性訪問。
其次,當您用EL替換scriptlet時,您遇到了一個新問題, <c:otherwise>
根本不支持test
屬性。 擺脫它。 僅當<c:when>
條件都不匹配<c:when>
它才被命中。
因此,總而言之,這應該做到:
<c:choose>
<c:when test="${empty sessionScope.languageRB}">
<html:hidden property="language" value="en"/>
<html:hidden property="country" value="GB"/>
</c:when>
<c:otherwise>
<html:hidden property="language" value="${languageRB['style.language']}"/>
<html:hidden property="country" value="${languageRB['style.country']}"/>
</c:otherwise>
</c:choose>
在表達式中,您需要直接從會話中獲取捆綁包:
<%=((ResourceBundle)session.getAttribute("languageRB")).getString("style.language")%>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.