tags:

views:

327

answers:

3

First, apologies if you've been involved with my recent questions. As this isn't a discussion forum, and comments are limited, my last hope is to ask a specific question with actual code in the hope that somehow I can reach the bottom of my problem.

OK. I've a backing bean called PrismBacking with this pertinent code:

     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;
 }

In class 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;
 }  
}

so I've got my getters and setters setup, and my XPath all good. In my index.jsp jsf file:

    <!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>

OK, this compiles fine, and runs ok without error. I see from the logger.info line in 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

so I know I have FEEDs 1-3 which should have the FTQ number 1 in, in my dataTable. On rendering the page, I see this

This is 'dataTable' demo

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

I don't like grovelling. I can't bear long posts either, but I'm working in an environment where I've nobody who knows about these technologies and stack overflow is the only and best place I've found to ask these questions. As I'm at my wits end, I hope you don't mind the extra post length.

My question then is what from the above code needs to change to get the TaskListData String[] member FTQar accessible? At this stage, I'll be honest and say I'm hoping someone could post a modified snippet of my code showing me where I've gone wrong. If it were up to me, you'd get extra points than normal for the right answer.

Many thanks indeed Mark

A: 

I would guess the problem stems from using <c:forEach>. JSTL tags don't always play well with JSF tags as they are not evaluated at the same time. Try <a4j:repeat>

Naganalf
i've tried `<a4j:repeat>` tags and it causes my browser to hang. i've had the same trouble with other richfaces tags but that's another story.
Mark Lewis
That seems unlikely. Were you repeating over an infinite loop?
Naganalf
No, I've got the console outputting the contents (listing above) showing it should only have 3 entries. I wondered though, as I'm attempting to output 7 feeds worth of rows, for some of which there are Ftq arrays with no entries, would this cause a problem? Do I need to pad the String[] Ftqs with something in this case?
Mark Lewis
A: 

I remember having a similar problem due to using all caps in the name of the getter/field or like your case FTQs, have you tried changing item.FTQs to item.fTQs or even renaming your getter/setter to Ftqs instead and using item.ftqs?

kpolice
Thanks for the response. the editor had omitted highlighting the getter and setter for the FTQar in the TaskListData class. I've done the edit now. I should ask though, the getter/setter is not all caps - but i know what you mean - as in mainly caps. I'll try getFtqs and setFtqs when im back in the office.
Mark Lewis
OK, for completeness, the capitalisation in eclipse 3.4 and tomcat 6, jre 1.6 didn't make any difference.
Mark Lewis
+2  A: 

First of all, JSTL and JSF doesn't work seamlessly together in sync as you would expect from the order in the coding. It's more so that JSTL runs first before JSF kicks in. Virtually, JSTL processes the entire page from top to bottom first and then hands the generated output (thus, without any JSTL tags, but with its generated output) over to JSF which in turn processes the entire page from top to bottom again.

As the h:dataTable hasn't generated any rows yet at the moment the JSTL runs, you aren't going to see anything from the c:forEach inside a h:column.

Rather use the JSF-supplied iterating components, such as Tomahawk's t:dataTable, or RichFaces' a4j:repeat, or Facelets' ui:repeat, or maybe even a nested h:dataTable.

BalusC