一尘不染

在JSF中支持bean String []访问

jsp

首先,很抱歉,如果您参与了我最近的问题。由于这不是讨论论坛,而且评论数量有限,所以我的最后希望是用实际代码提出一个具体问题,以期我能以某种方式解决问题的深处。

好。我有一个名为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


阅读 276

收藏
2020-06-08

共1个答案

一尘不染

首先,JSTL和JSF不能像您期望的那样在编码中无缝同步同步工作。更重要的是,JSTL JSF加入 之前先
运行。实际上,JSTL首先从上到下处理整个页面,然后将生成的输出(因此, 没有
任何JSTL标签,但带有生成的输出)移交给JSF,后者依次再次从上到下处理整个页面。

由于h:dataTableJSTL运行时尚未生成任何行,因此您不会从c:forEach内看到任何内容h:column

而是使用JSF提供的迭代组件,例如Tomahawk t:dataTable或RichFaces a4j:repeat或Facelets
ui:repeat,甚至是nested h:dataTable

2020-06-08