ManagedBean持续返回相同的查询结果(会话/视图范围?)

时间:2012-11-12 23:46:46

标签: jsf jsf-2

我在index.xhtml页面中有以下内容。

<h:form id="findForm">
        <h:panelGrid columns="2" cellpadding="5">                
            <p:outputLabel value="Name" for="name"/>
            <p:inputText id="name" value="#{finder.name}"/>

            <f:facet name="footer">
                <p:commandButton value="Find"
                action="#{finder.gotoFoundPage}"/>
            </f:facet>
        </h:panelGrid>
</h:form>

这是下一页的缩减版,found.xhtml。

    <p:dataTable id="myTable" var="item" 
        value="#{finder.byName}" rowKey="#{item.name}" 
        paginator="true" rows="20" 
        selection="#{finder.selectedItem}" selectionMode="single">

        <p:column headerText="Name" sortBy="#{item.name}"
                filterBy="#{item.name}" id="name">
            #{item.name}
        </p:column>
    </p:dataTable>

两个xhtml页面都使用相同的mananged bean。当我从index.xhtml单击CommandButton时,它会导航到found.xhtml页面,该页面也使用Finder bean(当前是ViewScoped)。问题是Finder bean不会获得#{finder.name}(用户在索引页面中输入并需要传递给找到的页面),除非我使Finder bean为SessionScoped。

因此,如果我将其设为SessionScoped,那么问题是found.xhtml页面在手册页上的新搜索时始终在找到的页面中显示相同的值。即使数据库中的值已更改,也会显示相同的值。我的理解是,如果我将其设置为ViewScoped,它将在每次加载页面时执行新查询以更新显示的值。但不知道该怎么做。

@EJBs({@EJB(name="ejb/MyBean1", beanInterface=IMyBean1.class),
       @EJB(name="ejb/MyBean2", beanInterface=IMyBean2.class)})
@ManagedBean(name="finder")
@ViewScoped
public class Finder implements Serializable {

    // ...

    public String gotoFoundPage() {
        return "found?faces-redirect=true";
    } 

有人有想法吗?

1 个答案:

答案 0 :(得分:1)

请记住,无论何时使用?faces-redirect=true技巧,用户的浏览器都会使用HTTP GET请求重定向,这会导致JSF清除视图中存储的任何状态。 因此,即使您使用@ViewScoped bean,在重定向之后您将获得一个全新的实例。

在您的情况下,因为它是一个简单的搜索,您可能希望使用视图参数,如果数据不敏感出现在URL中。查看this blog post from BalusC: Communication in JSF 2以获取有关此内容以及与围绕JSF bean和页面传递数据相关的其他内容的更多信息。