我在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";
}
有人有想法吗?
答案 0 :(得分:1)
请记住,无论何时使用?faces-redirect=true
技巧,用户的浏览器都会使用HTTP GET请求重定向,这会导致JSF清除视图中存储的任何状态。
因此,即使您使用@ViewScoped
bean,在重定向之后您将获得一个全新的实例。
在您的情况下,因为它是一个简单的搜索,您可能希望使用视图参数,如果数据不敏感出现在URL中。查看this blog post from BalusC: Communication in JSF 2以获取有关此内容以及与围绕JSF bean和页面传递数据相关的其他内容的更多信息。