Jsf rich:列排序可以';无法解决

Jsf rich:列排序可以';无法解决,jsf,richfaces,Jsf,Richfaces,我是Richfaces框架的新手,我将在我工作中最近的项目中使用它 我创建了一个简单的例子,其中包含rich:dataTable,并尝试对列进行排序。我在教程()中读到,我需要的一切就是在“rich:column”标记中键入“sortBy”参数。不幸的是,无法对列进行排序。有人能帮我吗?下面是我的简单应用程序的源代码: <ui:composition xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/

我是Richfaces框架的新手,我将在我工作中最近的项目中使用它

我创建了一个简单的例子,其中包含rich:dataTable,并尝试对列进行排序。我在教程()中读到,我需要的一切就是在“rich:column”标记中键入“sortBy”参数。不幸的是,无法对列进行排序。有人能帮我吗?下面是我的简单应用程序的源代码:

<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>
,数据表的内置排序不起作用

内置排序控件仅在extendedDataTable组件中可用。dataTable组件中对内置排序控件的支持将在后续版本中添加

确实是这样,但它们似乎有了一些改变,所以这个特性目前在RichFaces4中不起作用

虽然你说你使用的是RichFaces5,也就是Alpha1,但我怀疑这个功能是否已经存在。因此,您需要为自己编写一些代码

看起来像你需要的那样

  • 将托管bean放入ViewScope-否则将一次又一次地创建未排序的列表
  • loadDataList
    getDataList()
    移到构造函数中,或使用
    @PostConstruct
    对其进行注释-否则将一次又一次地创建未排序的列表
  • 使您的
    TaskListData
    可序列化
  • 将排序方法添加到
    TaskListBean
    -在那里进行排序-可能如中所述
  • 检查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;
    }

}
import java.io.Serializable;
导入java.util.*;
导入javax.annotation.PostConstruct;
导入javax.faces.bean.*;
@视域
@ManagedBean(name=“manager”)
公共类TaskListBean实现了可序列化{
私有ArrayList数据列表;
@施工后
公共void loadDataList(){
dataList=newarraylist();
TaskListData data1=新TaskListData();
data1.setTaskInstanceId(1000l);
数据1.setActorId(“Willy smith”);
data1.setTaskNode(“负责人”);
数据1.设置说明(“CR 123456”);
TaskListData data2=新TaskListData();
数据2.setTaskInstanceId(1001l);
数据2.setActorId(“Frank Sinatra”);
data2.setTaskNode(“已拒绝”);
数据2.setDescription(“CR 654321”);
dataList.add(data1);
dataList.add(data2);
}
公共无效排序(字符串A列){
System.out.println(“排序依据:+aColumn”);
//TODO按该属性对列表进行排序
}
公共列表getDataList(){
返回数据列表;
}
}

您使用的是JSF 2.x和Richfaces 4.x还是JSF 1.x和Richfaces 3.x?我知道你发了一个到RichFaces3文档的链接,但那可能是个错误…谢谢你的回答,伙计。我知道这是教程中JSF的另一个版本,但我认为它们与前一个兼容。。。?我正在使用JSF2.2和RichFaces5.0.0Alpha1版本。我在Websphere上工作,很难在其环境中配置项目,所以我从Maven原型创建了一个。如果您有更好的原型和最终版本od Richfaces(假设它将是我的问题的解决方案(?),它将非常感谢:)您将在生产中使用该项目吗?如果是这样,我建议回滚到RichFaces4。由于Richfaces 5仍然是alpha,甚至还没有接近生产稳定,或者该项目将运行半年以上?那么你肯定会面临RF 5的发布。
<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>
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;
    }

}