如何对dataTable中的列进行排序。JSF 2.0

Myy*_*Myy 4 javascript java sorting datatables jsf-2

我正在jsf 2.0中构建一个WebApp,它是关于存储信息并将其显示在屏幕上的。因此,我放入了一些“ http://java.sun.com/jsf/html”数据表来显示一些列表。我的Java代码返回一个列表,然后在屏幕上显示它们。但是现在我必须按字母顺序对列进行排序。我相信没有内置的方法可以执行此操作,因此我很乐意必须在其他地方查找该任务。

我遇到了这个dataTables示例,它非常棒,但是我想我不能给它一个List并显示该列表。

我还遇到了BalusC将排序合并到DataTbal中的方法,这很好,我正在寻找它,但也许使用jQuery IU。

有没有可以满足我需求的API?您能指出我正确的方向吗,还是您建议一个方向?我真的想要一个我只用Java提交的列表,但是如果必须的话,我可以修改数据以符合JSON格式或其他格式。

Moh*_*our 5

使用本机,<h:dataTable>您必须自己在托管bean中进行排序。您可以使用内置了它们的现有JSF扩展库,例如:

但是,如果您不想使用上述工具包,则可以在托管bean中定义列表和排序顺序(asc或dec)。您可以根据需要简单或复杂。

Ordering库更改为该库SortOrder,并引用该库: import org.richfaces.component.SortOrder;

排序顺序比较器可以使用<rich:column>属性以编程方式在变量中定义:

private SortOrder sorting = SortOrder.unsorted; 
Run Code Online (Sandbox Code Playgroud)

这是使用JSF 2.x / RichFaces 4.x以编程方式使用SortOrder的示例。它使用三态排序方法:未排序(默认),升序和降序,并通过设置sortOrder属性来实现。

或者可以在代码中覆盖比较器的默认行为,如以下示例所示:

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

在您的视图中,定义要与之进行排序的标题,因此添加一个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>
Run Code Online (Sandbox Code Playgroud)

现在,您必须使用基本集合为bean实现排序,同样,它可以变得尽可能复杂:

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 );
}
Run Code Online (Sandbox Code Playgroud)

您可以通过重用资料而不是在每一列中都这样来简化您的生活,我将为您解决这一问题。您可以使用更好的Java库来帮助您进行比较,例如使用Google的Guava或Apache的Collection Commons

与其做所有事情并重新发明轮子,不如使用为您抽象化所有这些的框架,它们使您的生活更轻松。