Qual é a diferença entre FacesContext e ExternalContext?

Qual é a diferença entreFacesContext eExternalContext? Quando posso usar um ou outro? O que tem um e o que tem o outro?

A amostra a seguir é do livro JavaServer Faces 3rd edition:

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

Feijão de apoio:

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

Por que o parâmetro de solicitação éExternalContext? O que éclientId? É gerado pelo JSF quando o aplicativo é iniciado?

questionAnswers(1)

yourAnswerToTheQuestion