¿Cuál es la diferencia entre FacesContext y ExternalContext?

Cuál es la diferencia entreFacesContext yExternalContext? ¿Cuándo puedo usar uno u otro? ¿Qué tiene el uno y qué tiene el otro?

El siguiente ejemplo es del libro JavaServer Faces 3rd edition:

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

Frijol de respaldo:

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

¿Por qué es el parámetro de solicitud enExternalContext? Que esclientId? ¿Lo genera JSF cuando se inicia la aplicación?

Respuestas a la pregunta(1)

Su respuesta a la pregunta