首先,很抱歉,如果您参与了我最近的问题。由于这不是讨论论坛,而且评论数量有限,所以我的最后希望是用实际代码提出一个具体问题,以期我能以某种方式解决问题的深处。
好。我有一个名为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>
好的,这可以正常编译,并且可以正常运行而不会出现错误。我从PrismBacking的logger.info行中看到:
|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
所以我知道我的dataTable中有FEED 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| ||
我不喜欢胡闹。我也不能发表冗长的文章,但是我正在一个没有人知道这些技术的环境中工作,而堆栈溢出是我发现提出这些问题的唯一也是最好的地方。由于我精打细算,希望您不要介意多余的帖子。
那么我的问题是,需要更改上述代码中的哪些内容才能使TaskListData String []成员FTQar可以访问?在此阶段,我会坦白地说,我希望有人可以发布我的代码的修改后的片段,向我显示我哪里出错了。如果由我决定,那么正确的答案会给您比平常多的分数。
确实非常感谢Mark
首先,JSTL和JSF不能像您期望的那样在编码中无缝同步同步工作。更重要的是,JSTL 在 JSF加入 之前先 运行。实际上,JSTL首先从上到下处理整个页面,然后将生成的输出(因此, 没有 任何JSTL标签,但带有生成的输出)移交给JSF,后者依次再次从上到下处理整个页面。
由于h:dataTableJSTL运行时尚未生成任何行,因此您不会从c:forEach内看到任何内容h:column。
h:dataTable
c:forEach
h:column
而是使用JSF提供的迭代组件,例如Tomahawk t:dataTable或RichFaces a4j:repeat或Facelets ui:repeat,甚至是nested h:dataTable。
t:dataTable
a4j:repeat
ui:repeat