当恢复的视图在回发期间返回时,您可以手动创建和构建视图。您可以在自定义中执行此操作。这是一个启动示例:null
ViewHandler
public class RestorableViewHandler extends ViewHandlerWrapper {
private ViewHandler wrapped;
public RestorableViewHandler(ViewHandler wrapped) {
this.wrapped = wrapped;
}
@Override
public UIViewRoot restoreView(FacesContext context, String viewId) {
UIViewRoot restoredView = wrapped.restoreView(context, viewId);
if (!(restoredView == null && context.isPostback())) {
return restoredView;
}
UIViewRoot createdView = createView(context, viewId);
context.setViewRoot(createdView);
try {
getViewDeclarationLanguage(context, viewId).buildView(context, createdView);
} catch (IOException e) {
throw new FacesException(e);
}
return createdView;
}
@Override
public ViewHandler getWrapped() {
return wrapped;
}
}
如果代表登录页面,您可能希望通过检查来扩展if
检查。viewId
要让它运行,请在以下位置注册它faces-config.xml
:
<application>
<view-handler>com.example.RestorableViewHandler</view-handler>
</application>
但是存在技术限制:重新创建的视图与初始请求期间完全相同,因此此后对 JSF 组件树进行的任何修改,无论是通过标记处理程序还是基于某些视图甚至会话范围变量的条件渲染组件, 完全丢失。为了准确地重新创建所需的视图,您需要确保这些修改是基于请求范围的变量(阅读:请求参数)而不是视图或会话范围的变量。
换句话说,视图的状态不应依赖于视图或会话范围的托管 bean,而应完全依赖于请求范围的托管 bean。
更新:OmniFaces JSF 实用程序库在当前的 1.3 快照中有一个可重用的解决方案<o:enableRestorableView>
,可以嵌入其中<f:metadata>
。另请参阅<o:enableRestorableView>
快照站点上的展示页面以获取演示。