2010-01-28 66 views
2

首先,如果您涉及我最近的問題,請致歉。由於這不是討論論壇,評論有限,我最後的希望是用實際的代碼問一個具體的問題,希望能以某種方式達到我的問題的底部。在JSF中支持bean String []訪問

好的。我有一個後端bean稱爲PrismBacking與此相關的代碼:

 public class PrismBacking { 
private ArrayList dataList; 

    public ArrayList<String> getFeedDataList() { 
    XMLHandler xmlh = new XMLHandler(); 
    dataList = new ArrayList(); 
    Document doc = xmlh.getDoc(map); // catches removed 

    // get all the feedNames from the doc, and the feedIds 
    String[] FeedIds = xmlh.getXMLList("//feed/feed_id/text()"); 

    for (String feedId : FeedIds) { 
    TaskListData tld = new TaskListData(); 
    tld.setFeedId(feedId); 

    String feedName = xmlh.getValue("//feed[feed_id='" + feedId +"']" +"/feedname/text()"); 
    tld.setFeedName(feedName); 

    String[] FTQs = xmlh.getList("//feed[feed_id='" + feedId +"']" +"/ftq/ftq_id/text()"); 
    for (String ftqId : FTQs) { 
    logger.info("FTQ: " + ftqId); 
    } 
    tld.setFTQs(FTQs); 

    dataList.add(tld); 
    } 

    setFeedDataListSize(dataList.size()); 
    return dataList; 
} 

在課堂TaskListData,

public class TaskListData { 
private String feedId; 
private String feedName; 
private String[] FTQar; 

public String getFeedId() { 
    return feedId; 
} 

public void setFeedId(String f) { 
    feedId = f; 
} 

public String getFeedName() { 
    return feedName; 
} 

public void setFeedName(String fn) { 
    feedName = fn; 
} 

public String[] getFTQs() { 
    return FTQar; 
} 

public void setFTQs(String[] ftqs) { 
    FTQar = ftqs; 
} 
} 

所以我有我的getter和setter方法設置,我的XPath都好。在我的index.jsp jsf文件中:

<!doctype html public "-//w3c//dtd html 4.0 transitional//en"> 
    <%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%> 
    <%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%> 
    <!-- RichFaces tag library declaration --> 
    <%@ taglib uri="http://richfaces.org/a4j" prefix="a4j"%> 
    <%@ taglib uri="http://richfaces.org/rich" prefix="rich"%> 
    <!-- JSTL XML lib declaration --> 
    <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> 
    <!-- error redirect --> 

    <f:view> 
    <rich:page pageTitle="mypage" markupType="xhtml"> 
     <h:dataTable id="dt1" value="#{PrismBacking.feedDataList}" var="item" 
     border="10" cellpadding="5" cellspacing="3" first="0" 
     rows="#{PrismBacking.feedDataListSize}" width="50%" dir="LTR" 
     frame="hsides" rules="all" 
     summary="This is a JSF code to create dataTable."> 

    <f:facet name="header"> 
    <h:outputText value="This is 'dataTable' demo" /> 
    </f:facet> 

    <h:column> 
    <f:facet name="header"> 
    <h:outputText value="id" /> 
    </f:facet> 
    <h:outputText value="|#{item.feedId}|"></h:outputText> 
    </h:column> 

    <h:column> 
    <f:facet name="header"> 
    <h:outputText value="name" /> 
    </f:facet> 
    <h:outputText value="|#{item.feedName}|"></h:outputText> 
    </h:column> 

    <h:column> 
    <f:facet name="header"> 
    <h:outputText value="ftqs" /> 
    </f:facet> 
    <c:forEach items="#{item.FTQs}" var="jef"> 
    <h:outputText value="|#{jef}|" /> 
    <br /> 
    </c:forEach> 

    </h:column> 

    </h:dataTable> 
    <h:outputText value="" /> 
</rich:page> 
</f:view> 

好吧,這個編譯好,運行正常,沒有錯誤。我從logger.info線看到PrismBacking:

|STDOUT| 2010-01-28 00:02:48,960 | INFO | [http-8989-1]: feedId: 1 | feedSwitch: on | feedName: FEED1 
|STDOUT| 2010-01-28 00:02:48,991 | INFO | [http-8989-1]: FTQ: 1 
|STDOUT| 2010-01-28 00:02:48,991 | INFO | [http-8989-1]: feedId: 2 | feedSwitch: on | feedName: FEED2 
|STDOUT| 2010-01-28 00:02:48,991 | INFO | [http-8989-1]: FTQ: 1 
|STDOUT| 2010-01-28 00:02:48,991 | INFO | [http-8989-1]: feedId: 3 | feedSwitch: on | feedName: FEED3 
|STDOUT| 2010-01-28 00:02:48,991 | INFO | [http-8989-1]: FTQ: 1 
|STDOUT| 2010-01-28 00:02:49,007 | INFO | [http-8989-1]: feedId: 4 | feedSwitch: on | feedName: FEED4 
|STDOUT| 2010-01-28 00:02:49,007 | INFO | [http-8989-1]: feedId: 5 | feedSwitch: off | feedName: FEED5 
|STDOUT| 2010-01-28 00:02:49,023 | INFO | [http-8989-1]: feedId: 6 | feedSwitch: on | feedName: FEED6 
|STDOUT| 2010-01-28 00:02:49,038 | INFO | [http-8989-1]: feedId: 7 | feedSwitch: on | feedName: FEED7 

,所以我知道我有飼料1-3應有的FTQ數字1,在我的數據表。在渲染頁面上,我看到這個

This is 'dataTable' demo 

id name ftqs 
|1| |FEED1| || 
|2| |FEED2| || 
|3| |FEED3| || 
|4| |FEED4| || 
|5| |FEED5| || 
|6| |FEED6| || 
|7| |FEED7| || 

我不喜歡gro。。我也無法忍受長篇文章,但是我在一個沒有人知道這些技術的環境中工作,堆棧溢出是我發現問這些問題的唯一和最好的地方。正如我的智慧結束,我希望你不要介意額外的帖子長度。

然後我的問題是從上面的代碼需要更改以獲取TaskListData String []成員FTQar可訪問?在這個階段,我會誠實地說,我希望有人可以發佈我的代碼修改後的代碼片段,顯示我出錯的地方。如果這取決於我,你會得到比正常情況更多的正確答案。

真是太感謝您 馬克

回答

3

首先,JSTL和JSF不能像編碼中的順序一樣同步無縫地同步工作。實際上,JSTL首先從上到下處理整個頁面,然後將生成的輸出(因此,沒有任何JSTL標記,但是其生成的輸出)交給JSF依次處理整個頁面從上到下。

由於h:dataTable在JSTL運行時尚未生成任何行,因此您不會看到h:columnc:forEach的任何內容。

而是使用JSF提供的迭代組件,如Tomahawk的t:dataTable,或RichFaces的a4j:repeat,或Facelets的ui:repeat,或者甚至一個嵌套h:dataTable

0

我猜使用<c:forEach>問題造成的。 JSTL標籤並不總是與JSF標籤一起使用,因爲它們不會被同時評估。嘗試<a4j:repeat>

+0

我試過''標籤,它會導致我的瀏覽器掛起。我和其他richfaces標籤有同樣的問題,但這是另一回事。 – volvox 2010-01-28 00:56:31

+0

這似乎不太可能。你是否重複了一個無限循環? – Naganalf 2010-01-28 01:05:22

+0

不,我有控制檯輸出的內容(上面列出)顯示它應該只有3個條目。不過,我想知道,因爲我試圖輸出7個行值的行,對於其中一些沒有條目的Ftq數組,這會導致問題嗎?我需要在這種情況下填充String [] Ftqs嗎? – volvox 2010-01-28 12:37:39

0

我記得有一個類似的問題,因爲在getter/field的名稱中使用所有大寫字母,或者像您的案例FTQs,您是否嘗試將item.FTQs更改爲item.fTQs,甚至將您的getter/setter重命名爲Ftqs改爲使用item.ftqs?

+0

感謝您的回覆。編輯器忽略了突出顯示TaskListData類中FTQar的getter和setter。我已經完成了編輯。儘管如此,我應該問,吸氣/安裝人員並不全是大寫 - 但我知道你的意思 - 就像主要大寫字母。當我回到辦公室時,我會嘗試getFtqs和setFtqs。 – volvox 2010-01-28 08:45:21

+0

好的,爲了完整性,eclipse 3.4和tomcat 6中的大寫,jre 1.6沒有任何區別。 – volvox 2010-01-28 12:32:03