【问题标题】:Backing bean String[] access in JSFJSF 中的支持 bean String[] 访问
【发布时间】:2011-01-10 05:22:15
【问题描述】:

首先,如果您涉及到我最近的问题,我们深表歉意。由于这不是一个讨论论坛,而且 cmets 是有限的,我最后的希望是用实际代码提出一个具体的问题,希望我能以某种方式找到问题的根源。

好的。我有一个名为 PrismBacking 的支持 bean,带有以下相关代码:

     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

所以我知道我的数据表中的 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 可访问?在这个阶段,我会诚实地说,我希望有人可以发布我的代码的修改后的 sn-p,向我展示我哪里出错了。如果由我来决定,你会得到比正常答案更多的分数。

非常感谢 标记

【问题讨论】:

    标签: java jsp jsf jstl


    【解决方案1】:

    首先,JSTL 和 JSF 不能像您从编码顺序中所期望的那样无缝地同步工作。更重要的是,JSTL 在 JSF 启动之前首先运行。实际上,JSTL 先从上到下处理整个页面,然后处理生成的输出(因此,没有任何 JSTL标记,但带有其生成的输出)传递给 JSF,而 JSF 又从上到下再次处理整个页面。

    由于在 JSTL 运行时 h:dataTable 尚未生成任何行,因此您不会在 h:column 中看到来自 c:forEach 的任何内容。

    宁可使用 JSF 提供的迭代组件,例如 Tomahawk 的 t:dataTable,或 RichFaces 的 a4j:repeat,或 Facelets 的 ui:repeat,甚至可能是嵌套的 h:dataTable

    【讨论】:

      【解决方案2】:

      我记得由于在 getter/field 名称中使用所有大写字母或像您的案例 FTQ 一样,遇到了类似的问题,您是否尝试过将 item.FTQs 更改为 item.fTQs 或者甚至将您的 getter/setter 重命名为 Ftqs 并且使用 item.ftqs?

      【讨论】:

      • 感谢您的回复。编辑器省略了在 TaskListData 类中突出显示 FTQar 的 getter 和 setter。我现在已经完成了编辑。不过我应该问,getter/setter 并不是全部大写——但我知道你的意思——主要是大写。回到办公室后,我会尝试 getFtqs 和 setFtqs。
      • 好的,为了完整起见,eclipse 3.4 和 tomcat 6, jre 1.6 中的大小写没有任何区别。
      【解决方案3】:

      我猜这个问题源于使用&lt;c:forEach&gt;。 JSTL 标记并不总是能很好地与 JSF 标记配合使用,因为它们不会同时进行评估。试试&lt;a4j:repeat&gt;

      【讨论】:

      • 我尝试了&lt;a4j:repeat&gt; 标签,它导致我的浏览器挂起。我在使用其他 Richfaces 标签时遇到了同样的问题,但那是另一回事了。
      • 这似乎不太可能。您是否在无限循环中重复?
      • 不,我有控制台输出内容(上面列出),显示它应该只有 3 个条目。不过我想知道,当我试图输出 7 个提要的行时,其中一些有没有条目的 Ftq 数组,这会导致问题吗?在这种情况下我需要用一些东西填充 String[] Ftqs 吗?
      猜你喜欢
      • 2013-12-04
      • 1970-01-01
      • 2012-09-06
      • 2012-06-19
      • 2011-03-05
      • 1970-01-01
      • 2012-06-27
      • 2021-03-12
      • 2011-06-29
      相关资源
      最近更新 更多