Contestando o MVC :)

Galerinha … eu vi um exemplo de implementação para o padrão MVC …
neste exemplo existe um Servlet (camada Controler) cuja única função é realizar redirecionamento de páginas … é isso mesmo ?

Existe um JavaBean por exemplo que armazena os dados digitados/validados na tela de logon do usuário … um outro JavaBean que encapsula as operação de acesso a tabelas em um SGBD Relacional … Esta seria a minha camada Model certo ? o ideal nesta camada era separar beans com responsabilidade/regras de negócio dos beans que acessam dados … o que não foi feito neste exemplo …

A camada View seria composta pelas páginas JSP que leêm dados dos JavaBeans e apresentam ao usuário né ?

Bom … eu não vi muitas vantagens nisso, principalmente no Servelt no meio das requisições … sei que devo estar errado … alguém poderia confirmar isso …

valeu …

Ok vamos lá:

(padrão MVC para web)

Sabemos que criar sites com conteúdo dinâmico oferece uma série de problemas. As principais são: misturar HTML com código Java e, decorrente disso, uma interdependência conturbada entre a equipe de desenvolvimento e os autores das páginas web.

Um pequeno exemplo

//dei uma pequena exagerada, mas acredite,
//você vai encontrar coisa bem pior por ai.
<table>
  <tr>
    <th>Nome</th>
    <th>Telefone</th>
  </tr>
  <%
    Modelo m = Modelo.getInstance();
    Collection c = m.getUsers();
    Iterator i = c.iterator();
    while(i.hasNext()) {
      User u = (User)c.next();
      %>
      <tr><td>
      <%
      out.print(u.getNome());%>
      </td><td> <%
      out.print(u.getFone());
      %>
      </td></tr>
    }
  %>
</table>

E olhe que isso é uma simples table. Imagine isso ai dentro de um design complexo, onde você precisa vários ifs encadeados junto com código HTML. Vira tudo uma porcalhada. Um outro problema é a complexidade de se dar manutenção num código desses!!!

O padrão MVC separa a Visão (interação com os usuários - suas JSPs) do Modelo (sua implementação de negócios), utilizando-se do controlador para que haja interação entre as duas.

Com o padrão MVC1, você utiliza páginas JSP, JavaBeans e seu modelo. As JSPs usam os beans para acessar seu modelo, mas é responsabilidade das páginas gerar o conteúdo assim como exibí-los, exigindo ainda parte de código juntamente com HTML.

O padrão MVC tipo2, adiciona um servlet que atua exatamente como um controlador. Utilizando o struts, que implementa esse padão, veja no que se transforma o código acima:

<table>
  <tr>
    <th>Nome</th>
    <th>Telefone</th>
    <logic:iterate id="user" name="nomedacollection">
      <tr>
        <td><jsp:getProperty name="user" property="nome"/></td>
        <td><jsp:getProperty name="user" property="fone"/></td>
      </tr>
    </logic:iterate>
  </tr>
</table>

Muito mais limpo não? O controlador do struts é uma peça bastante complexa. Trabalha bastante com reflection. Esta é uma implementação perfeita do padrão MVC tipo 2.

Suas páginas JSP enviam uma requisição para o servlet. O servlet mapeia a requisição para uma action. Uma action serve como ponte entre o controlador e o modelo. Com as actions, o controlador pode ser uma classe genérica o sufuciente para não precisar ser reimplementada. As actions acessam o modelo, colocam o resultado no escopo do request e notificam a próxima ação ao controlador. O controlador redireciona então para a próxima página JSP. Já por sua vez, a página acessam os dados que estão no request ou sessin, colocados lá pela action, e as exibe através de taglibs, sem a necessidade de codificação java nelas.

UFA!!!

O conceito é meio complexo para responder no fórum. Estamos preparando um tutorial struts. Quando você entender struts, entenderá o padrão MVC rapidamente.

O exemplo do Elvis do modelo 1 ainda é bastate simples e comum… tem gente que ainda fica abrindo conexoes com o banco de dados direto no JSP… arghh…

Quando estamos aprendendo MVC, é bastante comum acharmos complicado ter que ficar separando as camadas, controller pra ca, view helper pra la, sem falar em Command ( Sim, pq com MVC voce acaba usando varios outros Patters em conjunto ).
Mas, a media que o sistema vai crescendo, as vantagens sao evidentes. Voce demora um pouco mais para planejar o sistema e criar a base deles, mas depois eh so alegria.

Como o Elvis mostrou usando JSP implementado na camada de View, vou mostrar um que usa Velocity. O que queremos fazer é colocar uma relacao de itens em um ArrayList e mostrar tais itens em uma tabela. Primeiro vem o exemplo em JSP “normal”, e logo depois mudado para modelo 2, com Velocity ( ps: nao manjo de JSP, entao pode ter algum erro no codigo hehe ).

Codigo JSP: HTML e Java misturados

<h3>Listagem de usuários</h3>

<%
ArrayList lista = new ArrayList();

// Colocamos 20 nomes na lista
for (int i = 0; i < 20; i++) {
	lista.add("Pessoa "+ i);
}

// Agora Mostramos tudo na tela
%>

<table>
<tr><th>Nome do fulano</th></tr>
<%
for (int i = 0; i < 20; i++) {
%>
	<tr><td><%= lista.get(i);%></td></tr>
<%
}
%>

Este é um codigo bastante comum de acontecer no dia-a-dia. Imagine agora a situacao: o designer, como toda a sua esperteza, vai la querer mexer nas cores das colunas… porem, nada impede dele tambem mexer no codigo que cria o ArrayList, de colocar mais html direto no meio de codigo jsp, ou alguma outra coisa relacaionada…
E quem eh o culpado quando da pau? sim, o programador.

Agora, mudando isso para o modelo 2, nos precisamos encapsular o codigo que cria o ArrayList em um .java normal, e entao - no nosso exemplo - usar o Velocity para fazer a apresentacao. Note que, SE o designer mexer em alguma coisa, sera apenas no codigo do template, que eh bastante simples. Maiores danos nao ocorrerao.

// Pessoas.java

public class Pessoas
{
	public ArrayList criaPessoas()
	{
		ArrayList list = new ArrayList();
		
		for (int i = 0; i < 20; i++) {
			list.add("Pessoa "+ i);
		}
		
		return list;
	}
}

Servlet

public class MeuServlet extends VelocityServlet
{
	public Template handleRequst(HttpServletRequest req, 
		HttpServeltResponse res,
		Context context) throws IOException
	{
		Pessoas p = new Pessoas();
		ArrayList listaPessoas = p.criaPessoas();
		
		Tempalte t = null;
		
		// Coloca a lista de pessoas no contexto do template
		context.put("pessoas", listaPessoas);
		
		// Pega o arquivo de template
		t = getTemplate("listagem_pessoas.html");
		
		return t;
	}
}

E o arquivo de template

<h3>Listagem de Pessoas</h3>

<table>
<tr><th>Nome do Fulano</th></tr>
#foreach ($p in $pessoas)
	<tr><td>$p</td></tr>
#end

Viu? nada complicado.

Logicamente tivemos que criar mais arquivos, o que leva a a pensar que é muito trabalho para fazer uma cosia tao simples. Mas foi simples pq o exemplo eh simples. Quando o sistema fica maior, as vantagens sao muito mais evidentes.

Basicamente é isso. Vale a pena estudar a fundo isso tudo!

Rafael

poxa
voces sao insanos
olha o tamanho das respostas

pior q eu li. bem, quero dizer, melhor! :slight_smile:

Mais conteúdo sobre MVC recomendo acessar este link: http://www.guj.com.br/posts/list/129277.java
Vou adicionar este tópico como referência na lista de links sobre MVC que estão na primeira postagem do link que estou recomendando.
Cuidado: Não confunda MVC com CAMADAS (Layer’s). Uma coisa é MVC, outra coisa é Layer’s!
Espero ter colaborado! :wink: