5

LinuxでTomcat 6.0.18を実行しています。

次のような Bean を使用する JSP があります。

<jsp:useBean id="helper"
             type="com.example.SomeType"
             scope="request"/>

helperこのページは、次のような式言語での属性を参照しています。

<!-- This works properly, but could fail silently if the bean name is incorrect. -->
<div><p>Here's some stuff: ${helper.stuff}</div>

name の出現を見逃したいくつかのリファクタリング中に、名前が間違って記述されていてもエラーが発生helperしないことに気付きました。画面にもログファイルにもありません。出力の式言語スニペットに対しては何も生成されません。helper

<!-- Wrong name! "foo" should be "helper" but no error is observed (other than missing ouput)! -->
<div><p>Here's some stuff: ${foo.stuff}</div>

現在、次の JSP 構文を間違った名前で使用すると、エラー発生します (カスタム エラー ページが表示され、ログ ファイルに例外が表示されます) helper

<!-- Wrong name, but an error is raised. -->
<div><p>Here's some stuff: <jsp:getProperty name="foo" property="stuff"/></div>

この場合、ログには次のエントリが記録されます。

SEVERE: requestURI: /some.jsp servletName: jsp statusCode: 500
org.apache.jasper.JasperException: Attempted a bean operation on a null object.

完全をjsp:getProperty期すために、Bean 名が正しい場合、構文は適切に機能します。

<!-- Works properly, protects me from an incorrect name, but is more verbose than EL. -->
<div><p>Here's some stuff: <jsp:getProperty name="helper" property="stuff"/></div>

${foo.stuff} を書いてもエラーが表示されないのはなぜですか? そのような場合にエラー報告を制御する構成オプションはありますか?

4

2 に答える 2

5

この動作は、式言語仕様バージョン 2.1のセクション 1.6 で説明されています。

expr-a[expr-b] を評価するには:

値 a が null の場合:

  • expr-a[expr-b] が解決される最後のプロパティである場合:
    • 式が値式で、この式の評価を開始するために ValueExpression.getValue(context) が呼び出された場合は、null を返します。
    • それ以外の場合は、PropertyNotFoundException をスローします。左辺値の null を逆参照しようとしています
  • それ以外の場合は、null を返します。

(EL は . と [] 演算子を統合します)

于 2009-05-26T19:17:45.377 に答える
2

それがELの仕組みです。

${helper} は null と評価されるため、EL は "" を返すだけで、式の残りの部分を評価しようとしません。

場合によっては、ちょっと便利な機能です。

${myBean.property1.name}

property1 が null の場合でも機能するため、NPE を防ぐためだけに記述する必要はありません。

<c:if test="${not empty myBean.property1}">${myBean.property1.name}</c:if>
于 2009-05-26T19:10:15.207 に答える