Как отсортировать столбец в таблице данных. JSF 2.0 - PullRequest
4 голосов
/ 02 апреля 2012

Я создаю WebApp в jsf 2.0, и речь идет о хранении информации и ее отображении на экране. поэтому я добавил несколько * data-таблиц http://java.sun.com/jsf/html" для отображения некоторых списков. Мой Java-код возвращает список, а затем отображает их на экране. Но теперь мне нужно отсортировать столбцы по алфавиту. Я считаю, что нет встроенных способов сделать это так что я собираюсь поискать задачу в другом месте.

Я сталкивался Этот пример dataTables , это довольно круто, но я думаю, что не могу дать ему список и отобразить список.

Я также натолкнулся на способ BalusC включить сортировку в DataTbal , что неплохо, я ищу это, но, возможно, с использованием jQuery IU.

Существует ли такой API, который может удовлетворить мои потребности? Вы можете указать мне правильное направление, или вы предлагаете один? Мне бы очень хотелось, чтобы я просто передал список на Java, но если мне нужно, я могу изменить данные, чтобы они соответствовали формату JSON или другому ...

Ответы [ 3 ]

4 голосов
/ 02 апреля 2012

С нативным <h:dataTable> вы должны выполнить сортировку в своем управляемом бине. Вы можете использовать существующие библиотеки расширений JSF, в которые они встроены, например:

Но если вы не хотите использовать вышеуказанные наборы инструментов, то в управляемом компоненте вы определяете свой список и порядок сортировки (asc или dec). Это может быть так просто или сложно, как вы хотите.

Измените библиотеку Ordering на библиотеку SortOrder, ссылаясь на эту библиотеку: import org.richfaces.component.SortOrder;

Компаратор порядка сортировки может быть определен в переменной программно с помощью атрибута <rich:column>:

private SortOrder sorting = SortOrder.unsorted; 

Это пример программного использования SortOrder с использованием JSF 2.x / RichFaces 4.x . Он использует метод сортировки с тремя состояниями: несортированный (по умолчанию), восходящий и нисходящий, и реализуется путем установки атрибута sortOrder.

Или поведение компаратора по умолчанию может быть переопределено в коде, как в этом примере:

@ManagedBean(name="somebean")
@SessionScoped
public class OrderBean implements Serializable {
  private static final long serialVersionUID = ....;
  private List<Item> items;
  private boolean sortAscending;
  ...
}

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

<h:dataTable value="#{somebean.items}" var="i">
  <h:column>
    <f:facet name="header">
       <h:commandLink action="#{somebean.sort}"> Sort Column</h:commandLink>
    </f:facet>
    #{i.name}
  </h:column>
</h:dataTable>

Теперь вам нужно реализовать сортировку для вашего компонента с помощью базовых коллекций, опять же, она может быть настолько сложной, насколько вы можете:

private final Comparator NAME_SORT_ASC = new Comparator<Item>() {
    @Override
    public int compare(Item o1, Item o2) {
      return o1.getName().compareTo(o2.getName());
    }
  }
};

private final Comparator NAME_SORT_DESC = new Comparator<Item>() {
    @Override
    public int compare(Item o1, Item o2) {
      return o2.getName().compareTo(o1.getName());
    }
  }
};

public String sort() {
  Collections.sort(items, sortAscending ? NAME_SORT_ASC : NAME_SORT_DESC );
}

Вы можете упростить свою жизнь, используя вещи вместо того, чтобы делать это для каждого столбца, я позволю вам понять это. Вы можете использовать лучшие библиотеки для Java, чтобы помочь вам сделать компаратор, например, с Guava от Google или Collection Commons от Apache.

Вместо того, чтобы делать все это и заново изобретать колесо, используйте рамки, которые абстрагируют вас от всего этого, они облегчают вашу жизнь ..

4 голосов
/ 02 апреля 2012

Существует несколько библиотек компонентов поверх jsf-2.0.Например,

Primefaces имеет очень мощный компонент данных с сортировкой / фильтрацией параметров.Primefaces очень легко интегрировать в ваш проект и поставляется с большим количеством тем (или вы можете создать свою собственную тему).

Просто взгляните на витрина и документация .

Другие популярные библиотеки компонентов: Richfaces (в соответствии с сортировкой данных комментариев не поддерживается) и Icefaces.

1 голос
/ 15 октября 2013

Вы также можете сделать это в Richfaces .Richfaces 3.3.x поддерживает простую сортировку:

<rich:column sortable="true" sortBy="#{res.retailerCode}">
    <f:facet name="header">
        <h:outputText value="#{msg.retailerId}" />
    </f:facet>
    <h:outputText value="#{res.retailerCode}" />
</rich:column>

В Richfaces 4.x вы можете сортировать данные с использованием компонента сортировки:

<rich:column id="cardNumber" sortBy="#{res.instNumber}"
    sortOrder="#{cardholderSorting.cardNumberOrder}">
    <f:facet name="header">
        <a4j:commandLink value="#{msg.cardNumber}"
            action="#{cardholderSorting.sortByCardNumber}"
            render="cardholderTable" />
    </f:facet>
    <h:outputText value="#{res.cardNumber}" />
</rich:column>

или вашей модели данных (расширяет ExtendedDataModel):

<rich:column id="retailerCode" sortBy="#{rs.retailerCode}" sortOrder="ascending">
    <f:facet name="header">
        <h:commandLink value="#{msg.retailerId}" style="text-decoration: none; color:black;">
            <rich:componentControl target="retailerTable" operation="sort">
                <f:param name="column" value="retailerCode" />
                <f:param value="" />
                <f:param name="reset" value="true" />
            </rich:componentControl>
        </h:commandLink>
    </f:facet>
    <h:outputText value="#{rs.retailerCode}" />
</rich:column>

Вы можете добавить стрелки (для отображения порядка сортировки) внутри ссылки на команду, и это будет точно такое же представление, как в Richfaces 3.3.3.

ОБНОВЛЕНИЕ

Начиная с RichFaces 4.5, в dataTable поддерживается простая сортировка (как это было в версии 3.3.x).

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