2012-11-16 20 views
4

在我的代碼我有一個簡單的Phase Listener獲取會話地圖

public class PhaseTracker implements PhaseListener { 
    private static final Logger LOGGER = LoggerFactory.getLogger(PhaseTracker.class); 

    @Override 
    public void afterPhase(PhaseEvent pe) { 
     LOGGER.debug("afterPhase " + pe.getPhaseId()); 
     LOGGER.debug(""+FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("haveErrors")); 

    } 

    @Override 
    public void beforePhase(PhaseEvent pe) { 
     LOGGER.debug("beforePhase " + pe.getPhaseId()); 
     boolean error = false; 
     Iterator<FacesMessage> messageIterator = pe.getFacesContext().getMessages(); 
     while (messageIterator.hasNext()) { 
      FacesMessage message = messageIterator.next(); 
      if (message.getSeverity().equals(FacesMessage.SEVERITY_ERROR)) { 
       LOGGER.debug("beforePhase severity is error"); 
       error = true; 
      } 

     } 

     FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("haveErrors", error); 
     LOGGER.debug(""+FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("haveErrors")); 
    } 

    @Override 
    public PhaseId getPhaseId() { 
     LOGGER.debug("getPhaseId"); 
     return PhaseId.ANY_PHASE; 
    } 
} 

的問題是,當在XHTML文件時,我嘗試用

FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("haveErrors") 

訪問變量我有一個null來源,我不明白爲什麼。

+5

你不能寫在Facelets(XHTML)文件的Java代碼,所以它很難理解/可視化你想究竟如何訪問它。此外,與具體問題無關,這種相當笨拙的方法也可以通過評估EL中的#{facesContext.validationFailed}來實現,而不需要整個階段偵聽器。 – BalusC

+0

它剛剛在javadoc中提到。 – BalusC

回答

0

嘗試這樣

public synchronized void beforePhase(PhaseEvent event) { 

     FacesContext context = event.getFacesContext(); 
     ExternalContext ex = context.getExternalContext(); 

String viewId = "/index.xhtml"; 

     if (context.getViewRoot() != null && context.getViewRoot().getViewId() != null) { 
      viewId = context.getViewRoot().getViewId(); 

     } 

     String localeCode = (String) ex.getSessionMap().get("localeCode"); 

     if (localeCode == null) { 
      ex.getSessionMap().put("localeCode", "en"); 
      context.getViewRoot().setLocale(new Locale("en")); 
      // System.out.println("locale code " +"En?"); 
     } else if (localeCode != null) { 
      //System.out.println("locale code " +localeCode); 
      ex.getSessionMap().put("localeCode", localeCode); 
      context.getViewRoot().setLocale(new Locale(localeCode)); 
     }