Поддержка бина String [] в JSF - PullRequest
       18

Поддержка бина String [] в JSF

2 голосов
/ 28 января 2010

Во-первых, извинения, если вы были связаны с моими недавними вопросами. Поскольку это не дискуссионный форум и комментарии ограничены, моя последняя надежда состоит в том, чтобы задать конкретный вопрос с реальным кодом в надежде, что каким-то образом я смогу достичь сути своей проблемы.

OK. У меня есть компонент поддержки с именем 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;
 }  
}

так что у меня есть настройки для получения и установки, и мой XPath все в порядке. В моем файле jsf index.jsp:

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

так что я знаю, что у меня есть 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

Ответы [ 3 ]

3 голосов
/ 28 января 2010

Прежде всего, JSTL и JSF не работают вместе синхронно, как можно было бы ожидать от порядка в кодировании. Более того, JSTL запускается сначала до того, как JSF запускается. Фактически, JSTL сначала обрабатывает всю страницу сверху вниз, а затем передает сгенерированный вывод (таким образом, без любых тегов JSTL но с его сгенерированным выводом) в JSF, который, в свою очередь, снова обрабатывает всю страницу сверху вниз.

Так как h:dataTable еще не сгенерировал ни одной строки в момент запуска JSTL, вы не увидите ничего из c:forEach внутри h:column.

Скорее используйте предоставляемые JSF итерирующие компоненты, такие как Томагавк t:dataTable, или RichFaces 'a4j:repeat, или Facelets' ui:repeat, или, возможно, даже вложенный h:dataTable.

0 голосов
/ 28 января 2010

Я помню, что у меня была похожая проблема из-за использования всех заглавных букв в имени получателя / поля или в качестве FTQ для вашего случая, вы пытались изменить item.FTQs на item.fTQs или даже переименовать ваш получатель / установщик в Ftqs вместо этого и используя item.ftqs?

0 голосов
/ 28 января 2010

Я предполагаю, что проблема связана с использованием <c:forEach>. Теги JSTL не всегда хорошо работают с тегами JSF, поскольку они не оцениваются одновременно. Попробуйте <a4j:repeat>

...