2 Stimmen

Backing Bean String[]-Zugriff in JSF

Zunächst möchte ich mich entschuldigen, falls Sie sich mit meinen jüngsten Fragen beschäftigt haben. Da dies kein Diskussionsforum ist und die Kommentare begrenzt sind, ist meine letzte Hoffnung, eine konkrete Frage mit konkretem Code zu stellen, in der Hoffnung, dass ich irgendwie auf den Grund meines Problems stoßen kann.

GUT. Ich habe eine Backing Bean mit dem Namen PrismBacking mit dem folgenden 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 der Klasse 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;
 }  
}

Ich habe also meine Getter und Setter eingerichtet, und mein XPath ist in Ordnung. In meiner index.jsp jsf-Datei:

    <!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, das lässt sich gut kompilieren und läuft ohne Fehler. Ich sehe in der logger.info Zeile 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

Ich weiß also, dass ich in meiner dataTable die FEEDs 1-3 habe, in denen die FTQ-Nummer 1 stehen sollte. Beim Rendern der Seite sehe ich Folgendes

This is 'dataTable' demo

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

Ich mag keine Kriecherei. Ich kann auch keine langen Beiträge ertragen, aber ich arbeite in einem Umfeld, in dem ich niemanden habe, der sich mit diesen Technologien auskennt, und Stack Overflow ist der einzige und beste Ort, den ich gefunden habe, um diese Fragen zu stellen. Da ich mit meinem Latein am Ende bin, hoffe ich, dass Sie nichts gegen die zusätzliche Länge des Beitrags haben.

Meine Frage ist dann, was aus dem obigen Code muss ändern, um die TaskListData String[] Mitglied FTQar zugänglich zu machen? In diesem Stadium werde ich ehrlich sein und sagen, dass ich hoffe, dass jemand einen geänderten Ausschnitt meines Codes posten könnte, der mir zeigt, wo ich etwas falsch gemacht habe. Wenn es nach mir ginge, bekämen Sie für die richtige Antwort mehr Punkte als sonst.

Vielen Dank! Mark

3voto

BalusC Punkte 1034465

Zunächst einmal arbeiten JSTL und JSF nicht so nahtlos und synchron zusammen, wie man es aufgrund der Reihenfolge in der Kodierung erwarten würde. Es ist eher so, dass JSTL zuerst läuft vor JSF tritt in Kraft. Praktisch verarbeitet JSTL zuerst die gesamte Seite von oben nach unten und übergibt dann die generierte Ausgabe (also, ohne JSTL-Tags, aber mit der generierten Ausgabe) an JSF weiter, das wiederum die gesamte Seite von oben nach unten verarbeitet.

Da die h:dataTable zum Zeitpunkt der Ausführung der JSTL noch keine Zeilen erzeugt hat, werden Sie nichts von der c:forEach innerhalb einer h:column .

Verwenden Sie stattdessen die von JSF bereitgestellten iterierenden Komponenten, wie z. B. Tomahawk's t:dataTable oder RichFaces' a4j:repeat oder Facelets' ui:repeat oder vielleicht sogar eine verschachtelte h:dataTable .

0voto

Naganalf Punkte 1081

Ich vermute, das Problem rührt von der Verwendung von <c:forEach> . JSTL-Tags vertragen sich nicht immer gut mit JSF-Tags, da sie nicht gleichzeitig ausgewertet werden. Versuchen Sie <a4j:repeat>

0voto

kpolice Punkte 581

Ich erinnere mich, ein ähnliches Problem aufgrund der Verwendung aller Großbuchstaben im Namen der Getter/Feld oder wie Ihr Fall FTQs, haben Sie versucht, ändern item.FTQs zu item.fTQs oder sogar umbenennen Ihre Getter/Setter zu Ftqs statt und mit item.ftqs?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X