0

次のコードがあります。

<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 型の、セッションに格納される属性です。私は次のことをしたい: 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")%>"/>
4

2 に答える 2

1

まず、スクリプトレットとtaglibs/ELを混在させないでください。どちらか一方を使用してください。スクリプトレットは10年以来公式に推奨されていないため、スクリプトレットを忘れて、taglibs/ELに固執する必要があります。具体的な問題は、JSTL taglibsの結果に関係なく、 scriptltetsが常に呼び出されるために発生します。これらは、コーディングに基づいてtaglibsと同期して実行されません。次のように視覚化できます。スクリプトレットは最初に上から下に実行され、次にtaglibs/ELが上から下に再び実行されます。ELを使用して、リソースバンドルプロパティにアクセスする必要があります。追加の利点は、ELがnullセーフであり、NPEをスローせず、プロパティアクセスをバイパスすることです。

次に、スクリプトレットをELに置き換えると、新しい問題が発生します。これは、属性をまったく<c:otherwise>サポートしていません。testそれを取り除きます。<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>
于 2013-02-22T15:16:16.637 に答える
0

式では、バンドルをセッションから直接取得する必要があります。

<%=((ResourceBundle)session.getAttribute("languageRB")).getString("style.language")%>
于 2013-02-22T15:07:27.523 に答える