O documento discute o padrão MVC com JSP e Servlets, separando as funcionalidades em três camadas: Model, View e Controller. Apresenta também um mini-tutorial sobre como implementar este padrão em um sistema simples de sugestão de cervejas.
3. Sistema e Requisitos
“Para que um sistema de informação
alcance o objetivo para o qual foi
desenvolvido deve satisfazer certos
interesses específicos
– os requisitos –
sejam eles funcionais ou não
funcionais”
4. Tipos de Requisitos
Interface
Recuperação de Dados
Regras de Negócio
Orientação a Objeto
Modelagem
7. Requisitos Acoplados
Problemática
Dificuldade de Manutenção
Ex: Se o video queimar, tem que
colocar tudo no conserto
Difícil Evolução
Interface
Recuperação
De Dados
Regras de
Negócios
9. Separação de Interesses (SoC)
Melhor maneira de criar sistemas
gerenciáveis
Separação de interesses, Parnas (1972)
Modularização
Por quê?
Ex: Não se pode assumir que uma lógica
de negócios somente será acessada por
uma única interface
Requisitos sempre mudam
11. O padrão Model-View-Controller
Como os Requisitos sempre mudam
é melhor que ocorra a
separação da lógica de negócios da
apresentação
Lógica
Apresentação
de
Negócios
Nunca se deve assumir que uma lógica de
negócios somente será acessada por uma
aplicação web
12. O padrão Model-View-Controller
Modelo
Representa a lógica do negócio
Aloja as entidades da aplicação
Pode interagir com a base de dados
Visão
Responsável por exibir as informações ao
usuário
Controle
Faz o meio de campo 12
13. O padrão Model-View-Controller
JSP e Servlets SEM MVC
Podemos considerar como o nosso primeiro
exemplo de Servlet
Tudo estava no Servlet
14. O padrão Model-View-Controller
JSP e Servlets com MVC
MVC retira a lógica de negócios e a interface de
dentro dos servlets,
e põe em 2 camadas, a Modelo, usando classes
Java simples e a Visão, com JSPs,
respectivamente
Os servlets atuarão como a camada de Controle
15. MVC no mundo dos
CONTROLLER (Controlador) Servlets e JSPs
Recupera a entrada do usuário
a partir da requisição
e o traduz para o modelo. MODEL (Modelo)
Diz ao modelo para se
atualizar e disponibiliza Guarda a lógica e o estado
um novo estado para a visão do negócio. Conhece as
regras para recuperar
e alterar o estado.
É a parte do sistema
VIEW (Visão) que interage com
a base de dados
Responsável pela
apresentação. Recupera
o estado do modelo
através do controle.
Também obtém a
entrada do usuário
e repassa para o
controle
17. Mini Tutorial
3 passos
Estabeler a visão de usuário e uma arquitetura
de alto nível
Criar as classes no Eclipse
Executar desenvolvimentos e testes iterativos
23. Criar o
Servlet
getParameter(“nomeDoParametro”):String
Método do HttpServletRequest
Informe o nome de um parâmetro vindo de uma
requisição
E obtenha o valor(String) que o usuário informou
No HTML (Visão)
No Servlet (Controle
24. Criar o
Servlet
public class SelecaoCerveja extends HttpServlet {
public void doPost(HttpServletRequest request,
HttpServletResponse response)
throws IOException {
response.setContentType(“text/html”);
PrintWriter out = response.getWriter();
String c = request.getParameter(“cor”);
out.println(“<h1>Cervejas sugeridas</h1><br/>”);
out.println(“<br/>Voce escolheu a cor ” + c);
}
}
25. Editar o
Deployment Descriptor
Mapeie o servlet
Escolha um nome lógico
Servlet-class
br.com.exemplo.web.SelecaoCerveja
Url
/SelecionarCerveja.do
26. Testar
Iniciar o Tomcat
Teste a página
http://localhost:8080/curso/form.html
Selecione uma cor e clique em Enviar
28. Construir
o Modelo
Pacote
br.com.exemplo.model
A classe de modelo deve possuir um método
getMarcas()
Recebe uma cor e retorna uma lista de marcas
29. CervejaExpert.java
package br.com.exemplo.model;
import java.util.*;
public class CervejaExpert {
public List<String> getMarcas(String cor) {
List marcas = new ArrayList<String>();
if (cor.equals(“Clara”)) {
marcas.add(“Antarctica”);
marcas.add(“Brahma”);
} else {
marcas.add(“Bohemia”);
marcas.add(“Original”);
}
return marcas;
}
}
31. Como fazer o Controle
acessar o Modelo?
Instancie a classe
CervejaExpert no Servlet
32. Servlet
Versão 2
public class SelecaoCerveja extends HttpServlet {
public void doPost(HttpServletRequest request,
HttpServletResponse response)
throws IOException {
response.setContentType(“text/html”);
PrintWriter out = response.getWriter();
String c = request.getParameter(“cor”);
out.println(“<h1>Cervejas sugeridas</h1><br/>”);
CervejaExpert ce = new CervejaExpert();
List<String> resultado = ce.getMarcas(c);
Iterator it = resultado.iterator();
while(it.hasNext()) {
out.println(“<br/>Experimente ” + it.next());
}
}
}
33. O servlet deve disponibilizar
um valor na requisição
setAttribute(“nomeDoAtributo”, valor)
Método do HttpRequest
Configure um objeto como um atributo
para ser recuperado através de um nome
Obs:
Esse valor será acessado pela JSP (passo 6)
34. Servlet prepara a bola
para a JSP
getRequestDispatcher(“pagina.jsp”): RequestDispatcher
Método do HttpRequest
Configura um objeto capaz de redirecionar o
fluxo da aplicação para uma JSP
35. Servlet passa a bola
para a JSP
forward(request, response)
Método do RequestDispatcher
Redireciona o fluxo
36. Servlet
Versão 3
public class SelecaoCerveja extends HttpServlet {
public void doPost(HttpServletRequest request,
HttpServletResponse response)
throws IOException {
String c = request.getParameter(“cor”);
CervejaExpert ce = new CervejaExpert();
List resultado= ce.getMarcas(c);
request.setAttribute(“marcas”, resultado);
RequestDispatcher rd =
request.getRequestDispatcher(“resultado.jsp”);
rd.forward(request,response);
}
}
37.
38. Como a JSP acessará
o atributo na requisição?
Se no Servlet Atcha, tcha, tcha, tcha!!!
nós usamos Deve ser com um
um setA0ribute(), getAttribute() ,
então... passando o nome do atributo
39. getAttribute(“nomeDoAtributo”)
Método do HttpRequest
Recupera um objeto como um atributo
disponível na requisição
através de um nome
40. Jsp como View
resultado.jsp
<%@ page import=“java.util” %>
<html>
<body>
<h1>Selecao de Cervejas</h1>
<p>
<%
List marcas =
(List) request.getAttribute(“marcas”);
Iterator it = marcas.iterator();
while (it.hasNext()) {
out.println(“<br>Experimente: ” + it.next());
}
%>
</body>
</html>