我有一个JSF应用程序,我正在使用ui:composition
/ ui:include
来显示页面内的一些元素,如下面的代码所示
的template.xhtml
...
<h:body>
...
<h:panelGroup id="mainPanel">
<ui:include src="#{myBean.page}"/>
</h:panelGroup>
...
</h:body>
项-list.xhtml
<ui:composition>
...
<h:form>
<p:dataTable var="item" value="#{myBean.items}">
<p:column>
<h:commandLink action="#{myBean.loadItemDetail(item)}"
process="@this"
update="mainPanel">
<h:outputText value="#{item.name}"/>
</h:commandLink>
</p:column>
</p:dataTable>
</h:form>
...
</ui:composition>
项-detail.xhtml
<ui:composition>
<h:form>
<!-- Some code to display and modify the item details-->
</h:form>
<ui:composition>
MyBean.java
@ManagedBean
@ViewScoped
public class MyBean {
private String page;
private List<Item> items;
private ItemDetail itmDetail;
@PostConstruct
private void init() {
page = "items-list.xhtml"
items = ... //some logic to populate the items list
}
public void loadItemDetail(Item item){
itmDetail = ... //some logic to get the item's detail
page = "item-detail.xhtml"
}
}
我第一次点击某个项目以查看详细信息时工作正常但在此之后,如果我点击浏览器的后退按钮并尝试加载不同的项目详细信息,它会一直显示第一项的详细信息。< / p>
我检查每个调用的JSF生命周期,尽管在每次调用中应用程序都经历了所有的satage,但只有第一个调用bean方法locadItemDetail
。有没有理由在第一次成功通话后忽略我的方法?在JSF上有某种缓存,我的数据是取自bean而不是我的Bean?
此外,我试图避免在此post中建议实现过滤器的这种行为,它有点有用,但现在当我点击浏览器的后退按钮时,它向我显示一个恼人的页面,阻止我重新发送表单;有没有办法防止这种情况?
注意: 我知道我可以更改应用程序以使用GET方法而不是POST来避免此缓存问题,但它需要对应用程序进行一些重大更改,因此这不是一个选项。
任何关于为什么会发生这种情况的帮助或指导将不胜感激。