DataTable's con AJAX en JSF

Este es mi primer post, espero que sea de su agrado y utilidad, cualquier duda o sugerencia no duden en hacermela, gracias

Cuando trabajamos con DataTable's en JSF suele suceder que la cantidad de datos es tan grande que tenemos que hacer pequeños metodos de paginacion para poder navegar en los datos "por partes", sin embargo, una desventaja que esto podria ocasionar, es que cada que queremos cambiar el intervalo de datos que queremos visualizar (ya sea con un boton "siguiente", "anterior", etc) la pagina se tiene que recargar, lo cual podria ser bastante molesto para nuestros usuarios, o incluso si se tienen otros elementos de los cuales no se desea perder el contenido (como un formulario por ejemplo). Para resolver dicha desventaja utilizaremos una libreria de tags que trabajan con AJAX denominada "a4j", dicha libreria es desarrollada por RichFaces. Como primer paso, lo mas seguro es que no contemos con dichas librerias, por lo cual habra que descargarlas de la siguiente pagina, donde viene tambien como poder integrar estas librerias a netbeans para poder trabajarlas.

http://eos87.blogspot.com/2008/01/richfaces-netbeans-6-tomcat-6-ajax4jsf...

Ahora viene lo divertido, hagamos el codigo....

codigo para el jsp:

<!--Incluimos las librerias de RichFaces--!>  

<%@taglib prefix="rich" uri="http://richfaces.org/rich"%>
<%@taglib prefix="a4j" uri="http://richfaces.org/a4j"%>

<!-- Esta seccion es la de una tabla normal en JSF--!>  

<h:form>
            <h:outputText id="Estaciones" styleClass="Etiqueta"/>
            <h:dataTable id="tableEstaciones" value="#{ControladorMestacion.estaciones}" var="estacion" border="0" cellpadding="2" cellspacing="0" rules="all" style="border:solid 1px" headerClass="cabeceras" rowClasses="rowpar,rowimpar" footerClass="pies">
                   <f:facet name="header">
                                <h:outputText value="Estaciones"/>
                   </f:facet>
                    <h:column>
                            <f:facet name="header">
                                <h:outputText value="Direccion MAC"/>
                            </f:facet>
                            <h:outputText value="#{estacion.macMest}"/>
                    </h:column>
                    <h:column>
                            <f:facet name="header">
                                <h:outputText value="Status"/>
                            </f:facet>
                            <h:outputText value="#{estacion.status}"/>
                    </h:column>
                    <h:column>
                        <f:facet name="header">
                                <h:outputText value="Ver"/>
                            </f:facet>
                        <h:commandLink action="#{ControladorMestacion.prepareView}">
                            <h:graphicImage value="img/consultar.JPG" height="30" width="30"/>
                        </h:commandLink>
                    </h:column>
                    </h:dataTable>
</h:form>

<!--Ahora viene lo importante, los botones de navegacion. Utilizaremos un form y un commandLink pero de la libreria a4j--!>  

            <a4j:form>                    
                <h:panelGrid id="botones" columns="3" columnClasses="rowpar,rowimpar">
                            <!--AQUI ES LA PARTE IMPORTANTE, EL commandLink DE a4j INCLUYE EL PARAMETRO "reRender" QUE ES EL ENCARGADO DE
                             CARGAR UNICAMENTE LA PARTE QUE NOSOTROS LE ESPECIFIQUEMOS, EN ESTE CASO YO QUIERO QUE SE ACTUALIZE LA TABLA DE DATOS LLAMADA "tableEstaciones" Y EL PANEL QUE CONTIENE LOS BOTONES, YA QUE SI NO HAY MAS DATOS, EL BOTON SIGUIENTE DEBE DESAPARECER,Y VICEVERSA--!>
                            <a4j:commandLink reRender="tableEstaciones,botones" action="#{ControladorMestacion.previous}" rendered="#{ControladorMestacion.hasPreviousPage}">
                                <h:graphicImage value="img/previous.png"/>
                 
                            </a4j:commandLink>

                            <h:outputLink value="#" styleClass="pies">
                                <h:outputText value="Ver todos"/>
                            </h:outputLink>

                            <a4j:commandLink reRender="tableEstaciones,botones" action="#{ControladorMestacion.next}" rendered="#{ControladorMestacion.hasNextPage}">
                                <h:graphicImage value="img/next.png"/>
                 
                            </a4j:commandLink>
                       </h:panelGrid>
                   
              </a4j:form>

Y este es el codigo del bean:

package Controlador;
import DAO.DAOMestacion;
import POJO.Mestacion;
import javax.faces.model.DataModel;
import javax.faces.model.ListDataModel;

/**
 *
 * @author RVP19
 */

public class ControladorMestacion {

    int startId;
    int endId;
    DataModel estaciones;
    DAOMestacion daome;
    private int recordCount;
    private int pageSize = 3;
    private Mestacion current;

    private int selectedItemIndex;
    /** Creates a new instance of ControladorMestacion */
    public ControladorMestacion() {
         daome = new DAOMestacion();
         startId=1;
         endId=3;
         recordCount = daome.getCantidadEstaciones()+2;
    }

    public ControladorMestacion(int ini,int fin) {
         daome = new DAOMestacion();
         startId=ini;
         endId=fin;
         recordCount = daome.getCantidadEstaciones()+2;
    }

    public Mestacion getSelected() {
        if (current == null) {
            current = new Mestacion();
                selectedItemIndex = -1;
        }
        return current;
    }

    public DataModel getEstaciones() {
        if (estaciones == null) {
            estaciones = new ListDataModel(daome.getEstaciones(startId,endId));
        }
        return estaciones;
    }

        void recreateModel() {
        estaciones = null;
    }

    public boolean isHasNextPage() {
        if (endId + pageSize <= recordCount) {
            return true;
        }
        return false;
    }

    public boolean isHasPreviousPage() {
        if (startId-pageSize > 0) {
            return true;
        }
        return false;
    }

    public void next() {
        startId = endId+1;
        endId = endId + pageSize;
        recreateModel();
    }

    public void previous() {
        startId = startId - pageSize;
        endId = endId - pageSize;
        recreateModel();
    }

    public int getPageSize() {
        return pageSize;
    }

    public String prepareView(){
        current = (Mestacion) getEstaciones().getRowData();
        return "Estacion";
    }
    public String prepareList(){
        recreateModel();
        return "Estado";
    }

}