2009-05-26 4 views
4

Я запускаю Tomcat 6.0.18 на Linux.Ошибка поведения языка выражения JSP?

У меня есть 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> 

В течение некоторого рефакторинга, в котором я пропустил возникновение имени 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 работает правильно, когда имя боб правильно:

<!-- 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}? Есть ли какой-либо параметр конфигурации, который контролирует отчет об ошибках в таких случаях?

+0

Просто утверждающие, что говорили другие, это целенаправленная особенность EL. – Eddie

ответ

5

Это поведение описано в разделе 1.6 раздела Expression Language Specification Version 2.1.

Для оценки ехрг-а [выражение-b]:

Если значение-а равно нулю:

  • Если выраж-а [выражение-Ь] последнее свойство решается:
    • Если выражение является выражение ценности и ValueExpression.getValue (контекст) был призван инициировать эту оценку экспрессии , возвращает нуль.
    • В противном случае бросить PropertyNotFoundException.пытается де-справочном нуль для Lvalue
  • В противном случае вернуть нуль.

(EL унифицирует. И [] операторы)

+1

Спасибо за этот ответ @McDowell. Чтобы пояснить: «ValueExpression.getValue (context)» ==, используя EL для чтения значения (что я и делаю в этом вопросе) и «пытается удалить ссылку на null для lvalue» ==, используя EL для записи значения. В разделе 1.4 спецификации обсуждается обоснование наблюдаемого поведения. О, и «return null» означает «произвести пустую строку» в этом контексте - Раздел 1.18.2 Spec –

2

Это так, как работает EL.

$ {helper} оценивает значение null, так что EL просто возвращает "" и не пытается оценить остальную часть выражения.

Это своего рода удобная функция в некоторых случаях:

${myBean.property1.name} 

будет работать, если даже если property1 имеет нулевое значение, таким образом, я не должен писать только предотвратить NPE:

<c:if test="${not empty myBean.property1}">${myBean.property1.name}</c:if> 
Смежные вопросы