Проблема Получение значений из TreeMap ‹id, beans› в JSP

У меня были проблемы с попыткой получить значения из treeMap, которые содержались в течение некоторого времени. Я пробовал несколько различных методов доступа к данным, но самое далекое, что я получил, было для JSP, чтобы признать, что хэш или карта дерева, но фактически не перебирать его и не возвращать данные.

Я пытался найти лучший способ сортировки результатов xml на основе атрибута тега. Итак, я беру xml и помещаю значения каждого в bean-компонент, затем беру и помещаю bean-компоненты в древовидную карту, где Key = SortId. Поскольку treema автоматически сортирует, результатом является отсортированная карта значений XML. Население bean-компонента и treeMap отлично работает, проблема заключается в том, чтобы просто вытащить эти значения в JSP.

Что ж, возможно, лучшая иллюстрация моей получившейся карты поможет, по крайней мере, понять, что я пытаюсь понять. Цель состоит в том, чтобы пройтись по недавно упорядоченному списку и заполнить мои div чем-то вроде

<div>
Name: ${tileName} <br />
Description: ${tileDescrip} <br />
<img scr="${imagePath}">
</div>

результирующая карта дерева выглядит так

отсортированный хэш

{0, bean(tileName,tiledescrip,imagePath)}
{1, bean(tileName,tiledescrip,imagePath)}
{2, bean(tileName,tiledescrip,imagePath)} 

Моя проблема в том, что с приведенным выше кодом я не получаю никаких значений, возвращаемых даже из итерации первого уровня карты, даже если вывод самой карты показывает ее там в

sortedHash = CTTeamsiteXMLHash@135b24b 

так что псевдопоток того, что я делаю

Read XML
- Iterate
     -Parse XML Values to bean
  -Place bean in Treemap<SortId, XML-Bean>
-Return TreeMap
-Loop through treemap and then pull each bean value out. 

Вот пример XML

<teaser>
<sort>1</sort>
<value1></value1>
<value2></value2>
</teaser>

Мой компонент

public class CTTeamsiteXMLHash {


private HashMap<String, Object> xmlHash;
private TreeMap<String, Object> sortedHash;


public TreeMap<String, Object> getSortedHash() {
 return sortedHash;
}

public void setSortedHash(TreeMap<String, Object> sortedHash) {
 this.sortedHash = sortedHash;
}

public void setXmlHash(String sortOrder, CTTeamsiteXMLBean bean) {
 getXmlHash().put(sortOrder, bean);

}

public HashMap<String, Object> getXmlHash() {
 return xmlHash;
}

Вот моя неудачная попытка доступа из JSP. если это поможет, я также передаю sortedHash в запросе

     <jsp:useBean id="sortedHash" class="CTTeamsiteXMLHash"
 scope="request"/>
     <c:forEach items="${sortedHash.sortedHash}"
 var="eachItem">
       <c:forEach items="${eachItem.value}"
 var="anItem">
          <c:out value="${anItem.tileName.value}" /> :
 <c:out
 value="${anItem.tileDescrip.value}" />
       </c:forEach>
     </c:forEach>

person QUEdini    schedule 13.12.2010    source источник
comment
Функциональное требование неясно, код не является самодокументируемым, а пример неудачной попытки не очень помогает понять требование. Я бы предложил отредактировать ваш вопрос, чтобы более подробно описать функциональные требования и/или добавить пример в псевдокоде или обычном коде Java, как именно вы хотели бы перебирать карту, используя цикл for и так далее. Таким образом, его легче перевести в подход JSTL.   -  person BalusC    schedule 13.12.2010
comment
Извините, я забыл, что все не смотрели на то же самое, что и я, в течение последних 2 дней. Я обновил свое описание, надеюсь, оно проливает свет на то, что я пытаюсь сделать.   -  person QUEdini    schedule 13.12.2010


Ответы (1)


Несмотря на обновление вопроса, я все еще не понимаю, что именно вам нужно на стороне просмотра. Все слишком расплывчато.

В любом случае, каждая c:forEach итерация по Map даст вам Map.Entry который, в свою очередь, имеет методы getKey() и getValue().

Вот простой пример:

<c:forEach items="${map}" var="entry">
    key = ${entry.key}, value = ${entry.value}<br>
<c:forEach>

Эти знания должны помочь вам начать.

Смотрите также:


Обновление: я до сих пор не понимаю, что вы делаете с двумя картами и почему именно вам нужна Map вместо List, поскольку вам это не интересно в ключах. Итак, вот пример только с одной картой и простым классом сервлета, который выполняет предварительную обработку запроса.

Сначала (упрощенный) класс Tile:

public class Tile {
    private String name;
    private String description;
    private string imagepath;
    // Add/generate c'tor/getters/setters/etc.
}

Сервлет предварительной обработки:

Map<Integer, Tile> map = new TreeMap<Integer, Tile>();
map.put(1, new Tile("name1", "description1", "imagepath1"));
map.put(2, new Tile("name2", "description2", "imagepath2"));
map.put(3, new Tile("name3", "description3", "imagepath3"));
// ...

request.setAttribute("map", map); // It'll be available as ${map} in JSP.
request.getRequestDispatcher("/WEB-INF/page.jsp").forward(request, response);

JSP:

<c:forEach items="${map}" var="entry">
    <div>
        Map key: ${entry.key}<br>
        Tile name: ${entry.value.name}<br>
        Tile description: ${entry.value.description}<br>
        Tile image: <img src="${entry.value.imagepath}">
    </div>
</c:forEach>

(кстати, jsp:useBean не нужен)

person BalusC    schedule 13.12.2010
comment
Что ж, возможно, лучшая иллюстрация моей получившейся карты поможет, по крайней мере, понять, что я пытаюсь понять. результирующая древовидная карта выглядит следующим образом , bean(tileName,tiledescrip,iagePath)}‹/code›‹/pre› ‹br/› . Моя проблема в том, что с приведенным выше кодом я не получаю никаких значений, возвращаемых даже из итерации первого уровня карты, хотя вывод самой карты показывает ее там в sortedHash = CTTeamsiteXMLHash@135b24b - person QUEdini; 13.12.2010
comment
Затем вам нужно получить доступ к свойству bean, например ${entry.value.tileName}. - person BalusC; 13.12.2010
comment
Проблема, с которой я все еще сталкиваюсь, заключается в том, что по какой-то причине мой forEach даже не подтверждает карту. не должен ли я использовать это, чтобы вывести глобальный компонент на страницу? ‹jsp:useBean id=sortedHash class=CTTeamsiteXMLHash scope=request/› - person QUEdini; 13.12.2010
comment
Смотрите обновление ответа. Надеюсь, это поставит вас в правильном направлении. У меня сложилось впечатление, что вы слишком все усложняете. - person BalusC; 13.12.2010
comment
Возможно, вы правы насчет чрезмерной сложности, этот метод, похоже, помогает... большое спасибо, BalusC. - person QUEdini; 13.12.2010
comment
я получаю oot причину ServletException. javax.servlet.jsp.JspException: произошла ошибка при оценке значения атрибута пользовательского действия со значением ${entry.value}: невозможно найти значение для значения в объекте класса java.lang.String с помощью оператора. (ноль), но когда я делаю ‹c:out value=${map} /›, я получаю {0=com.ctstore.utils.ui.CTTeamsiteXMLBean@5fed59, 1=com.ctstore.utils.ui.CTTeamsiteXMLBean@1d7a6ab } так что значения есть, просто не сопоставляются с ‹c:forEach items=${test} var=entry› ‹c:out value=${entry.value} /› ‹/c:forEach› - person QUEdini; 13.12.2010
comment
о, и когда я пытаюсь просто вывести ${entry.value}, он выводит точно так же, как текст, на самом деле он не пытается разрешить значение внутри ‹C:forEach› - person QUEdini; 13.12.2010
comment
Является ли ${test} картой? Исключение предполагает, что это не так. Используйте <c:forEach items="${map}" var="entry"> вместо <c:forEach items="${test}" var="entry"> - person BalusC; 13.12.2010
comment
${test} была картой в этом, даже изменив имя на карту, c:out по-прежнему показывает значения выше, но я все еще получаю null для entry.value.. ‹c:› предполагается из ‹%@ taglib uri =java.sun.com/jstl/core prefix=c %› верно? - person QUEdini; 13.12.2010
comment
Это древний URI JSTL 1.0. Вам нужен http://java.sun.com/jsp/jstl/core (с частью /jsp). См. также этот ответ. - person BalusC; 13.12.2010
comment
спасибо за ответ, что я хотел, LK_PY_ALLOW имеет тип карты дерева, это была хеш-таблица, поэтому ... <c:forEach items="${LK_PY_ALLOW}" var="entry"> <c:if test="${entry.key eq param.allowC}"> ${entry.value.allowAd} </c:if> </c:forEach> - person shareef; 20.07.2013