分页使用JSF的GET参数(Pagination on JSF using get paramete

2019-10-19 03:30发布

我在的index.xhtml和我有这样的代码片段:

<h:form>
    <h:commandButton action="#{blogentryListerBean.olderBlogEntries}"
                     value="Older Blog Entries"/>
</h:form>

BlogEntryListerBean是RequestScoped。 这是我在olderBlogEntries代码

public String olderBlogEntries() {

    HttpServletRequest request
            = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();

    String id = request.getParameter("id");

    if (id == null || id.equals("")) {
        id = "0";
    }

    int pageIamOn = Integer.valueOf(id);

    String stringToBeReturned = "index.xhtml?id=" + (pageIamOn + 1) + "&faces-redirect=true";
    return stringToBeReturned;
}

所以,当我打的index.xhtml,第一次我看到的网址是:的index.xhtml预期。 我第一次点击按钮“老年博客文章”我看网址:?的index.xhtml ID = 1现在,当我打了旧的博客条目按钮,我再次上的index.xhtml ID = 1?

这里有什么问题? 为什么我不会去的index.xhtml?ID = 2

谢谢。

Answer 1:

你实际上误解了当前的HTTP生命周期。 你的问题主要是目的地页面(你的情况的index.xhtml本身)没有在任何地方捕获发送PARAM。

还记得你在第一次执行重定向,但是当你按下一次按钮,这是目前该知道也不关心你的PARAM另一个不同的要求,因此,在处理动作,你request.getParameter("id")返回null一次又一次的参数是不被发送。

您的问题,有一个简单的解决方案,这是在利用接收到的PARAM绑定到您的视图f:viewParam

<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:f="http://java.sun.com/jsf/core">
<h:head>
    <f:metadata>
        <f:viewParam name="id" />
    </f:metadata>
</h:head>
<h:body>
    <h:form>
        <h:commandButton action="#{bean.olderBlogEntries(id)}"
            value="Older Blog Entries" />
    </h:form>
</h:body>
</html>

和Java代码会是这样的:

@ManagedBean
@RequestScoped
public class Bean {

    public String olderBlogEntries(Integer id) {

        if (id == null) {
            id = 0;
        }

        String stringToBeReturned = "index.xhtml?id=" + (id + 1)
                + "&faces-redirect=true";
        return stringToBeReturned;
    }
}

在这种情况下,你需要一个参数传递到操作方法,去做那些你需要有EL 2.2在类路径中可用。 如果你没有它已经建立了这样做,请按照步骤操作 。

生命周期woud是:

  • 第一个请求,你打开浏览器,并执行针对的index.xhtml GET请求。 没有参数没有被发送。
  • 你按一下按钮,提交表单的POST请求。 动作方法重定向到http://localhost:8080/basic-jsf/index.xhtml?id=1 ,这将导致一个GET请求到由客户端进行到这个URL。 现在JSF捕捉id视图PARAM并将其绑定到名为视图id
  • 当您再次按下按钮,JSF调用操作方法与当前PARAM,价值1 。 重定向现在去http://localhost:8080/basic-jsf/index.xhtml?id=2

或者 ,你可以绑定视图参数去一个bean属性。 在这种情况下,就没有必要把它作为方法的参数:

<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:f="http://java.sun.com/jsf/core">
<h:head>
    <f:metadata>
        <f:viewParam name="id" value="#{bean.id}" />
    </f:metadata>
</h:head>
<h:body>
    <h:form>
        <h:commandButton action="#{bean.olderBlogEntries}"
            value="Older Blog Entries" />
    </h:form>
</h:body>
</html>

实现你的属性的get / set方法:

@ManagedBean
@RequestScoped
public class Bean {

    private Integer id = 0;

    public Integer getId() {
        return id;
    }

    public String olderBlogEntries() {
        String stringToBeReturned = "index.xhtml?id=" + (id + 1)
                + "&faces-redirect=true";
        return stringToBeReturned;
    }

    public void setId(Integer id) {
        this.id = id;
        System.out.println("id " + id + " received");
    }
}

也可以看看:

  • 有什么可以<F:元数据>,<F:viewParam>和<F:的viewAction>用于?


文章来源: Pagination on JSF using get parameters
标签: jsf jsf-2 get