?如何创建记录分页?(JSF)

?如何创建记录分页?(JSF),jsf,pagination,Jsf,Pagination,我正在用Java服务器做一个酒店房间预订页面。我有一个包含酒店搜索的基本模板,还有一个显示结果的索引模板。我把所有的酒店都放在头版,就像封面一样。我只展示了9家酒店,这样它们就不会溢出分区的酒店: 好的,我总共只有10家酒店在数据库中注册。。。。我想对我的页面进行分页,每页仅显示9家酒店。。。。这样做的结果是,由于数据库中有10家酒店,因此在下一页中,我只能看到1家酒店 这是我的索引页: <?xml version='1.0' encoding='UTF-8' ?> <!DO

我正在用Java服务器做一个酒店房间预订页面。我有一个包含酒店搜索的基本模板,还有一个显示结果的索引模板。我把所有的酒店都放在头版,就像封面一样。我只展示了9家酒店,这样它们就不会溢出分区的酒店:

好的,我总共只有10家酒店在数据库中注册。。。。我想对我的页面进行分页,每页仅显示9家酒店。。。。这样做的结果是,由于数据库中有10家酒店,因此在下一页中,我只能看到1家酒店

这是我的索引页:

<?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:ui="http://xmlns.jcp.org/jsf/facelets"
  xmlns:h="http://xmlns.jcp.org/jsf/html"
  xmlns:f="http://xmlns.jcp.org/jsf/core">
<f:metadata>
    <f:viewAction action="#{buscador.cargarPortada()}"/>
</f:metadata>
<body>

    <ui:composition template="./templates/base.xhtml">

        <ui:define name="content">
            <h:form id="form2">
                <h:dataTable value="#{buscador.display}" var="res">
                 <h:column>
                     <h:outputLabel value="#{res.a}" escape="false"/>
                 </h:column>                    
                 <h:column>
                      <h:outputLabel value="#{res.b}" escape="false"/> 
                 </h:column>
                 <h:column>
                     <h:outputLabel value="#{res.c}" escape="false"/>
                 </h:column>
                </h:dataTable>
            </h:form>
        </ui:define>

    </ui:composition>

</body>
在这个类中,我将加载页面的封面并执行搜索:

    package Beans;

import Clases.DisplayResult;
import Clases.ResultElement;
import javax.inject.Named;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import java.sql.ResultSet;
import Database.GestorDB;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
 *
 * @author SEMINARIO
 */
@Named(value = "portada")
@ManagedBean
@ViewScoped
public class Buscador {
     private String fechaE, fechaS, localidad;
    private int personas;
    private static ArrayList<DisplayResult> displayList;
    private ArrayList<String> aux = new ArrayList<>();   
    public Buscador() {
       displayList = new ArrayList<>();
    }

    public String getFechaE() {
        return fechaE;
    }

    public void setFechaE(String fechaE) {
        this.fechaE = fechaE;
    }

    public String getFechaS() {
        return fechaS;
    }

    public void setFechaS(String fechaS) {
        this.fechaS = fechaS;
    }

    public String getLocalidad() {
        return localidad;
    }

    public void setLocalidad(String localidad) {
        this.localidad = localidad;
    }

    public int getPersonas() {
        return personas;
    }

    public void setPersonas(int personas) {
        this.personas = personas;
    }

    public ArrayList<DisplayResult> getDisplay() {
        return displayList;
    }

    public void setDisplay(ArrayList<DisplayResult> listaResultado) {
        Buscador.displayList = listaResultado;
    }

    public void agregarResultado(DisplayResult resultado){
        Buscador.displayList.add(resultado);
    }

    public void limpiarResultados(){
        Buscador.displayList.clear();
        aux.clear();
    }

    public void calibrar(){
        do{           
            if(aux.size()%3 != 0)
               aux.add("");
        }while(aux.size()%3 != 0);
    }    

    public void cargarPortada(){       
        try{
            ResultSet rs = GestorDB.getConsulta("SELECT HOTELES.NOMBRE AS A, HOTELES.IMGHOTEL, LOCALIDADES.NOMBRE AS B FROM HOTELES INNER JOIN LOCALIDADES"
                + " ON LOCALIDADES.IDLOCALIDADES = HOTELES.LOCALIDADES_IDLOCALIDADES FETCH FIRST 9 ROWS ONLY");
            while(rs.next()){
               ResultElement res = new ResultElement(rs.getString("A"), rs.getString("IMGHOTEL"),rs.getString("B"));
               aux.add(res.getDisplay());
            }  
            calibrar();
            for(int i = 0; i < aux.size(); i+=3){
                DisplayResult obj = new DisplayResult(aux.get(i),aux.get(i+1),aux.get(i+2));
                displayList.add(obj);
            }
        } catch (SQLException ex) {
            Logger.getLogger(Buscador.class.getName()).log(Level.SEVERE, null, ex);
        }       
    }
}
我想用我的arrayList控制页面的分页,但事实是我不知道如何将它放在dataTable中


有没有一种简单实用的方法可以做到这一点?

原生JSF不支持/没有用于分页的组件。
您可以选择一个组件库,如,它有一个分页组件,如。

我不知道您是否能够使用第三方库,但我想这正是您想要的。除此之外,还有一些提示:不要同时使用@Named和@ManagedBean,或者两者都可以。ResultElement类中嵌入的HTML代码看起来很凌乱,我宁愿在facelet文件中使用HTML,而@Named是这两种代码中更具前瞻性的一种。我会确保JSF“控制器”中没有SQL。。。看到了吗。。。像那个超级摩托车手!也谢谢你的提示:我不会说没有支持。JSF本身专注于呈现HTML代码,分页是一个超出这个范围的特性。但是,它可能很容易由您自己实现。
package Clases;

public class DisplayResult {
private String A, B, C;

public DisplayResult(String a, String b, String c){
    A = a;
    B = b;
    C = c;
}
/**
 * @return the A
 */
public String getA() {
    return A;
}

/**
 * @param A the A to set
 */
public void setA(String A) {
    this.A = A;
}

/**
 * @return the B
 */
public String getB() {
    return B;
}

/**
 * @param B the B to set
 */
public void setB(String B) {
    this.B = B;
}

/**
 * @return the C
 */
public String getC() {
    return C;
}

/**
 * @param C the C to set
 */
public void setC(String C) {
    this.C = C;
}

}
    package Beans;

import Clases.DisplayResult;
import Clases.ResultElement;
import javax.inject.Named;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import java.sql.ResultSet;
import Database.GestorDB;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
 *
 * @author SEMINARIO
 */
@Named(value = "portada")
@ManagedBean
@ViewScoped
public class Buscador {
     private String fechaE, fechaS, localidad;
    private int personas;
    private static ArrayList<DisplayResult> displayList;
    private ArrayList<String> aux = new ArrayList<>();   
    public Buscador() {
       displayList = new ArrayList<>();
    }

    public String getFechaE() {
        return fechaE;
    }

    public void setFechaE(String fechaE) {
        this.fechaE = fechaE;
    }

    public String getFechaS() {
        return fechaS;
    }

    public void setFechaS(String fechaS) {
        this.fechaS = fechaS;
    }

    public String getLocalidad() {
        return localidad;
    }

    public void setLocalidad(String localidad) {
        this.localidad = localidad;
    }

    public int getPersonas() {
        return personas;
    }

    public void setPersonas(int personas) {
        this.personas = personas;
    }

    public ArrayList<DisplayResult> getDisplay() {
        return displayList;
    }

    public void setDisplay(ArrayList<DisplayResult> listaResultado) {
        Buscador.displayList = listaResultado;
    }

    public void agregarResultado(DisplayResult resultado){
        Buscador.displayList.add(resultado);
    }

    public void limpiarResultados(){
        Buscador.displayList.clear();
        aux.clear();
    }

    public void calibrar(){
        do{           
            if(aux.size()%3 != 0)
               aux.add("");
        }while(aux.size()%3 != 0);
    }    

    public void cargarPortada(){       
        try{
            ResultSet rs = GestorDB.getConsulta("SELECT HOTELES.NOMBRE AS A, HOTELES.IMGHOTEL, LOCALIDADES.NOMBRE AS B FROM HOTELES INNER JOIN LOCALIDADES"
                + " ON LOCALIDADES.IDLOCALIDADES = HOTELES.LOCALIDADES_IDLOCALIDADES FETCH FIRST 9 ROWS ONLY");
            while(rs.next()){
               ResultElement res = new ResultElement(rs.getString("A"), rs.getString("IMGHOTEL"),rs.getString("B"));
               aux.add(res.getDisplay());
            }  
            calibrar();
            for(int i = 0; i < aux.size(); i+=3){
                DisplayResult obj = new DisplayResult(aux.get(i),aux.get(i+1),aux.get(i+2));
                displayList.add(obj);
            }
        } catch (SQLException ex) {
            Logger.getLogger(Buscador.class.getName()).log(Level.SEVERE, null, ex);
        }       
    }
}