2011-09-23 30 views
0

我有这个页面:问题与C:的forEach内丰富:dataTable的

<?xml version='1.0' encoding='UTF-8' ?> 
<!DOCTYPE composition PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<ui:composition xmlns:ui="http://java.sun.com/jsf/facelets" 
    template="./templates/template.xhtml" 
    xmlns:h="http://java.sun.com/jsf/html" 
    xmlns:f="http://java.sun.com/jsf/core" 
    xmlns:rich="http://richfaces.org/rich" 
    xmlns:c="http://java.sun.com/jstl/core"> 

    <ui:define name="main_title">AO MMS Messages</ui:define> 
    <ui:define name="main"> 
    <rich:dataTable value="#{dataProviderBean.aoRequests}" var="item"> 
     <f:facet name="noData">No messages are available.</f:facet> 
     <rich:column> 
      <f:facet name="header">Profile</f:facet> 
       #{item.profile.username} 
      </rich:column> 
     <rich:column> 
      <f:facet name="header">Timestamp</f:facet> 
       #{item.timestamp} 
      </rich:column> 
     <rich:column> 
      <f:facet name="header">Recipient</f:facet> 
       #{item.recipient} 
      </rich:column> 
     <rich:column> 
      <f:facet name="header">Sender</f:facet> 
       #{item.sender} 
      </rich:column> 
     <rich:column> 
      <f:facet name="header">Text</f:facet> 
      <h:outputText value="Contents: #{item.getContentByStringType('text/plain')}" /> 
       <c:forEach var="content" items="#{item.getContentByStringType('text/plain')}"> 
       <h:outputText value="Content: #{content}" /> 
       </c:forEach> 
      </rich:column> 
     <rich:column> 
      <f:facet name="header">Headers</f:facet> 
       #{item.headers} 
      </rich:column> 
    </rich:dataTable> 
    </ui:define> 
</ui:composition> 

但列Text只打印此:

Contents: [TextContent [content=Hello World in MMS]] Content: 

为何不遍历列表?更多信息

Request类:

public class Request { 

    private Profile profile; 
    private Map<String, String> headers; 
    private Date timestamp; 
    private MessageType messageType; 
    private Map<String, ArrayList<Content>> contents; 

    public Request(MessageType messageType) { 
     this.messageType = messageType; 
     this.timestamp = new Date(); 
    } 

    public Profile getProfile() { 
     return profile; 
    } 

    public void setProfile(Profile profile) { 
     this.profile = profile; 
    } 

    public Map<String, String> getHeaders() { 
     return headers; 
    } 

    public void setHeaders(Map<String, String> headers) { 
     this.headers = headers; 
    } 

    public Date getTimestamp() { 
     return timestamp; 
    } 

    public void setTimestamp(Date timestamp) { 
     this.timestamp = timestamp; 
    } 

    public MessageType getMessageType() { 
     return messageType; 
    } 

    public void setMessageType(MessageType messageType) { 
     this.messageType = messageType; 
    } 

    public Map<String, ArrayList<Content>> getContents() { 
     return contents; 
    } 

    public void setContents(Map<String, ArrayList<Content>> contents) { 
     this.contents = contents; 
    } 

    public List<Content> getContentByStringType(String type) { 
     return contents.get(type); 
    } 

    public String getSender() { 
     return headers.get(HttpHeaders.X_NOKIA_MMSC_FROM.getValue()).replaceAll("/.*", ""); 
    } 

    public String getRecipient() { 
     return headers.get(HttpHeaders.X_NOKIA_MMSC_TO.getValue()).replaceAll("/.*", ""); 
    } 

    @Override 
    public String toString() { 
     return "Request [profile=" + profile + ", headers=" + headers + ", timestamp=" + timestamp 
       + ", messageType=" + messageType + ", contents=" + contents + "]"; 
    } 

} 

回答

2

使用ui:repeat,而不是在这种情况下c:forEach

c:forEach因为你试图参考VAR item未被定义(c:forEachTagHandler所以它试图评估item树正在兴建时,不会在这里工作; rich:dataTable是一个组件,它定义了var item只在渲染响应中)。

有关此事的更多信息,请阅读以下文章:。 TagHandler vs Component

+0

现在很清楚。谢谢 – user219882

+0

不客气! – Andrey