【问题标题】:Primefaces ajax pagination not workingPrimefaces ajax分页不起作用
【发布时间】:2013-12-18 13:35:05
【问题描述】:

我有以下 jsf 页面,其中数据表是通过来自数据库的 ajax 请求填充的。问题是,在分页栏上按下另一个页面按钮后,表格没有显示结果。将支持 bean 的范围更改为会话会有所帮助,但这不是解决方案。为什么会这样?

    <h:form>
            <h:panelGrid columns="2" cellpadding="8" style="width: 545px">          
                <h:panelGroup>
                    <p:outputLabel value="Client name: " for="searchString" />
                    <br />                  
                    <p:inputText id="searchString" title="searchString" value="#{findClientBean.searchString}" />                       
                </h:panelGroup>
                <h:panelGroup>
                    <br />
                    <p:message for="searchString" />
                </h:panelGroup>             
                    <p:commandButton value="Search" styleClass="pCommandButton" >
                    <f:ajax execute="searchString" listener="#{findClientBean.findClient}" render=":resultTable" />
                    </p:commandButton>                                  
            </h:panelGrid>                  
            </h:form>
            <br />
            <p:dataTable id="resultTable" var="client" value="#{findClientBean.resultList}" paginator="true" rows="10"  
                 paginatorTemplate="{CurrentPageReport}  {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"  
                 rowsPerPageTemplate="5,10,15" paginatorPosition="bottom">
                <p:column headerText="Search results">
                    <h:outputLink value="../temp.xhtml?id=#{client.id}">#{client.firstName} #{client.lastName}</h:outputLink>
                </p:column>
            </p:dataTable>
        <h:form>

支持 bean 代码:

@Named
@RequestScoped
public class FindClientBean implements Serializable {

@Inject
private ClientDAO clientDAO;    
@NotNull(message="Search string cannot be empty")   
private String searchString;
private List<Client> resultList;        

public void findClient() {
    resultList = clientDAO.findClientByNameOrLastnamePart(searchString);
}

public void setResultList(List<Client> resultList) {
    this.resultList = resultList;
}

public List<Client> getResultList() {
    return resultList;
}

public String getSearchString() {
    return searchString;
}

public void setSearchString(String searchString) {
    this.searchString = searchString;
}
}

【问题讨论】:

    标签: ajax jsf primefaces


    【解决方案1】:

    只要用户按下搜索按钮,就会填充您的客户端结果列表。

    由于集合在 RequestScoped bean 中,resultList 将在它被发送回视图(连同整个 bean)后立即被删除。

    因此,当用户尝试导航到另一个页面(从而发出第二次请求)时,组件将不再找到填充的结果列表,并且将显示“未找到记录”消息。

    “提升”您的 bean 到 ViewScoped(或任何可以使您的 bean 寿命更长的范围)。

    @Named
    @ViewScoped
    public class FindClientBean implements Serializable{
    (...)
    }
    

    【讨论】:

    • 感谢您的回答!我开始使用 ajax 并认为如果我使用 ajax 请求,那么请求不会过期。我明白了,我只有 CDI bean,所以我想我应该使用 Conversation 范围。
    • 如果您使用 JEE6,您将需要对话范围。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 2012-12-05
    • 1970-01-01
    • 1970-01-01
    • 2013-10-02
    • 1970-01-01
    • 2018-05-16
    相关资源
    最近更新 更多