Почему этот скрипт JSP завершается с ошибкой NullPointerException? - PullRequest
1 голос
/ 22 сентября 2011

Я могу распечатать pageModel.foo, используя EL:

${pageModel.foo}

Но этот скриптлет завершается ошибкой в ​​строке, где я проверяю length() из foo:

java.lang.String foo = (java.lang.String)pageContext.getAttribute("pageModel.foo");
if(foo.length()>10){
    foo = foo.substring(0, 9);
}

Выдает NullPointerException - что не имеет смысла, потому что ${pageModel.foo} работает!

Ответы [ 4 ]

2 голосов
/ 22 сентября 2011

Есть пара проблем с кодом, который вы разместили:

  1. EL ${pageModel.foo} не загружает атрибут с именем "pageModel.foo" - он загружает атрибут с именем "pageModel" и получает свое свойство "foo".
  2. pageContext.getAttribute() загружает только атрибуты из области страницы. Однако EL может получить доступ к атрибутам из многих областей - вместо этого следует использовать pageContext.findAttribute().

код:

String foo = "";
PageModel pageModel = (my.package.PageModel)pageContext.findAttribute("pageModel");
if (pageModel != null) {
  foo = pageModel.getFoo();
  if(foo.length()>10){
    foo = foo.substring(0, 9);
  }
}
1 голос
/ 22 сентября 2011

Ответ уже дан Нейтом, поэтому я не буду его повторять.

Однако я обычно дополняю ответы ответами, которые отвечают тому, что действительно нужно 1004 * спрашивающему, а не тому, что спрашивает спрашивающий.Это выглядит очень похоже на то, что вы совершенно не знаете о JSTL основных тегах и функциях .Вы действительно должны предпочесть, чем возиться с уродливыми скриптлетами .

<c:set var="foo" value="${pageModel.foo}" />
<c:if test="${fn:length(foo) > 10)}">
    <c:set var="foo" value="${fn.substring(foo, 0, 9)}" />
</c:if>
<p>${foo}</p>

или с условным оператором ?::

<c:set var="foo" value="${(fn:length(pageModel.foo) > 10) ? fn.substring(pageModel.foo, 0, 9) : pageModel.foo}" />
<p>${foo}</p>

Гораздо лучше, не так ли?не так ли?

Имейте в виду: когда вам нужен скриптлет <% %>, очень велики шансы, что вы ищете решение в неправильно направление.Подумайте дважды, чтобы найти решение, и посмотрите в сторону меток, функций EL или просто сервлетов / фильтров.

0 голосов
/ 22 сентября 2011

Попробуйте что-то вроде:

Map m = (java.util.Map) pageContext.getAttribute("pageModel");
String foo = (String) m.get("foo");
if(foo.length()>10){
    foo = foo.substring(0, 9);
}

Я не совсем уверен, что это за объект pageModel, но, вероятно, это Map.

0 голосов
/ 22 сентября 2011

Атрибут pageModel, а не pageModel.foo.

Не то чтобы вы все равно делали это в скриптлете: (

...