2013-04-06 4 views
25

Was ist der Unterschied zwischen FacesContext und ExternalContext? Wann kann ich das eine oder andere benutzen? Was hat der eine und was hat der andere?Was ist der Unterschied zwischen FacesContext und ExternalContext

Das folgende Beispiel stammt aus dem Buch Java Server Faces 3. Auflage:

<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(); 
    // ... 
} 

Warum ist Anforderungsparameter in ExternalContext? Was ist clientId? Wird es beim Start der Anwendung von JSF generiert?

Antwort

40

Schauen Sie sorgfältig in ihre Javadocs, um zu sehen, welche Methoden sie anbieten und was genau diese Methoden tun.

Wenn Sie an diesen Methoden in der javadoc aufgeführt aussehen näher, werden Sie feststellen, dass die FacesContext bietet in der Regel Zugang zu JSF-spezifischen Artefakte, die weiter sind in keiner Weise verwandt mit der "zugrunde liegenden" Servlet- oder Portlet-API, für die JSF entwickelt wurde. Z.B. Erstellen von Konvertern, Validatoren, Komponenten, EL-Ausdrücken usw. und Erhalten von Informationen über die Ansichtswurzel, unterstützte Gebietsschemata usw. und Hinzufügen von Phasenlistenern, Systemereignislistenern usw. Alles was spezifisch für JSF API ist.

Und, ExternalContext bietet in der Regel Zugriff auf Servlet oder Portlet-spezifische Artefakte, die JSF derzeit "unter der Decke" verwendet. Zum Beispiel, wenn sie auf einem Servlet-Container ausgeführt werden, die HTTP servlet request, HTTP servlet response, HTTP session und Servlet context und inhärent auch alle ihre Artefakte. Wenn Sie auf diese Links klicken, sehen Sie, dass sie wiederum Methoden anbieten, die ebenfalls von der ExternalContext delegiert wurden, z. B. getRequestParameterMap(). Siehe auch the javadoc. Ja, auch auf diesen Link klicken, werden Sie sehen, dass es die Servlet-Anfrage ausdrücklich erwähnt:

Servlets: Diese Verfügung der Satz von Parametern sein muss, über die javax.servlet.ServletRequest Methoden getParameter() und getParameterNames().

Es gibt nichts, die von den beiden Kontexten angeboten werden kann. Es gibt also absolut keinen Grund, das eine oder das andere zu bevorzugen. Verwenden Sie einfach den richtigen für den Job, den Sie ausführen müssen.

In Bezug auf die Client-ID, ist es in der Tat von JSF generiert, aber definitiv nicht beim Start des Servers. Es wird nur für jede einzelne JSF-Komponente pro Ansicht generiert. Im Fall von Eingangskomponenten wie <h:inputText>, das ein HTML <input> Element erzeugt, wird es auch das Attribut wie name so

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

Die formId:inputId ist genau die JSF-Client-ID. Es wird der Name des Anforderungsparameters. Die HTML-Repräsentation der Befehlsschaltfläche hat auch eine name, die als Anforderungsparametername mit dem Wert der Schaltfläche als Parameterwert endet.