0

我在 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 设为 SessionScoped,否则 Finder bean 不会获得 #{finder.name}(用户在索引页面中输入并需要传递给找到的页面)。

因此,如果我将其设为 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";
    } 

有人有想法吗?

4

1 回答 1

1

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

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

于 2012-11-13T01:22:04.003 回答