Почему эта функция dataTable sortBy не работает? - PullRequest
1 голос
/ 30 марта 2011

Я продолжаю пытаться исправить функцию sortBy этого dataTable (компонент Primefaces), но я просто не могу понять, почему он не работает, когда другие функции, такие как разбиение на страницы или фильтр, работают правильно. Для этого dataTable мне просто нужно передать массив для его атрибута тега под названием «значение», а также один объект того же типа массива для атрибута тега под названием «var». Ниже я опубликую свой код.

Это страница JSF с таблицей данных

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:t="http://myfaces.apache.org/tomahawk"
xmlns:p="http://primefaces.prime.com.tr/ui">
    <ui:composition template="WEB-INF/templates/BasicTemplate.xhtml">
<ui:define name="resultsForm">
<h:form enctype="multipart/form-data">
    <h:inputText id="search" value="" /><h:commandButton value="search"/>

    <p:dataTable var="garbage" value="#{resultsController.allGarbage}" dynamic="true" paginator="true" paginatorPosition="bottom" rows="10"  
             paginatorTemplate="{CurrentPageReport}  {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"  
             rowsPerPageTemplate="5,10,15">         

            <p:column filterBy="#{garbage.filename}" filterMatchMode="startsWith" sortBy="#{garbage.filename}" parser="string">  
            <f:facet name="header">  
            <h:outputText value="Filename" />  
            </f:facet>  
            <h:outputText value="#{garbage.filename}" />
             </p:column> 

            <p:column filterBy="#{garbage.description}" filterMatchMode="contains">  
            <f:facet name="header">  
            <h:outputText value="Description" />  
            </f:facet>  
            <h:outputText value="#{garbage.description}" />  
             </p:column> 

            <p:column sortBy="#{garbage.uploadDate}" parser="string">  
            <f:facet name="header">  
            <h:outputText value="Upload date" />  
            </f:facet>  
            <h:outputText value="#{garbage.uploadDate}" /> 
             </p:column>                
    </p:dataTable> 
</h:form>
</ui:define>

Здесь управляемый компонент, взаимодействующий с этой страницей:

@ManagedBean
@RequestScoped
public class ResultsController {

@EJB
private ISearchEJB searchEJB;

private Garbage garbage;

public List<Garbage> getAllGarbage() {
    return searchEJB.findAllGarbage();
}

public Garbage getGarbage() {
    return garbage;
}

public void setGarbage(Garbage garbage) {
    this.garbage = garbage;
}   

EJB, который обращается к базе данных:

@Stateless(name = "ejbs/SearchEJB")
public class SearchEJB implements ISearchEJB {

@PersistenceContext
private EntityManager em;   
public List<Garbage> findAllGarbage() {
    Query query = em.createNamedQuery("findAllGarbage");
    List<Garbage> gList = new ArrayList<Garbage>();

    for (Object o : query.getResultList()) {
        Object[] cols = (Object[]) o;
        Garbage tmpG = new Garbage();
        tmpG.setFilename(cols[0].toString());
        tmpG.setDescription(cols[1].toString());
        tmpG.setUploadDate(cols[2].toString());

        gList.add(tmpG);
    }
    return gList;
}

}

Сущность с использованием именованного запроса JPQL:

    @NamedQuery(name = "findAllGarbage", query = "SELECT g.filename, g.description,    g.uploadDate FROM Garbage g;")
    @Entity
    public class Garbage {

@Id
@GeneratedValue
@Column(nullable = false)
private Long id;
@Column(nullable = false)
private String filename;
@Column(nullable = false)
private String fileType;
@Column(nullable = false)
private String uploadDate;
@Column(nullable = false)
private String destroyDate;
@Lob
@Column(nullable = false)
private byte[] file;
@Column(nullable = false)
private String description;

Экран печати с выводом из браузера

enter image description here

Вывод на консоль при обновлении страницы (SEVERE: в строке 1:61 нет реальной альтернативы символу ';'):

enter image description here

Ответы [ 2 ]

3 голосов
/ 30 марта 2011

Измените область действия ResultsController на @ViewScoped. ResultsController и объект Garbage должны будут реализовать java.io.Serializable.


Может быть, это поможет. Ниже мой код, который я получил на работу:

index.xhmtl

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:p="http://primefaces.prime.com.tr/ui">
    <f:view contentType="text/html" >
        <h:head>
            <title>PrimeFacesTest</title>
        </h:head>
        <h:body>
            <h:form>
                <p:dataTable var="garbage" value="#{indexBean.allGarbage}"
                             dynamic="true" paginator="true" paginatorPosition="bottom" rows="4"
                             paginatorTemplate="{CurrentPageReport}  {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"
                             rowsPerPageTemplate="5,10,15">

                    <p:column filterBy="#{garbage.filename}" filterMatchMode="startsWith" sortBy="#{garbage.filename}" >
                        <f:facet name="header">
                            <h:outputText value="Filename" />
                        </f:facet>
                        <h:outputText value="#{garbage.filename}" />
                    </p:column>

                    <p:column filterBy="#{garbage.description}" filterMatchMode="contains"   >
                        <f:facet name="header">
                            <h:outputText value="Description" />
                        </f:facet>
                        <h:outputText value="#{garbage.description}" />
                    </p:column>

                    <p:column sortBy="#{garbage.uploadDate}" parser="string">
                        <f:facet name="header">
                            <h:outputText value="Upload date" />
                        </f:facet>
                        <h:outputText value="#{garbage.uploadDate}" />
                    </p:column>
                </p:dataTable>

            </h:form>

        </h:body>
    </f:view>
</html>

IndexBean.java

@ManagedBean
@ViewScoped
public class IndexBean implements Serializable {

    private ArrayList allGarbage;

    public IndexBean() {
        allGarbage = new ArrayList();
        allGarbage.add(new Garbage("Abc", "Abc", "28/03/2011 12:13:32"));
        allGarbage.add(new Garbage("Bbc;", "bbc", "28/03/2011 12:14:32"));
        allGarbage.add(new Garbage("Cbc", "Cbc", "28/03/2011 12:17:32"));
        allGarbage.add(new Garbage("1Abc", "1Abc", "28/03/2011 12:13:32"));
        allGarbage.add(new Garbage("2Bbc;", "2bbc", "28/03/2011 12:14:32"));
        allGarbage.add(new Garbage("3Cbc", "3Cbc", "28/03/2011 12:17:32"));
        allGarbage.add(new Garbage("4Abc", "4Abc", "28/03/2011 12:13:32"));
        allGarbage.add(new Garbage("5Bbc;", "5bbc", "28/03/2011 12:14:32"));
        allGarbage.add(new Garbage("6Cbc", "6Cbc", "28/03/2011 12:17:32"));
    }

    public ArrayList getAllGarbage() {
        return allGarbage;
    }

}

Garbage.java

public class Garbage implements Serializable {

    private String filename;
    private String description;
    private String uploadDate;

    public Garbage(String filename, String description, String uploadDate) {
        this.filename = filename;
        this.description = description;
        this.uploadDate = uploadDate;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public String getFilename() {
        return filename;
    }

    public void setFilename(String filename) {
        this.filename = filename;
    }

    public String getUploadDate() {
        return uploadDate;
    }

    public void setUploadDate(String uploadDate) {
        this.uploadDate = uploadDate;
    }

}
0 голосов
/ 11 июня 2013

Этот ответ немного запоздал, но я надеюсь, что он поможет другим. У меня была такая же проблема на Java7, JSF2 с Primefaces 4, и мое исправление состояло в том, чтобы инициализировать ArrayList <> при создании Бина. В противном случае функция сортировки не может отсортировать данные и работает как описано, только если что-то отфильтровано ранее.

Таким образом, Боб будет выглядеть так:

@ManagedBean
@ViewScoped
public class IndexBean implements Serializable {

private ArrayList<Garbage> allGarbage;

@PostConstuct
public init() 
{
    allGarbage = new ArrayList<Garbage>();
    allGarbage.add(new Garbage("Abc", "Abc", "28/03/2011 12:13:32"));
    allGarbage.add(new Garbage("Bbc;", "bbc", "28/03/2011 12:14:32"));
    allGarbage.add(new Garbage("Cbc", "Cbc", "28/03/2011 12:17:32"));
    allGarbage.add(new Garbage("1Abc", "1Abc", "28/03/2011 12:13:32"));
    allGarbage.add(new Garbage("2Bbc;", "2bbc", "28/03/2011 12:14:32"));
    allGarbage.add(new Garbage("3Cbc", "3Cbc", "28/03/2011 12:17:32"));
    allGarbage.add(new Garbage("4Abc", "4Abc", "28/03/2011 12:13:32"));
    allGarbage.add(new Garbage("5Bbc;", "5bbc", "28/03/2011 12:14:32"));
    allGarbage.add(new Garbage("6Cbc", "6Cbc", "28/03/2011 12:17:32"));
}

public ArrayList<Garbage> getAllGarbage() 
{
    return allGarbage;
}

public void setAllgarbage(ArrayList<Garbage> garbage)
{
    this.allGarbage = garbage;
}

}

Вам больше не нужны атрибуты FilterBy и FilterMatchMode.

...