【问题标题】:Issue Retrieving values from a TreeMap of <id, beans> in JSP问题从 JSP 中 <id, beans> 的 TreeMap 检索值
【发布时间】:2010-12-13 01:17:29
【问题描述】:

我在尝试从包含一段时间的 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>

【问题讨论】:

  • 功能需求不明确,代码不是真正的自我记录,失败尝试的例子对理解需求没有多大帮助。我建议编辑您的问题以更详细地描述功能要求和/或在伪代码或普通 Java 代码中添加一个示例,您希望使用for 循环等来迭代地图。这样就更容易将其转化为 JSTL 方法。
  • 对不起,我忘记了,过去 2 天里,每个人都没有看到我看到的同样的东西。我已经更新了我的描述,希望它能对我正在尝试做的事情有所启发

标签: java jsp map jstl


【解决方案1】:

尽管问题已更新,但我仍然不明白您在视图方面到底需要什么。太模糊了。

无论如何,Map 上的每个 c:forEach 迭代都会给您一个 Map.Entry,而 Map.Entry 又具有 getKey()getValue() 方法。

这是一个基本的例子:

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

这些知识应该可以帮助您入门。

另见:


更新:我仍然不明白你在用 两张 地图做什么,以及为什么你需要 Map 而不是 List,因为你似乎对钥匙不感兴趣。所以,这里有一个例子,只有一个地图和一个简单的 servlet 类来预处理请求。

首先是(简化的)Tile 类:

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

预处理servlet:

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

【讨论】:

  • 也许更好地说明我的结果地图将有助于至少了解我想要得到的东西。生成的树形图如下所示
    {Key, value}<br> {0, bean(tileName,tiledescrip,iagePath)} - {1, bean(tileName,tiledescrip,iagePath)} - {2 , bean(tileName,tiledescrip,iagePath)}

    .我的问题是,使用上面的代码,即使输出地图本身确实在 sortedHash = CTTeamsiteXMLHash@135b24b
    处显示它,我也没有从地图的第一级迭代返回任何值
  • 这时你需要访问bean的属性,比如${entry.value.tileName}
  • 我仍然遇到的问题是,出于某种原因,我的 forEach 甚至不承认地图。我不应该使用它来将全局组件拉到页面吗?
  • 查看答案更新。希望这能让你朝着正确的方向前进。我的印象是你把事情复杂化了。
  • 您可能对过度复杂化是正确的,这种方法似乎可以解决问题..非常感谢 BalusC
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-26
  • 1970-01-01
  • 1970-01-01
  • 2023-03-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多