2013-04-06 7 views
25

Qual è la differenza tra FacesContext e ExternalContext? Quando posso usare l'uno o l'altro? Che cosa ha l'uno e che cosa ha l'altro?Qual è la differenza tra FacesContext e ExternalContext

Nell'esempio riportato di seguito è tratto dal libro JavaServer Faces 3rd edition:

<h:commandButton ... actionListener="#{rushmore.handleMouseClick}" /> 

Backing Bean:

public void handleMouseClick(ActionEvent e) { 
    FacesContext context = FacesContext.getCurrentInstance(); 
    String clientId = e.getComponent().getClientId(context); 
    Map<String, String> requestParams = context.getExternalContext().getRequestParameterMap(); 
    // ... 
} 

Perchè è richiesta parametro ExternalContext? Che cos'è clientId? Viene generato da JSF all'avvio dell'applicazione?

risposta

40

Cerca attentamente nei loro javadoc per vedere quali metodi offrono e quali sono esattamente tutti quei metodi.

Se si guarda più da vicino a quei metodi elencati nella javadoc, si noterà che il FacesContext generalmente offre l'accesso a JSF-specifici manufatti che sono più in alcun modo correlato al "sottostante" API Servlet o Portlet per il quale JSF è stato progettato per essere eseguito su. Per esempio. creando convertitori, validatori, componenti, espressioni EL, eccetera e ottenendo informazioni su view root, localizzazioni supportate, eccetera e aggiungendo listener di fase, listener di eventi di sistema, eccetera. Tutto ciò che è specifico per l'API JSF.

E, ExternalContext in genere offre l'accesso a risorse utente specifiche del servlet o del portlet che JSF sta attualmente utilizzando "sotto le copertine". Ad esempio, quando si esegue su un contenitore Servlet, HTTP servlet request, e Servlet context e intrinsecamente anche tutti i relativi artefatti. Fai clic su questi collegamenti, vedrai che a loro volta offrono metodi che sono stati anche delegati dallo ExternalContext, come ad esempio getRequestParameterMap(). Vedi anche the javadoc. Sì, clicca anche quel link, vedrai che menziona esplicitamente la richiesta di servlet:

Servlet: Questo deve essere il set di parametri disponibili tramite i metodi javax.servlet.ServletRequestgetParameter() e getParameterNames().

Non c'è niente di che può essere offerto dai entrambi contesti. Quindi non ci sarebbe assolutamente alcun motivo per preferire l'uno o l'altro. Usa quello giusto per il lavoro che devi eseguire.

Per quanto riguarda l'ID cliente, è effettivamente generato da JSF, ma sicuramente non all'avvio del server. È appena generato per ogni singolo componente JSF su una base per visualizzazione. In caso di componenti di input come <h:inputText>, che genera un elemento HTML <input>, diventa anche l'attributo name questo modo

<input type="text" id="formId:inputId" name="formId:inputId" ... /> 

Il formId:inputId è esattamente il client ID JSF. Diventa il nome del parametro di richiesta. La rappresentazione HTML del pulsante di comando ha anche un name che termina come nome del parametro di richiesta con il valore del pulsante come valore del parametro.