我遇到了与this类似的导航案例问题。
简而言之,我正在尝试使用ajax渲染h:commandLink
将导航从一个页面重定向到另一个页面。
这是支持bean
@ManagedBean
public class StartBean {
public void search(){
FacesContext
.getCurrentInstance()
.getExternalContext()
.getFlash()
.put("result", "hooray!")
;
}
public String showResult(){
return "result?faces-redirect=true";
}
}
和起始页
<h:body>
<h:form prependId="false">
<h:commandButton value="Click" action="#{startBean.search}">
<f:ajax execute="@this" render="@form"/>
</h:commandButton>
<br/>
<h:commandLink
action="#{startBean.showResult()}"
rendered="#{flash.result != null}"
value="#{flash.result}"
/>
</h:form>
</h:body>
而result
页面只显示一条消息。这两个页面都在Web模块上下文根目录中。
在ajax提交后,h:commandLink
正确显示,但点击它会导致页面刷新。它没有像预期的那样重定向到result
页面。
之后,如果重新加载页面(F5),则会显示result
页面。这似乎是一个渲染周期问题。
有什么建议吗?
提前致谢。
答案 0 :(得分:4)
提交表单时,所有输入和命令组件的rendered
属性都重新评估。因此,如果它评估false
,那么JSF根本不会调用该操作。当search()
方法的请求/响应完成时,Flash作用域将终止。当您发送showResult()
的请求时,它不再存在于Flash范围内。我建议将bean放在视图范围内,并将rendered
属性绑定到其属性。
@ManagedBean
@ViewScoped
public class StartBean {
private String result;
public void search(){
result = "hooray";
}
public String showResult(){
return "result?faces-redirect=true";
}
public String getResult() {
return result;
}
}
与
<h:commandLink
action="#{startBean.showResult}"
rendered="#{startBean.result != null}"
value="#{startBean.result}"
/>