В моем проекте я использую следующие фреймворки: sun jsf 1.2, spring 2.5, RichFaces ajax4faces, apache orchestra и Facelets.
Я разработал собственную реализацию PhaseListener для перехвата входящих страниц и обработки предварительных обработок init и событий prerender через интерфейс Java.
Когда я вызываю страницу по ссылке на странице HTML и вызывается событие afterPhase, я получаю правильный viewid в фазе restore_view, но когда я вызываю другую страницу, используя commandButton (используя файл конфигурации navigation.xml), когда restore_view Фаза - это вызов viewid, все еще такой же для вызывающей страницы, но не для вызывающей, я получаю правильный viewid для вызывающей страницы, пока не будет вызвана фаза invoke_application.
Поэтому метод вызывающих страниц init () не запускается при использовании commnadButton для его вызова.
here my phaselistener implementation program
package hsbpbnp;
import javax.faces.context.FacesContext;
import javax.faces.event.PhaseEvent;
import javax.faces.event.PhaseId;
import javax.faces.event.PhaseListener;
public class AppPhaseListener implements PhaseListener {
PhaseId phaseid = null ;
FacesContext facesContext = null ;
//constructor de la clase
public AppPhaseListener() {
}
@Override
public void beforePhase( PhaseEvent phaseEvent ) {
phaseid = phaseEvent.getPhaseId();
if ( phaseid == PhaseId.RENDER_RESPONSE ) {
facesContext = phaseEvent.getFacesContext() ;
String viewId = phaseEvent.getFacesContext().getViewRoot().getViewId() ;
if( viewId.endsWith( ".xhtml" ) ) {
String ManagedBeanName = this.getFileName( viewId ) ;
Object object = (Object) FacesUtils.getManagedBean( ManagedBeanName ) ;
if ( object == null ) {
System.out.println( "no such managed bean " + viewId ) ;
}else {
ILifeCycleAware lifeCycleAwareBean = ( ILifeCycleAware ) object ;
lifeCycleAwareBean.prerender() ;
}
}
}//Fin if RENDER_RESPONSE
}//Fin del metodo beforePhase
@Override
public void afterPhase( PhaseEvent phaseEvent ) {
phaseid = phaseEvent.getPhaseId() ;
SessionBean1 sb = ( SessionBean1 )FacesUtils.getManagedBean( "SessionBean1" );
String ManagedBeanName = " " ;
if ( phaseid == PhaseId.RESTORE_VIEW ) {
facesContext = phaseEvent.getFacesContext();
String viewId = phaseEvent.getFacesContext().getViewRoot().getViewId();
if ( viewId.indexOf( "css" ) != -1 ) return;
if( viewId.endsWith( ".xhtml" ) ) {
ManagedBeanName = this.getFileName( viewId ) ;
Object object = ( Object ) FacesUtils.getManagedBean( ManagedBeanName ) ;
if ( object == null ) {
System.out.println( "no such managed bean " + viewId ) ;
}else {
ILifeCycleAware lifeCycleAwareBean = ( ILifeCycleAware ) object ;
lifeCycleAwareBean.init() ;
}
}
String ManagedBean = this.getManagedName( viewId );
if( sb.getLastPage().equals( ManagedBean ) ) {
try {
if(FacesUtils.getRequestParameter("from").equals("menu")){
sb.setPostback(false);
return;
}
} catch (Exception ex){
//do nothing
}
sb.setPostback( true );
}else {
String pop = this.firstFive( ManagedBean );
if( pop.equals( "Popup" ) ) {
return;
}else {
sb.setLastPage( ManagedBean );
sb.setPostback( false );
sb.setOnLoad1 ( " " );
}
}
}//Fin if RESTORE_VIEW
if( phaseid == PhaseId.INVOKE_APPLICATION ) {
facesContext = phaseEvent.getFacesContext() ;
String viewId = phaseEvent.getFacesContext().getViewRoot().getViewId() ;
if( viewId.endsWith( ".xhtml" ) ) {
ManagedBeanName = this.getFileName( viewId ) ;
Object object = ( Object ) FacesUtils.getManagedBean( ManagedBeanName ) ;
if ( object == null ) {
System.out.println( "no such managed bean " + viewId ) ;
}else {
ILifeCycleAware lifeCycleAwareBean = ( ILifeCycleAware ) object ;
lifeCycleAwareBean.preprocess() ;
}
}
}//Fin if INVOKE_APPLICATION
}//Fin del metodo afterPhase
@Override
public PhaseId getPhaseId() {
return PhaseId.ANY_PHASE ;
}//Fin del metodo getPhaseId
//Metodo que se encarga de encontrar el nombre del bean de la
//pagina que esta siendo creada en el ciclo de vida
public String getManagedName( String path ) {
String fileName = null;
String separator = "/";
int pos = path.lastIndexOf( separator );
int pos2 = path.lastIndexOf( "." );
if( pos2 >- 1 )
fileName = path.substring( pos + 1, pos2 );
else
fileName = path.substring( pos + 1 );
return fileName;
}//Fin del metodo getFileName
public String getFileName( String path ) {
String fileName = null;
String separator = "/";
int sep = path.lastIndexOf( separator );
int dot = path.lastIndexOf( "." );
fileName = path.substring( sep + 1, dot );
return fileName.substring( 0,1 ).toLowerCase() + fileName.substring( 1 );
}//Fin del metodo getFileName
public String firstFive( String managedBean ) {
String pop = managedBean.substring(0, 5);
return pop;
}//fin del metodo firstFive
}//EOF