tutorial mvc framework example etiquetas español ejemplo concepto bean jsf pagination managed-bean

mvc - jsf tutorial español



¿Cómo llamar a un método de bean administrado desde un enlace de salida? (1)

Esto puede haber sido cubierto en algún lado, pero estoy teniendo problemas para formar la pregunta para el motor de búsqueda y no hay avances de productos hasta el momento.

Estoy trabajando en una página que actúa como vista de entidad. Muchos de los resultados provienen de la base de datos y solo se muestran un puñado a la vez. Entonces, pueden imaginarse que quiero construir una lista de enlaces que lleve al usuario a otra página de entidades. Este es todo mi código, sin PrimeFaces ni ninguna otra solución de paginación ingeniosa de front-end. Por ahora.

Para el código:

@Named @SessionScoped public class ArticleIndexBean { List<Article> articleList=new ArrayList<>(); List<Article> articleSubList=new ArrayList<>(); @PostConstruct public void loadScreenSupport() { search(); toEntityPage(1); } protected void search() { // this method sets articleList which is the full list fetched from the database } public void toEntityPage(int pageNumber) { // this method sets articleSubList which is a subset of articleList }

Cada enlace de página necesita llamar a toEntiyPage(n) . Conozco CommandLink, pero quiero evitar una solicitud POST. Además, el bean tiene actualmente un ámbito de sesión e intentaré que la conversación se amplíe posteriormente. Ciertamente NO será un ámbito de solicitud, ya que no quiero hacer una búsqueda completa de db cada vez que un usuario quiera saltar a otra página. Entonces, @PostConstruct tampoco ayudará.

Entonces, con un menú como este: 1 * 2 * 3 * 4 * 5 ¿cómo puedo codificar un enlace de salida o cualquier otro tipo de enlace que llame a mi ArticleIndexBean.toEntityPage(int) través de una solicitud GET?

Solución

Basado en la información de Laurent, agregué una propiedad currentEntityPageNumber y un método toCurrentEntityPage() a mi bean. El toCurrentEntityPage() simplemente llama toEntityPage(getCurrentEntityPageNumber()) .

<html lang="en" 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" > <f:metadata> <f:viewParam name="pn" value="#{articleIndexBean.currentEntityPageNumber}" /> <f:event type="preRenderView" listener="#{articleIndexBean.toCurrentEntityPage()}" /> </f:metadata> <c:forEach var="pageNumber" begin="1" end="${articleIndexBean.getEntityPageCount()}"> <h:outputLink value="ar_index.xhtml"> <h:outputText value="${pageNumber}" /> <f:param name="pn" value="${pageNumber}" /> </h:outputLink> </c:forEach>

Sin duda sería mejor si pudiéramos llamar toEntityPage(pageNumber) a toEntityPage(pageNumber) pero esto funciona bien.


Suponiendo que está utilizando JSF 2.2, podría usar viewParam para recuperar la página en los parámetros GET y viewAction para llamar a un método antes de la representación (realmente llamado en la fase INVOKE_APPLICATION por defecto).

Facelets:

<f:metadata> <f:viewParam name="page" value="#{articleIndexBean.entityPage}" /> <f:viewAction action="#{articleIndexBean.loadScreenSupport}" /> </f:metadata>

Si está utilizando JSF 2.0 o JSF 2.1, debe reemplazar viewAction por:

<f:event type="preRenderView" listener="#{articleIndexBean.loadScreenSupport}" />

Java:

@Named @SessionScoped public class ArticleIndexBean { List<Article> articleList=new ArrayList<>(); List<Article> articleSubList=new ArrayList<>(); int pageNumber = 1; // by default first page public void loadScreenSupport() { search(); toEntityPage(pageNumber); } public int getPageNumber() { return pageNumber; } public void setPageNumber(int pageNumber) { this.pageNumber = pageNumber; } protected void search() { // this method sets articleList which is the full list fetched from the database } public void toEntityPage(int pageNumber) { // this method sets articleSubList which is a subset of articleList } }

El enlace a la página es fácil:

<h:outputLink value="resultPage.xhtml"> <h:outputText value="2" /> <f:param name="page" value="2" /> </h:outputLink>

Referencia: