我在 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";
}
有人有想法吗?