JSF - Diferença entre Action e ActionListener

Pessoal, estava fazendo uma aplicação web de exemplo, uma agenda, quando me deparo com um pequeno problema.

Quando eu criava a lista de contatos, tinha um botão ao lado para deletar aquele contato em questão:

[code]<h:dataTable var=“contato”
value="#{AtualizarFormulario.listaDeContatos}">
<h:column>
<f:facet name=“header”>
<h:outputText value=“ID”></h:outputText>
</f:facet>
<h:outputText value="#{contato.id}"></h:outputText>
</h:column>

				<h:column>
					<f:facet name="header">
						<h:outputText value="NOME"></h:outputText>
					</f:facet>
					<h:outputText value="#{contato.nome}"></h:outputText>
				</h:column>

				<h:column>
					<f:facet name="header">
						<h:outputText value="TELEFONE"></h:outputText>
					</f:facet>

					<h:outputText value="#{contato.telefone}"></h:outputText>
				</h:column>

				<h:column>
					<f:facet name="header">
						<h:outputText value="EMAIL"></h:outputText>
					</f:facet>
					<h:outputText value="#{contato.email}"></h:outputText>
				</h:column>

				<h:column>
					<f:facet name="header">
						<h:outputText value="DELETAR"></h:outputText>
					</f:facet>
					<h:commandButton value="Deletar"
						actionListener="#{AtualizarFormulario.deletarContatoSelecionado}"
						>
						<f:setPropertyActionListener value="#{contato.id}"
							target="#{AtualizarFormulario.usuDelete}"></f:setPropertyActionListener>
					</h:commandButton>
				</h:column>
			</h:dataTable>[/code]

Desta forma que eu fiz, ele não passava pelo set do “usuDelete” (que é o id do contato a ser deletado). Ele ia direto ao método.

Quando eu colocava isso:

<h:commandButton value="Deletar" action="#{AtualizarFormulario.deletarContatoSelecionado}"> <f:setPropertyActionListener value="#{contato.id}" target="#{AtualizarFormulario.usuDelete}"></f:setPropertyActionListener> </h:commandButton>

Ele conseguia setar o usuDelete antes de ir ao método, eu ainda não entendi qual a diferença entre os dois, alguém podería me explicar por que existe essa diferença?

Obrigado.

Action você realiza ações e navegações.
ActionListener você altera o estado de um objeto (componentes de tela ou suas classes), geralmente com ajax.