24

mario/grad/hmidia/mvc.pdf · •E criado pelo controlador que preenche o ... public class Ope ra coIn lui extends Oper ac o {public void ex cutar(HttpServletRequest ... * Este método

Embed Size (px)

Citation preview

���������������� ���������������������������� ������������

����������� ��������

2

���������������� ���������������������������� ������������

������� ����� ������������� �������������� ������� ������������ �������� ���������� �������� �� ���!"����#�

��� ����� ���� � ������#����� � �������������

�����

�������� �������� #��������������$��� �

��� � ����������������� ��% ��

�������� ��!"����� �" � ����������� �� ���&��

��������������������

'� ��������� ����� ������� ���� ����� � ����

����������� �(�����������������������

3

����������������

)���� ��������������� *��� ���� +��������� �,������

�������� ���������� ������ ���� � �� �� �

����������������������

-������� ��� ��� �������� �������� �������� ���� � ������������ ������������ ������������ ������������

4

���������������� ������������������������������ ��������������

����� � �������������������� �.�����.�����.�����.����� � �

���������� ����������������� � �� �� � �� ��� � �� �� � �� ��� � �� �� � �� ��� � �� �� � ��

������������� ��������� �� ������

/��/��/��/�� ����� ��������� ��� ���� �� ����� ������

�������������� ������������� ������������� ������������� ��������

5

������ !"� ������ ����������������� !"� ������ �����������

0�0�0�0��������(���������(���������(���������(�� ������������#�

��� ����� �� "!���#��� ����� �� "!���#��� ����� �� "!���#��� ����� �� "!���#����� ���� ������. �������

� ��� �������� ��% �� � �� �!��������� ���

$ ������ �� "����� �� "!���

����� �����������#����� �����������#����� �����������#����� �����������#���� � ��������� ����

" ��������#�.���������� ���-���� ������ �

��� $������ �������� ��������111

������. & �������������(����������(����������(����������(���� ��������� ���������������� ���������������� ���������������� ��������

6

��������#��������#����������������#��������#��������

0�� ������. ��0�� ������. ��0�� ������. ��0�� ������. �� � �� � � �� � � �� � � �� � � � ��� ������������������������������������������������������������ ���� ��������� "�������� ����

������ ��% �� � �� �������� �������*������������ �$(����� �� ������������,

2������� ���������������������������� ��� ���������� ���

� �� ���% ��� ��� ���������������������� � �

���� $ ������� ���������� �� ����� ������ �

.�����&���� ����"������������� �� ����� �������

7

���#� �#��$�����%�����%����������#� �#��$�����%�����%�������

•Implementado como Servlet•Recebe os dados do cliente•Instancia os beans da camada demodelo

•Processa as informações •Seleciona o visualizador adequado à resposta (JSP)

Controlador(Define comportamento da app)

•Implementado com JSP•Recebe os dados do cliente•Acessa o modelo para extrair as

informações•Formata a página de saída

Visualizador(Constrói e atualiza o modelo)

•Implementado como JavaBeans•Responde a consulta de estado•E criado pelo controlador quepreenche o seu conteúdo

Modelo(Encapsula o estado da

aplicação)

•Implementado como Servlet•Recebe os dados do cliente•Instancia os beans da camada demodelo

•Processa as informações •Seleciona o visualizador adequado à resposta (JSP)

Controlador(Define comportamento da app)

•Implementado como JSP•Recebe os dados do cliente•Acessa o modelo para extrair as informações

•Formata a página de saída

Visualizador(Constrói e atualiza o modelo)

•Implementado como JavaBeans•E criado pelo controlador quepreenche o seu conteúdo

Modelo(Encapsula o estado da

aplicação)

Página HTML

O atributo action da tag do form aponta para um Servlet que receberá as informações

FormHTML

1

Banco de Dados

Bean Funcional

2

Quando necessário a servlet usa o beanfuncional para armazenar ou recuperar as informações

3

A servlet instancia os beans do modelo ourecupera os já criados da sessão do usuário

4

Seleciona qual JSP fará a montagem da página JSP e faz o redirecionamento. Os obj do modelo podem ser passados através do objeto request ou da sessão do usuário

5

6A página é enviada ao cliente

A página JSP selecionada acessa os obj do modelo para extrair as informações que serão exibidas na tela

9

�����"�#��������������������� �������������"�#��������������������� ��������

��� ���������!"����������� ������������� � �.��.�� ������ ��� ����� � �� ���� ����������� � �������� �����

���������������� �� �����&�������������" ����� ���� ���������������� � ���� ��� � ������ #

� �� ����������� �� ���$������������������ ������� ������� ������� ������ ������!�������!�������!�������!�������"�����34� *��� ���5,

������������������� ����������� ������������� � ������������� � ������������� � ������������� � �� �.� ��� �.� ��� �.� ��� �.� ��*��� ���6,

10

���������������� &����� '���������������� &����� '

Páginas JSP(Visão + controle)

JavaBeans

Banco de Dados(Modelo)

Requisição

Resposta

Servlet(Controle)

Requisição

JavaBeans(Modelo)

Páginas JSP(Visão)

Banco deDados

SelecionaVisão

Atualiza

Resposta

Model 1

Model 2

Baseado no padrão arquitetural MVC

11

($��������#������'�����($��������#������'�����

Operacao

executar():abstract

OperacaoIncluir

executar()

<< Servlet >>ServletControlador

<< JSP >>paginaErro

<< JSP >>inclusaoOk

<< JSP >>alteracaoOk

<< JSP >>exclusaoOk

<< Form HTML >>index

<< BeanFuncional >>DAO

<< BeanNegocio >>Usuario

Model

View

Control

Pacotes

incluir/alterar/excluir

Padrão de Projeto chamado Command. Consiste em usar polimorfismo para construir objetos que encapsulam um comando e oferecer um único método executar() com a implementação do comando a ser executado

Padrão de Projeto chamado Command. Consiste em usar polimorfismo para construir objetos que encapsulam um comando e oferecer um único método executar() com a implementação do comando a ser executado

OperacaoAlterar

executar()

OperacaoExcluir

executar()

BD

executa

estende

Grava/recupera

despacha

usa

usa

depende

12

(������������� ����(������������� ����

13

�#�$)*����#�$)*���

<html>

<head> <title>Demo MVC</title></head>

<body>

<form name="form1" method="POST" action="/exemplo_mvcweb/servlet/controle/Controlador">

Nome: <input name="nome" type="text" id="nome"> Idade:<input name="idade" type="text" id="idade"> CPF.: <input name="cpf" type="text" id="cpf">

<input name="cmd" type="submit" value="incluir">

<input name="cmd" type="submit" value="alterar">

<input name="cmd" type="submit" value="excluir">

</form>

</body>

</html>

14

+�� ���������,��)$���+�� ���������,��)$���

<web-app xmlns="http://java.sun.com/xml/ns/j2ee"xmlns:xsi=""xsi:schemaLocation="web-app_2_4.xsd“ version="2.4">

<servlet><servlet-name>Controlador</servlet-name><servlet-class>controle.ServletControlador</servlet-class></servlet><servlet-mapping><servlet-name>Controlador</servlet-name><url-pattern>/servlet/controle/Controlador</url-pattern></servlet-mapping><welcome-file-list><welcome-file>index.htm</welcome-file><welcome-file>index.html</welcome-file>

</welcome-file-list><error-page>

<error-code>404</error-code><location>/error.jsp</location>

</error-page></web-app>

15

-��#./��0���)1�%�-��#./��0���)1�%�

package modelo;

public class Usuario {

private String nome;

private String cpf;

private String idade;

public Usuario() { }

public Usuario(String nome, String cpf, String idade) {

this.nome = nome; this.cpf = cpf; this.idade = idade;

}

public String getCpf() { return cpf; }

public void setCpf(String cpf) {this.cpf = cpf; }

public String getIdade() { return idade; }

public void setIdade(String idade){this.idade = idade; }

public String getNome() {return nome; }

public void setNome(String nome) {this.nome = nome;}

}

16

-��#2�# ��#��-��#2�# ��#��

public class DAO {

public static void alterarUsuario(Usuario usuario) {

// TODO Auto-generated method stub

}

public static void incluirUsuario(Usuario usuario) {

// TODO Auto-generated method stub

}

public static void excluirUsuario(Usuario usuario) {

// TODO Auto-generated method stub

}

}

3������#�������4���������������� ������3������#�������4���������������� ������

package controle;import javax.servlet.http.HttpServletRequest;/*** Esta classe define um método abstrato executar que deverá* ser implementado nas subclasses concretas*/public abstract class Operacao {

private String proxPagina="/exemplo_mvcweb/paginaErro.jsp?msg=Operação sem redirecionamento";

public Operacao() { }public Operacao(String pagina) { this.proxPagina = pagina;}//este método deve ser implementado pelas operações filhaspublic abstract void executar(HttpServletRequest request)

throws Exception;public String getProxPagina() { return proxPagina; }public void setProxPagina(String novaPagina) { proxPagina = novaPagina; }

}17

package controle;import javax.servlet.http.HttpServletRequest;import modelo.DAO;import modelo.Usuario;public class OperacaoIncluir extends Operacao {

public void executar(HttpServletRequest req) throws Exception {

try {// Instancia um usuário com as informações do formulárioUsuario usuario = new Usuario(req.getParameter("nome"),

req.getParameter("cpf"), req.getParameter("idade"));

// Utiliza o bean DAO para acessar o bancoDAO.incluirUsuario(usuario);// Indica a próxima página a ser apresentadasetProxPagina("/inclusaoOk.jsp");request.setAttribute("usuario", usuario);

} catch(Exception e) {setProxPagina("/exemplo_mvcweb/paginaErro.jsp?msg="

+ e.getMessage());} }

}

3������#�������4���������������� ������3������#�������4���������������� ������

18

package controle;import javax.servlet.http.HttpServletRequest;import modelo.DAO;import modelo.Usuario;public class OperacaoAlterar extends Operacao {

public void executar(HttpServletRequest req) throws Exception {

try {// Instancia um usuário com as informações do formulárioUsuario usuario = new Usuario(req.getParameter("nome"),

req.getParameter("cpf"), req.getParameter("idade"));

// Utiliza o bean DAO para acessar o bancoDAO.alterarUsuario(usuario);// Indica a próxima página a ser apresentadasetProxPagina("/alteracaoOk.jsp");request.setAttribute("usuario", usuario);

} catch(Exception e) {setProxPagina("/exemplo_mvcweb/paginaErro.jsp?msg="

+ e.getMessage());}}

}

3������#�������4���������������� ������3������#�������4���������������� ������

19

package controle;import javax.servlet.http.HttpServletRequest;import modelo.DAO;import modelo.Usuario;public class OperacaoExcluir extends Operacao {

public void executar(HttpServletRequest req) throws Exception {

try {// Instancia um usuário com as informações do formulárioUsuario usuario = new Usuario(req.getParameter("nome"),

req.getParameter("cpf"), req.getParameter("idade"));

// Utiliza o bean DAO para acessar o bancoDAO.excluirUsuario(usuario);// Indica a próxima página a ser apresentadasetProxPagina("/exclusaoOk.jsp");request.setAttribute("usuario", usuario);

} catch(Exception e) {setProxPagina("/exemplo_mvcweb/paginaErro.jsp?msg="

+ e.getMessage());}}

}

3������#�������4���������������� ������3������#�������4���������������� ������

20

package controle;. . .public final class ServletControlador extends HttpServlet {// O conjunto de operações disponíveis neste controlador fica// armazenado em um HashMapprivate HashMap mapOperacoes = new HashMap();private ServletContext contexto;

/*** Este método é usado para cadastrar as operações do * controlador. A cada operação associa um nome no HashMap* que será usado mais tarde para realizar uma busca*/public void init(ServletConfig config) throws ServletException{

super.init(config);contexto = config.getServletContext();mapOperacoes.put("incluir", new OperacaoIncluir());mapOperacoes.put("alterar", new OperacaoAlterar());mapOperacoes.put("excluir", new OperacaoExcluir());

}

���%�����#��������&�5����%�����#��������&�5�

21

public void service(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {

String strOp = request.getParameter("cmd");Operacao operacao = null;if (strOp == null) {

redireciona("/exemplo_mvcweb/paginaErro.jsp?msg=Atividade não encontrada", request, response);

}// Tenta localizar a atividade correspondente ao // comando recebido e executá-lotry {

operacao = getOperacao(strOp);operacao.executar(request);

} catch (Exception e) {// redireciona para a página de errothis.redireciona("/exemplo_mvcweb/paginaErro.jsp

?msg=“ + e.getMessage(), request, response);}

// caso esteja tudo certo, redireciona para a página apropriadathis.redireciona(operacao.getProxPagina(), request, response);

}}

���%�����#��������'�5����%�����#��������'�5�

22

// Método utilizado para localizar uma operação no HashMap

public Operacao getOperacao(String strOp) throws Exception {

if (strOp == null) {

throw new Exception("String null recebida");

}

Operacao objOp = (Operacao) mapOperacoes.get(strOp);

if(objOp == null) {

throw new Exception("Operação não definida");

} else return objOp;

}

private void redireciona(String pagina, HttpServletRequest request,

HttpServletResponse response)

throws IOException, ServletException {

// Transfere o controle para a página especificada na string // [pagina]

RequestDispatcher rd = contexto.getRequestDispatcher(pagina);

rd.forward(request, response);

}

���%�����#��������5�5����%�����#��������5�5�

23

24

�# �����46)1���# �����46)1��

<%@ page language ="java" %>

<%@ page import = "modelo.Usuario" %>

<html> <head><title>Inclusão</title></head>

<body>

<%--

<jsp:useBean id="usuario" scope="request" class="Usuario"/>

Inclusão do Usuário: <jsp:getProperty name="usuario" property = "nome"/> Ok.

--%>

<%--

<% Usuario usuario = (Usuario)(request.getAttribute("usuario"));%>

Inclusão do Usuário: <%= usuario.getNome()%> Ok.

--%>

<jsp:useBean id="usuario" scope="request" class="Usuario"/>

Inclusão do Usuário: ${usuario.nome} Ok.

</body></html>

Gera o mesmo resultado

24