如何从outputLink调用托管bean方法?

时间:2014-02-15 03:18:44

标签: jsf pagination managed-bean

这可能已被某处覆盖,但我在搜索引擎的问题上遇到了问题,到目前为止还没有商品引导。

我正在处理充当实体视图的页面。大量结果来自数据库,一次只显示少数结果。所以你可以想象我想建立一个链接列表,将用户带到另一个实体页面。这是我的所有代码 - 没有PrimeFaces或任何其他前端漂亮的分页解决方案。至少现在。

代码:

@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 
}

每个网页链接都需要调用toEntiyPage(n)。我知道commandLink但我想避免POST请求。此外,bean目前是会话范围的,我将尝试稍后进行对话。它肯定不会是请求范围,因为我不希望每次用户想要跳转到另一个页面时进行完整的数据库搜索。所以@PostConstruct也无济于事。

所以使用这样的菜单:1 * 2 * 3 * 4 * 5如何编写outputLink或任何其他类型的链接,通过GET请求调用我的ArticleIndexBean.toEntityPage(int)

解决方案

根据Laurent的输入,我向我的bean添加了currentEntityPageNumber属性和toCurrentEntityPage()方法。 toCurrentEntityPage()只需拨打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>

如果我们可以直接调用toEntityPage(pageNumber)肯定会更好,但这样可以正常工作。

1 个答案:

答案 0 :(得分:0)

假设您正在使用JSF 2.2,您可以使用viewParam检索GET参数中的页面,并使用viewAction在呈现之前调用方法(实际在INVOKE_APPLICATION中调用默认阶段)。

Facelets的:

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

如果您使用的是JSF 2.0或JSF 2.1,那么您必须将viewAction替换为:

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

爪哇:

@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 
    }
}

该页面的链接很简单:

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

参考: