我正在阅读关于 JSF 中 PRG 模式的 Balusc 博客,其中提到:
本文针对 JSF 1.2。对于 JSF 2.0,使用新的 Flash 范围可以更轻松地实现这一点。
我想知道flash
范围如何帮助我们实现同样的目标?
在渲染响应阶段之前调用Flash#setKeepMessages()
以true
指示 JSF 将人脸消息存储在 flash 范围内,并将faces-redirect=true
查询字符串参数添加到结果以执行重定向。
public String submit() {
// ...
FacesContext context = FacesContext.getCurrentInstance();
context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Success!", null));
context.getExternalContext().getFlash().setKeepMessages(true);
return "nextpage?faces-redirect-true";
}
这样就不需要一个阶段监听器,它从面部上下文中收集面部消息并将它们存储在重定向之前的会话中,并在 firstnext 请求时将它们从会话中删除,并在重定向后将它们重新添加到面部上下文中。
闪光范围的工作方式大致相同。消息通过唯一标识符存储在会话中,该标识符又作为 cookie 在响应中传递,并且这些消息(和 cookie)在第一个下一个请求中从会话中删除,该请求已将 cookie 传回(即,毕竟,这是一个更健壮的实现,尽管最终用户在完全相同的时刻在同一个会话上发送 2 个 HTTP 请求的可能性很小——或者它必须是一个机器人)。