Обновление
Начиная с Mojarra 2.1.19 / 2.2.0 теперь вы можете установить для переходного атрибута <f:view>
значение true:
<f:view transient="true">
Your regular content
</f:view>
Вы можете прочитать об этом в блоге Balusc здесь:
http://balusc.blogspot.com.br/2013/02/stateless-jsf.html
Оригинал
Если вы используете 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>
Если вы используете JSF без Facelets (то есть JSP), вы можете попробовать использовать класс extension ViewHandlerWrapper - обратите внимание, что buildView () будет недоступен. Надеемся, что createView () сам по себе настроит представление правильно, но я не уверен на 100% с JSF / JSP.