Работа с языком выражений Java на странице - PullRequest
5 голосов
/ 24 ноября 2010

Я работаю над внешним интерфейсом проекта, который предоставляет мне теги Java Expression Language для работы.В одном случае мне нужно посмотреть, возвращает ли он массив или только один бит данных, и я не знаю, как с ним работать.

Пример:

На странице есть

<p>${WebAppContext.buildings[0].location.name}</p>

, который выдаст что-то вроде:

<p>Acme</p>

Проблема в том, что мне нужно выводить больше, если в этих зданиях есть бит:

Что-то вроде (в псевдокоде):

if isArray(${WebAppContext.buildings}){
 foreach(${WebAppContext.buildings} as foo){
    //iterate over whatever is in the array
}
}

, чтобы я мог вывести что-то вроде:

<p>${WebAppContext.buildings[0].location.name}</p>
<p>${WebAppContext.buildings[1].location.name}</p>

Я спросил людей, ответственных за Java для генерации этого кода, и они сказали: «Не знаю, как дела».так что я надеюсь, что у вас, ребята, будет некоторое понимание.

Помимо того, что я не буду вставлять код на страницу, я понятия не имею, как работать с этим языком Java-выражений (мне даже пришлось посмотреть его, чтобы увидетькакого чёрта это называется).Поэтому любые советы / ресурсы будут полезны.


РЕДАКТИРОВАТЬ:

Я пробовал следующее и не получаю никаких результатов:

<c:forEach var='building' items='${WebAppContext.buildings}'>
  <p>${building.location.name}</p>
</c:forEach>

В источнике страницы просто показано:

<c:forEach var='meeting' items='[Lorg.foo.bar.baz.bat.serviceapi.webserviceobject.xsd.BuildingsWSO;@3823ff8'>
  <p></p>
</c:forEach>

Я признаю, что, ничего не зная о языке выражений Java, я не понимаю, почему переводится items = ''как это происходит, хотя я вижу, что он следует по пути в настройке, которую мы используем.Теперь, когда я использую:

<p>${WebAppContext.buildings[0].location.name}</p>
<p>${WebAppContext.buildings[1].location.name}</p>

, я получаю:

<p>Krustylu Studios</p>
<p>Springfield Nuclear Power Plant</p>

Ответы [ 4 ]

4 голосов
/ 24 ноября 2010

Я не думаю, что такая расширенная функциональность поддерживается EL;вы можете попробовать использовать тег JSTL c: forEach для перебора вашего списка.

3 голосов
/ 24 ноября 2010

Если вы видите <c:forEach var='meeting' items='[Lorg.foo.bar.baz.bat.serviceapi.webserviceobject.xsd.BuildingsWSO;@3823ff8'> при просмотре источника страницы из браузера, это означает, что тег <c:forEach> не обрабатывается.

Убедитесь, что вы объявили библиотеку тегов встраница JSP:

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

prefix="c" - это то, где вы получаете c: часть <c:forEach> ... если бы вы сказали prefix="foo", то тег был бы <foo:forEach>

2 голосов
/ 24 ноября 2010

Это должно быть возможно:

<c:forEach var='building' items='${WebAppContext.buildings}'>
  <p>${building.location.name}</p>
</c:forEach>

Теперь, как вы будете проверять, является ли WebAppContext.buildings массивом?Прямой простой способ сделать это с помощью JSTL не существует, если только не обладает возможностями и возможностью расширять локальный пользовательский набор функций EL для использования из JSTL.

1 голос
/ 24 ноября 2010

Если вам действительно нужно знать, является ли объект массивом, вы можете создать пользовательскую функцию JSP.

public static boolean isArray(final Object o) {
    return o instanceof Object[];
}

Затем просто сопоставьте его в TLD, например:

<function>
    <description>
        Checks if the supplied object is an array.
    </description>
    <name>isArray</name>
    <function-class>com.example.JspFunctions</function-class>
    <function-signature>boolean isArray(java.lang.Object)</function-signature>
    <example>
        ${f:isArray(someVar)}
    </example>
</function>
...