您可以手动create和build视图时restored view返回时postbacknull
。您可以在自定义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>
showcase page on snapshot site。