Поведение языка выражений JSP? - PullRequest
4 голосов
/ 26 мая 2009

Я использую Tomcat 6.0.18 в Linux.

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

Ответы [ 2 ]

5 голосов
/ 26 мая 2009

Это поведение описано в разделе 1.6 * Спецификация языка выражений Версия 2.1 .

Для оценки expr-a [expr-b]:

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

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

(EL объединяет операторы. И [])

2 голосов
/ 26 мая 2009

Так работает EL.

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

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

${myBean.property1.name}

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

<c:if test="${not empty myBean.property1}">${myBean.property1.name}</c:if>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...