O controle dele é um pouco diferente, mas ele também faz essa parte sim.
a maioria dos outros frameworks é baseado no conceito de actions que facilitam bastante a construcao de aplicacoes web mais ainda tem tem o jeitao de programacao jsp + servlet…
o jsf muda bastante esse conceito. nele voce cadastra classes (que nao precisam implementar nem estender nada, ou pojo, se preferirem) para voce usalas de dentro do seu jsp, que sao chamadas de managed bean. Entao em vez de vc tem uma classe que estende Action que será executada ao clicar em um botao, voce já liga esse botao com um metodo do managed bean, e se tiver outro botao, pode ligar com outro metodo do mesmo managed bean e assim por diante. Com isso voce economiza um numero muito grande de classes e sem precisar fazer gambiarrazinha com campo oculto ou coisa que outros frameworks precisam.
Além do mais, suponha que dentro do teu managed bena voce tenha um atributo do tipo Pessoa que tem nome e data de nascimento…
no jsp voce coloca 2 inputs e liga cada um deles a um atributo da pessoa de dentro do managed bean e o jsf automaticamente pega o valor dos inputs e seta dentro das propriedades de pessoa.
Em outro frameworks geralmente voce pega tudo como string e depois converte pro tipo que quiser, e o jsf já faz isso pra voce.
por exemplo:
<f:view>
<h:form>
...
Nome: <h:inputText value="#{MB.pessoa.nome}"/>
Nascimento: <h:inputText value="#{MB.pessoa.nascimento}"><f:convertDateTime pattern="dd/MM/yyyy"/></h:inputText>
<h:commandButton value="Salvar" action="#{MB.salvarPessoa}"/>
...
</h:form>
</f:view>
configuracao do MB no faces-config.xml
...
<managed-bean>
<managed-bean-name>MB</managed-bean-name>
<managed-bean-class>pacote.MinhaClasse</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
</managed-bean>
...
<navigation-rule>
<from-view-id>*</from-view-id>
<navigation-case>
<from-outcome>sucesso</from-outcome>
<to-view-id>/sucesso.jsp</to-view-id>
</navigation-case>
...
classe correspondente ao MB
package pacote;
public class MinhaClasse{
private Pessoa pessoa;
// get e set de pessoa
public String salvarPessoa()
{
// aqui voce pega uma referencia para sua DAO ou session do hibernate
session.save(pessoa);
return "sucesso"
}
}
Nesse caso o jsf vai instanciar a MinhaClasse no request e dar um getPessoa().setNome(valor do input) e getPessoa().setNascimento(data nascimento). Verifique que a data que será setada no atributo nao é uma String e sim um java.util.Date…
A action salvarPessoa nao precisa fazer nada mais do que salvar o objeto pessoa que já está todo povoado pelo jsf. Note que a action tem uma assinatura simples, sem argumentos e devolve uma String que vai ser usada para definir qual página seráexibida depois, ou entao pode ser void para indicar que vai retornar para a mesma pagina.
Além disso existem listeners e vários componetes disponiveis para colocar na sua aplicacao.
Bom, já escrevi pra caramba, acho que pra dar uma idéia isso já serve. nao sei se isso responde a sua pergunta… se nao manda aí que a gente complementa.
flw!