JSF页面内容未更新

时间:2016-08-19 20:25:20

标签: jsf caching

我有一个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来避免此缓存问题,但它需要对应用程序进行一些重大更改,因此这不是一个选项。

任何关于为什么会发生这种情况的帮助或指导将不胜感激。

0 个答案:

没有答案