Separacao entre view e controller no MVC

Estava discutindo hoje no trabalho sobre a separação entre as camadas de controle e apresentação no MVC. Pela proposta da arquitetura, eu poderia alterar completamente a camada de apresentação sem que isso fosse impactar na minha camada de controle afinal, tudo que ela veria seriam requests e responses. Na minha idéia, eu poderia criar uma camada de apresentação em PHP, Flex ou qualquer outra linguagem/framework enquando usaria meu framework de preferencia na camada de controle. Ai surgiram as minhas dúvidas…

Hoje umas das referências que temos em frameworks MVC são o Struts e o JSF. Mas nenhum dos dois permite que eu desacople totalmente as minhas camadas. O Struts ainda é mais flexível no que se trata da resposta a camada de apresentação pois faz o redirecionamento e posso passar os parâmetros pelo request para a página. Mas o JSF amarra completamente as duas coisas! Se eu não declaro um f:view no meu JSP (só posso usar JSP), o Servlet não funciona! Isso não está errado? Eu sou obrigado a usar os componentes X e Y na apresentação só porque adotei um framework na camada de controle?

Eu não cheguei a estudar mais a fundo… Mas como outros frameworks como o VRaptor ou o Menta se comportam nessa situação? Posso fazer a passagem de informações sem problemas?

A qual acoplamento voce se refere? ActionForms do Struts, por exemplo?

Como disse, o Struts é mais tranquilo pois não me trava em nada na página! Posso usar o ActionForm só para receber os parametros do request e a volta para a página eu faço totalmente através de atributos. É trabalhoso, eu sei, mas não me obriga a usar o FW na apresentação. Já o JSF é um porre, pois sem a apresentação ser modelada para o JSF eu não consigo usar a camada de controle.

Isso é um mal de qualquer framework que se utilize de taglibs especificas, né?

Sem muitas solucoes para você… hehehehe =)

Acredito que quando falamos de MVC utilizando frameworks, independente da tecnologia ficamos presos a ela de alguma forma. Conseguimos obter flexibilidade e facilidade de extensão, mas dentro da própria tecnologia.

Para atingir esse nível de indenpendencia que você sugere a abordagem mais adequada seria trabalhar com serviços utilizando formatos de comunicação independentes de tecnologia tais como HttpRequest, XML ou JSon.

Na verdade o que falta pro seu caso é definir de forma adequada uma camada de aplicação com uma interface que possa ser usada por qualquer camada de apresentação que você necessite criar. Mas cuidado par (1) não criar uma coisa desnecessária para seu caso, fazendo com isso BDUF e (2) acho que você confundiu um pouco MVC e camadas que são coisas diferentes.

Não existe separação entre view e controller! No padrão original, controller mantém referências da view e do model, view mantém referências do model (mesmo que transitivamente), e model não mantém referências para ninguém.

Portanto, sempre que você faz uma view nova, você faz um controller novo. Sem mistério.

Mas se há a necessidade de reaproveitar controller entre views diferentes, isso só pode significar uma coisa: POG! Muito provavelmente, seu controller está muito grande e está fazendo mais coisas que deveria fazer. Mova parte da lógica do controller para os models, e faça o controller ficar pequeno. Assim, você não fica com dó na hora de reescrever uma view diferente.

[quote=Leonardo3001]Não existe separação entre view e controller! No padrão original, controller mantém referências da view e do model, view mantém referências do model (mesmo que transitivamente), e model não mantém referências para ninguém.

Portanto, sempre que você faz uma view nova, você faz um controller novo. Sem mistério.

Mas se há a necessidade de reaproveitar controller entre views diferentes, isso só pode significar uma coisa: POG! Muito provavelmente, seu controller está muito grande e está fazendo mais coisas que deveria fazer. Mova parte da lógica do controller para os models, e faça o controller ficar pequeno. Assim, você não fica com dó na hora de reescrever uma view diferente.
[/quote]Concordo com o Leonardo. Alguém poderia dar um exemplo de visão e controle totalmente desacoplados?

A camada view, seja ela JSP, velocity, JSTL, etc. exige programação, isto é, exige lógica. Não tem como fugir disso.

O que vc pode e deve fazer é ABSTRAIR o máximo possível essa lógica para fora da camada view.

NO JSP isso é feito através de TAGs. Por isso que é fundamental um conjunto de tags bem integradas com o framework e uma facilidade grande para vc criar suas próprias tags de visão, loop e condição.

E não, JSTL está bastante longe do ideal, por ser muito genérica, verbose e cheia de pentelhações…