2012-04-02 109 views
4

我在jsf 2.0中構建了一個WebApp,它是關於存儲信息並將其顯示在屏幕上的。所以我已經放入了一些「http://java.sun.com/jsf/html」dataTables來顯示一些列表。我的Java代碼返回一個List,然後在屏幕上顯示它們。但現在我必須按字母順序對列進行排序。我相信沒有建立這樣做的方式,所以我必須去其他地方尋找任務。如何對數據表中的列進行排序。 JSF 2.0

我碰到了This dataTables example,這真是太棒了,但我想我不能給它一個List並顯示列表。

我也遇到了BalusC's way of incorporating the sorting intot he DataTbal,這很好,我正在尋找這個,但也許有一個jQuery IU。

有沒有這樣的API可以滿足我的需求?你能指出我正確的方向,還是你建議?我真的想要一個我只是在Java交出清單,但如果我必須,我可以修改數據以符合JSON格式或其他一些...

+2

你想在客戶端(瀏覽器)或服務器端進行排序嗎? – edze 2012-04-02 08:08:16

回答

4

有幾個組件librarys頂部的jsf -2.0。

Primefaces例如有一個非常強大的datatable componentsorting/filtering選項。 Primefaces很容易集成到您的項目中,並附帶很多themes(或者您可以創建自己的主題)。

只要看看showcasedocumentation

其他受歡迎的組件庫是 Richfaces (按照不支持的註釋數據表排序)和Icefaces。

+1

PrimeFaces的+1。 RichFaces開發者拒絕添加一個簡單的排序選項。它一直在他們的吉拉像永遠,但沒有任何反應... – 2012-04-02 08:20:02

+0

primefaces看起來很穩固,我想我會給這個嘗試,但我已經下載了他們的網站上的包,但我沒有看到JAR文件任何地方。它說這是一個jar文件,但我沒有看到它。你們知道它在哪裏嗎? – Myy 2012-04-03 02:22:35

+0

找到了。感謝您的幫助 – Myy 2012-04-04 01:23:43

4

與原生<h:dataTable>你必須在你的託管bean中進行排序。你可以使用現有的擁有它們建立在這樣的JSF擴展庫:

  • MyFaces的戰斧 - docs
  • ICEfaces的 - docs
  • RichFaces的 - docs
  • PrimeFaces - docs
  • 等方式太許多人說。

但是,如果您不想使用上述工具包,那麼在託管bean中,您可以定義List和排序順序(asc或dec)。它可以像你想要的那樣簡單或複雜。

Ordering庫更改爲SortOrder庫中,參照此庫:import org.richfaces.component.SortOrder;

排序順序比較器可以以可變的編程方式使用<rich:column>屬性來定義:

private SortOrder sorting = SortOrder.unsorted; 

This is an example of using SortOrder programmatically using 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> 

現在你必須實現排序爲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); 
} 

你可以讓你的生活更輕鬆通過重用的東西,而不是爲每個專欄做這件事,我會讓你弄清楚。您可以使用更好的Java庫來幫助您完成比較,例如Google的Guava或Apache的Collection Commons

而不是做這一切,重新發明輪子的,使用一個框架,抽象出這一切對你來說,他們會讓你的生活更輕鬆的方式..

1

你可以做到這一點在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> 

或您的DataModel(擴展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完全相同。

UPDATE

從RichFaces的4.5開始也支持簡單排序的DataTable中(就像它在版本3.3.x)。

相關問題