2013-09-29 2 views
1

Я новичок в структуре Richfaces, которую я собираюсь использовать в ближайшем проекте в своей работе.rich: сортировка столбцов не может быть решена

Я создал простой пример, в котором у меня есть богатый: dataTable, и я пытаюсь сортировать столбцы. Я прочитал в учебнике (http://docs.jboss.org/richfaces/latest_3_3_X/en/devguide/html/rich_column.html), что все, что мне нужно, - это ввести параметр «sortBy» в тег «rich: column». К сожалению, столбцы не сортируются. Кто-нибудь может мне помочь? Ниже исходный код моего простого приложения:

<ui:composition xmlns="http://www.w3.org/1999/xhtml" 
xmlns:h="http://java.sun.com/jsf/html" 
xmlns:f="http://java.sun.com/jsf/core" 
xmlns:ui="http://java.sun.com/jsf/facelets" 
xmlns:a4j="http://richfaces.org/a4j" 
xmlns:rich="http://richfaces.org/rich"> 

<f:view> 
    <h:head></h:head> 
    <h:body> 
    <rich:panel header="Richfaces dataTable"> 
    <rich:dataTable value="#{TaskListBean.dataList}" var="dataItem" 
    rows="4" columnClasses="50,100,100,100" 
    onRowMouseOver="this.style.backgroundColor='#B5F3FB'" 
    onRowMouseOut="this.style.backgroundColor='#{a4jSkin.rowBackgroundColor}'" 
    width="350"> 

    <f:facet name="caption"> 
    <h:outputText value="This is the caption" /> 
    </f:facet> 

    <f:facet name="header"> 
    <h:outputText value="Trouble Ticket Systems" /> 
    </f:facet> 

    <rich:column colspan="4"> 
    <h:outputText value="Trouble Tickets opened" /> 
    </rich:column> 

    <rich:column sortBy="#{dataItem.taskInstanceId}"> 
    <f:facet name="header">Ticket Id</f:facet> 
    <h:outputText value="#{dataItem.taskInstanceId}" /> 
    </rich:column> 

    <rich:column sortBy="#{dataItem.taskNode}"> 
    <f:facet name="header">Status</f:facet> 
    <h:outputText value="#{dataItem.taskNode}" /> 
    </rich:column> 

    <rich:column sortBy="#{dataItem.actorId}"> 
    <f:facet name="header">Actor</f:facet> 
    <h:outputText value="#{dataItem.actorId}" /> 
    </rich:column> 

    <rich:column> 
    <f:facet name="header">Description</f:facet> 
    <h:outputText value="#{dataItem.description}" /> 
    </rich:column> 

    <f:facet name="footer"> 
    <h:outputText value="This is the footer" /> 
    </f:facet> 

    </rich:dataTable> 
    </rich:panel> 
    </h:body> 
</f:view> 

Menaged Bean моего приложения:

package richfacesr; 

import java.io.Serializable; 
import java.util.ArrayList; 
import java.util.List; 

import javax.faces.bean.ManagedBean; 

@ManagedBean(name = "manager") 
public class TaskListBean implements Serializable { 

private ArrayList dataList; 

public void loadDataList() { 

    dataList = new ArrayList(); 

    TaskListData data1 = new TaskListData(); 
    data1.setTaskInstanceId(1000l); 
    data1.setActorId("Willy smith"); 
    data1.setTaskNode("In Charge"); 
    data1.setDescription("CR 123456"); 

    TaskListData data2 = new TaskListData(); 
    data2.setTaskInstanceId(1001l); 
    data2.setActorId("Frank Sinatra"); 
    data2.setTaskNode("Rejected"); 
    data2.setDescription("CR 654321"); 

    dataList.add(data1); 
    dataList.add(data2); 

    } 

public List<TaskListData> getDataList() { 
    loadDataList(); 
    return dataList; 
    } 

} 

и объект:

package richfacesr; 
import java.util.ArrayList; 
import java.util.List;  

public class TaskListData { 
    private String taskNode; 
    private long taskInstanceId; 
    private String actorId; 
    private String description; 

    public String getActorId() { 
    return actorId; 
    } 
    public void setActorId(String actorId) { 
    this.actorId = actorId; 
    } 
    public String getTaskNode() { 
    return taskNode; 
    } 
    public void setTaskNode(String currentNode) { 
    this.taskNode = currentNode; 
    } 
    public String getDescription() { 
    return description; 
    } 
    public void setDescription(String description) { 
    this.description = description; 
    } 
    public long getTaskInstanceId() { 
    return taskInstanceId; 
    } 
    public void setTaskInstanceId(long taskInstanceId) { 
    this.taskInstanceId = taskInstanceId; 
    } 
} 
+0

Используете ли вы JSF 2.x и Richfaces 4.X или JSF 1.X и Richfaces 3.X? Я знаю, что вы разместили ссылку на документы Richfaces 3, но это может быть ошибка ... – cheffe

+0

Спасибо за ответ. Я знаю, что это другая версия JSF в учебнике, но я думал, что они совместимы с предыдущим ...? Я использую JSF 2.2 и версию Richface 5.0.0 Alpha1. Я работаю над Websphere и очень сложно настроить проект в своей среде, поэтому я создал его из архетипа Maven. Если у вас есть лучший архетип с окончательной версией Richfaces (предположим, что это будет решение для моей проблемы (?)), Это будет очень полезно :) –

+0

Собираетесь ли вы использовать этот проект в производстве? Если это так, я предлагаю откат к Richfaces 4. Так как Richfaces 5 все еще _alpha_, который даже не стабилен по производительности или этот проект будет работать более полугода? Тогда вы наверняка столкнетесь с выпуском RF 5. – cheffe

ответ

1

Taken from the Richfaces 4 documentation, построенный в сортировочный для DataTables не работает.

Встроенные элементы управления сортировкой доступны только с компонентом extendedDataTable. Поддержка встроенных элементов управления сортировкой в ​​компоненте dataTable будет добавлена ​​в следующую версию.

Он сделал work in Richfaces 3, но кажется, что они немного изменились, так что эта функция в настоящее время не работает в Richfaces 4, из коробки.

Хотя вы говорите, что используете Richfaces 5, который является Alpha1, я сомневаюсь, что эта функция уже присутствует. Поэтому вам нужно будет написать код для себя.

Глядя Richfaces 4 showcase about table sorting вам нужно

  • положить ваш управляемый компонент в ViewScope - в противном случае несортированный список будет создан снова и снова
  • переместить ваш loadDataList из getDataList() в constuctor или аннотировать его с @PostConstruct - в противном случае несортированный список будет создан снова и снова
  • сделать ваш TaskListData Serializable
  • Добавить способ сортировки в ваш TaskListBean - сделать сортировку там - может быть, как описано в Sort ArrayList of custom Objects by property
  • чеки name из вашего ManagedBean TaskListBean - в коде вы называете его manager, но в вашем XHTML вы называете его TaskListBean

Вот моим настроенным версия вашего XHTML

<f:view> 
    <h:head /> 
    <h:body> 
     <h:form> 
      <rich:dataTable id="table" var="dataItem" 
       value="#{manager.dataList}" width="350"> 

       <rich:column id="ticketId" sortBy="#{dataItem.taskInstanceId}"> 
        <f:facet name="header"> 
         <a4j:commandLink value="Ticket Id" render="table" 
          action="#{manager.sortBy('Ticket Id')}" /> 
        </f:facet> 
        <h:outputText value="#{dataItem.taskInstanceId}" /> 
       </rich:column> 

       <rich:column sortBy="#{dataItem.taskNode}"> 
        <f:facet name="header"> 
         <a4j:commandLink value="Status" render="table" 
          action="#{manager.sortBy('Status')}" /> 
        </f:facet> 
        <h:outputText value="#{dataItem.taskNode}" /> 
       </rich:column> 

       <rich:column sortBy="#{dataItem.actorId}"> 
        <f:facet name="header"> 
         <a4j:commandLink value="Actor" render="table" 
          action="#{manager.sortBy('Actor')}" /> 
        </f:facet> 
        <h:outputText value="#{dataItem.actorId}" /> 
       </rich:column> 

       <rich:column> 
        <f:facet name="header"> 
         <a4j:commandLink value="Description" render="table" 
          action="#{manager.sortBy('Description')}" /> 
        </f:facet> 
        <h:outputText value="#{dataItem.description}" /> 
       </rich:column> 

      </rich:dataTable> 
     </h:form> 
    </h:body> 
</f:view> 

Моя настроенная версия вашей TaskListBean

import java.io.Serializable; 
import java.util.*; 

import javax.annotation.PostConstruct; 
import javax.faces.bean.*; 

@ViewScoped 
@ManagedBean(name="manager") 
public class TaskListBean implements Serializable { 

    private ArrayList<TaskListData> dataList; 

    @PostConstruct 
    public void loadDataList() { 
     dataList = new ArrayList<TaskListData>(); 

     TaskListData data1 = new TaskListData(); 
     data1.setTaskInstanceId(1000l); 
     data1.setActorId("Willy smith"); 
     data1.setTaskNode("In Charge"); 
     data1.setDescription("CR 123456"); 

     TaskListData data2 = new TaskListData(); 
     data2.setTaskInstanceId(1001l); 
     data2.setActorId("Frank Sinatra"); 
     data2.setTaskNode("Rejected"); 
     data2.setDescription("CR 654321"); 

     dataList.add(data1); 
     dataList.add(data2); 

    } 

    public void sortBy(String aColumn) { 
     System.out.println("sort by: " + aColumn); 
     // TODO sort the list by that attribute 
    } 

    public List<TaskListData> getDataList() { 
     return dataList; 
    } 

} 
Смежные вопросы