Точная семантика getRowData ()? - PullRequest
3 голосов
/ 07 ноября 2010

Впервые использую JSF, и я немного растерялся из-за того, как работает 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>

Backing bean:

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());
    }
}

Это делает его таким, чтобы при каждом нажатии кнопкиКнопка в любой строке, текст всех кнопок изменяется на значение в первом столбце этой строки.Как именно getRowData() знает, какую строку выбрать из таблицы?

Дополнительный вопрос: почему меняется текст каждой кнопки?

Ответы [ 2 ]

3 голосов
/ 07 ноября 2010

Теги JSF заставляют дерево компонентов быть встроенным в память. Например, тег dataTable поддерживается экземпляром UIData (из которых HtmlDataTable является подклассом). Роль UIData заключается в переборе DataModel . Для каждой фазы жизненного цикла JSF он будет работать примерно так:

//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 выполняет некоторые действия для сохранения дочернего состояния , он не будет делать (по умолчанию) для экземпляров HtmlCommandButton , поскольку он не реализует EditableValueHolder .

Чтобы исправить эту проблему, используйте выражение EL для привязки значения к вашей модели (возможно, к какому-либо свойству bean-компонента).

Примечание. Как правило, вы можете избежать написания кода, в котором необходимо импортировать любые классы javax.faces... в компоненты вашей модели, но вы должны немного подумать над дизайном модели.

1 голос
/ 07 ноября 2010

Когда вы щелкаете по строке, компонент вызывает DataModel.setRowIndex(), которая устанавливает индекс по нажатой строке.DataModel.getRowData() извлекает данные строки, к которой относится DataModel.getRowIndex().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...