2009-09-22 52 views
2

我使用RichFaces的JSF,我想遍历一个Map<Object,Object>。我在Sun论坛和其他网站上看到很多例子,但在我的情况下它不起作用。这里是我的XHTML代码:问题,使用叠代java.util.Map“JSF”或JSTL标记

<c:forEach items="#{order.customOptions}" var="option"> 
    <h:outputText value="this text does not print" /> 
    <h:outputText value="#{option.value.name}" /> 
    <h:outputText value="#{option.value.key}" /> 
</c:forEach> 

“顺序” 的对象是Order类型。 “customOptios”类型为Map<CustomOption,CustomOptionValue>。当我创建一个Javascript警报来打印'#{order.customeOptions}'时,它的内容是正确的,但它甚至不会输入c:forEach loop

更新1::我尝试了列表,但它不工作。我使用列表并在其他页面获得答案。我也使用a4j:poll和其他一些Ajax组件是否有任何问题?

<c:forEach items="#{order.food.cusomableOptions}" var="option"> 
    <h:outputText value="this text does not print" /> 
    <h:outputText value="#{option.title}" /> 
</c:forEach> 

更新2:这里是<h:outputText value="#{order.customOptions}" />输出:

{[email protected][email protected], 
[email protected][email protected], 
[email protected][email protected], 
[email protected][email protected], 
[email protected][email protected]} 

更新3:当我使用它的rich:column它的工作原理, 之外,但是当我在rich:dataTable使用它, rich:column标记它不起作用:

<rich:column> 
    <f:facet name="header"> 
     <h:outputText value="xf" /> 
    </f:facet> 
    <c:forEach items="#{order.customOptions}" var="option"> 
     <p><h:outputText value="option : #{option.key.title}" /></p> 
    </c:forEach> 
</rich:column> 
+0

是不是项= “$ {} order.customOptions” 和值= “$ {选项....}”? – daveb 2009-09-22 16:01:55

+0

我使用ui:重复,但它不起作用! – stacker 2009-09-22 16:02:14

+0

我越用JSF的工作我越喜欢JSTL ... – ATorras 2009-09-22 16:15:52

回答

1

JSTL和JSF不同步,无缝地协同工作,你会直观地从源代码中的排序预期。大致说,JSTL从上到下第一到JSF这又再次处理整个页面从上到下处理整个页,然后用手将所生成的输出(因此,而不任何JSTL标记,但其产生的输出) 。

JSF UIData组件,如h:dataTablerich:dataTable此刻JSTL运行,这cauces,你不会看到c:forEach列里的任何东西都没有产生的任何行呢。

为了解决这个问题,您应该只是使用JSF提供的迭代组件,如RichFaces的a4j:repeat,或Facelets的ui:repeat,或者战斧的t:dataList。他们都做得更少或更多相同的JSTL c:forEach

对于JSTL标记的所剩下的,functions标记库是在JSF有用,所有其他标记库是在JSF环境superflous因为它或者提供相同的功能的开箱(JSTL核心和格式标签库) ,或者它根本不适合MVC的意识形态(JSTL sql和xml taglibs)。

4

This blog可能会有帮助,因为在JSF上使用JSTL标记时存在一些问题。

+0

这一块也是有帮助的http://www.ilikespam.com/blog/c:的foreach-VS-UI:重复功能于小面 – digitaljoel 2009-09-22 16:10:28

1

如果甚至没有输入循环,则表明地图只是空的。

你可以诊断,通过加入像

<h:outputText value="map size: #{order.customOptions.size()}" /> 

在回路标签的前面,但你应该真正建立起像Eclipse或Netbeans的一个IDE,并在其中运行你的代码,以便您可以使用真正的调试器 - 您可以通过这种方式更简单快捷地解决问题。

+0

TNX 4你的答案 ,但我说我看到customOptions内容与一个JavaScript警告,它是正确的 当我使用的 它并打印‘地图的大小’和dowsn't打印尺寸! 我与JBoss Web开发人员的Eclipse插件使用。 – stacker 2009-09-22 16:20:46

0

也许你不应该混合JSTL:核心标签和JSF:H标签。

问候。

+0

我已经将它们混合,并得到了回答!但我的问题是迭代地图 – stacker 2009-09-22 16:26:58

+0

迭代map.entrySet怎么样? – ATorras 2009-09-22 16:53:15

0

只是你的地图转换成一个ArrayList中,并用H:DataTable,并将您的问题应该得到解决。

0

您应该使用等效的JSF标签。你有没有试过<a4j:repeat/>

3

如果我需要遍历地图,我用的辅助类(例如输入)如下图所示:

public class Entry { 
    private String value; 
    private String key; 

    public Entry(String value, String key) { 
     super(); 
     this.value = value; 
     this.key = key; 
    } 

    public String getKey() { 
     return key; 
    } 

    public void setKey(String key) { 
     this.key = key; 
    } 

    public String getValue() { 
     return value; 
    } 

    public void setValue(String value) { 
     this.value = value; 
    } 
} 

和转换地图列出方法:

private List<Entry> mapToList(Map<String,String> map) { 
    List<Entry> list = new ArrayList<Entry>(); 
    for(String key: map.keySet()) { 
     list.add(new Entry(key, map.get(key))); 
    } 
    return list;   
} 

XHTML:

<ui:repeat var="entry" value="#{bean.list}" varStatus="i"> 
    <div>#{entry.key} : #{entry.value}</div> 
</ui:repeat> 

也许这会帮助你...或者可能不会;)