Update
从 Mojarra 2.1.19 / 2.2.0 开始,您现在可以设置<f:view>
为真:
<f:view transient="true">
Your regular content
</f:view>
您可以阅读有关Balusc's博客在这里:
http://balusc.blogspot.com.br/2013/02/stateless-jsf.html
Original
如果您使用 Facelets,您可以创建自己的 ViewHandler 来处理此问题:
public class LoginViewHandler extends FaceletViewHandler
{
public LoginViewHandler( ViewHandler viewHandler )
{
super( viewHandler );
}
@Override
public UIViewRoot restoreView( FacesContext ctx, String viewId )
{
UIViewRoot viewRoot = super.restoreView( ctx, viewId );
if ( viewRoot == null && viewId.equals( "/login.xhtml" ) )
{
// Work around Facelet issue
initialize( ctx );
viewRoot = super.createView( ctx, viewId );
ctx.setViewRoot( viewRoot );
try
{
buildView( ctx, viewRoot );
}
catch ( IOException e )
{
log.log( Level.SEVERE, "Error building view", e );
}
}
return viewRoot;
}
}
将“/login.xhtml”更改为您的登录页面。这会检查是否可以恢复您的视图,如果不能并且当前视图是您的登录页面,它将为您创建并构建视图。
在 Face-config.xml 中进行如下设置:
<application>
<!-- snip -->
<view-handler>my.package.LoginViewHandler</view-handler>
</application>
如果您使用没有 Facelets(即 JSP)的 JSF,您可以尝试让该类扩展 ViewHandlerWrapper - 请注意,buildView() 将不可用。希望 createView() 本身能够正确设置视图,但我对 JSF/JSP 不是 100% 确定。