【问题标题】:ManagedBean keeps returning same query results (Session/View Scope?)ManagedBean 不断返回相同的查询结果(会话/视图范围?)
【发布时间】:2012-11-12 23:46:46
【问题描述】:

我在 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 页面都使用相同的托管 bean。当我单击 index.xhtml 中的 CommandButton 时,它会导航到也使用 Finder bean(当前为 ViewScoped)的 found.xhtml 页面。问题是 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";
    } 

有人有想法吗?

【问题讨论】:

    标签: jsf jsf-2


    【解决方案1】:

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

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

    【讨论】:

    • 听起来我们不在同一个页面上,但差不多。它目前是 ViewScoped,在重定向后我没有得到一个全新的实例,所以没有干净的状态。相反,每次我从索引页面输入文本进行搜索时,它都会将我重定向到找到的页面,但在我已经用新数据更新数据库字段后数据仍然很旧。我会在早上看一下视图参数。谢谢。
    • 您也可以回发到同一个视图并有条件地呈现结果。
    • @Ender 好吧,当您使用会话范围时,您会得到旧数据,但这是意料之中的。因此,会话范围可能不是您想要的。正如上面的评论所说,另一个不错的选择是将搜索表单和结果放在同一页面中并有条件地呈现它们。如果您不需要将搜索表单放在每个页面中,那可能是一个不错的尝试。
    猜你喜欢
    • 2012-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多