代码之家  ›  专栏  ›  技术社区  ›  suszterpatt

getRowData()的确切语义?

  •  3
  • suszterpatt  · 技术社区  · 15 年前

    getRowData() 作品。我在网上搜索时发现,它返回一个数据表中的“当前选定行”,但我无法找出它是如何决定哪一行是选定行的。例如,我有一个数据表的代码:

    JSP格式:

      <h:dataTable value="#{backing_student.eligibleCoursesList}" var="cdto"
                         binding="#{backing_student.eligibleCoursesDataTable}"
                         id="eligibleCoursesDataTable" rules="all" frame="box"
                         border="2">
      <%-- 
                oracle-jdev-comment:Faces.RI.DT.Class.Key:hu.elte.pgy2.BACNAAI.UranEJB.CourseDTO
              --%>
        <h:column>
          <f:facet name="header">
            <h:outputText value="Kurzuskód"
                          binding="#{backing_student.outputText7}"
                          id="outputText7"/>
          </f:facet>
          <h:outputText value="#{cdto.cid}"/>
        </h:column>
        <!-- couple more plain text columns like the above -->
        </h:column>
        <h:column>
          <h:commandButton value="Felvétel"
                           actionListener="#{backing_student.addSelfToCourseListener}"/>
        </h:column>
      </h:dataTable>
    

    支撑豆:

    public class BackingStudent {
        private HtmlDataTable eligibleCoursesDataTable;
        private List<CourseDTO> eligibleCoursesList;
    
        // ...
    
        public void addSelfToCourseListener(ActionEvent actionEvent) {
            HtmlCommandButton thisButton = (HtmlCommandButton)actionEvent.getComponent();
            CourseDTO cdto = (CourseDTO)(eligibleCoursesDataTable.getRowData());
            thisButton.setValue(cdto.getCid());
        }
    }
    

    获取行数据()

    附加问题:为什么每个按钮的文本都会改变?

    2 回复  |  直到 15 年前
        1
  •  3
  •   McDowell rahul gupta    15 年前

    JSF标记导致在内存中构建组件树。例如 dataTable 标记由 UIData 实例 HtmlDataTable 是一个子类)。角色 UIData 是在 DataModel . 对于每个阶段 JSF lifecycle ,它将执行以下操作:

    //not the real code
    for(int i=0; i<model.getRowCount(); i++) {
      model.setRowIndex(i);
      Object row = model.getRowData();
      externalContext.getRequestMap().put(var, row);
      //invoke phase-specific action
      externalContext.getRequestMap().remove(var);
    }
    

    在你的情况下 var="cdto" ,这就是为什么使用EL解析到行bean的任何控件都将获得正确的值。

    构建组件树时, UIData公司 不为每行添加另一个子控件。它使用一组控件并更改基础模型数据。虽然 UIData公司 performs some actions to preserve child state HtmlCommandButton 因为它没有实现 EditableValueHolder .

    注意:您通常可以避免在必须导入任何 javax.faces... 将类放入模型bean中,但您必须在模型设计中考虑一点。

        2
  •  1
  •   gpeche    15 年前

    当您单击一行时,组件调用 DataModel.setRowIndex() ,它设置单击行的索引。 DataModel.getRowData() DataModel.getRowIndex() 指。

    推荐文章