!"# # #$ %!" "& ' ( 2
) *+, - 3
. / 4
!" 0( # "!#. %! $""! # " #.- $ 111.&( ( 5
# # 0. " % * $(, 2 % $.& " 6
# #$ %% Modelo (Encapsula o estado da aplicação) Implementado como JavaBeans Responde a consulta de estado E criado pelo controlador que preenche o seu conteúdo Controlador (Define comportamento da app) Implementado como Servlet Recebe os dados do cliente Instancia os beans da camada de modelo Processa as informações Seleciona o visualizador adequado à resposta (JSP) Visualizador (Constrói e atualiza o modelo) Implementado com JSP Recebe os dados do cliente Acessa o modelo para extrair as informações Formata a página de saída 7
O atributo action da tag do form aponta para um Servlet que receberá as informações Form HTML Modelo (Encapsula o estado da aplicação) Implementado como JavaBeans E criado pelo controlador que preenche o seu conteúdo Página HTML 1 A servlet instancia os beans do modelo ou recupera os já criados da sessão do usuário Controlador (Define comportamento da app) Implementado como Servlet Recebe os dados do cliente Instancia os beans da camada de modelo Processa as informações Seleciona o visualizador adequado à resposta (JSP) 3 A página JSP selecionada acessa os obj do modelo para extrair as informações que serão exibidas na tela 6 5 A página é enviada ao cliente 4 Quando necessário a servlet usa o bean funcional para armazenar ou recuperar as informações Bean Funcional Banco de Dados 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 Visualizador (Constrói e atualiza o modelo) Implementado como JSP Recebe os dados do cliente Acessa o modelo para extrair as informações Formata a página de saída 2
"#!".. & " # $!!"34*5,..*6, 9
& ' Requisição Páginas JSP (Visão + controle) Model 1 Resposta JavaBeans (Modelo) Banco de Dados Requisição Servlet (Controle) Atualiza Model 2 Resposta Seleciona Visão Páginas JSP (Visão) JavaBeans (Modelo) Banco de Dados Baseado no padrão arquitetural MVC 10
($ # ' Pacotes Model View << JSP >> paginaerro << Form HTML >> index << BeanFuncional >> DAO Control << JSP >> inclusaook << JSP >> alteracaook << JSP >> exclusaook despacha incluir/alterar/excluir << Servlet >> ServletControlador executa Operacao executar():abstract usa usa depende << BeanNegocio >> Usuario Grava/recupera BD Padrão Padrão de de Projeto Projeto chamado chamado Command. Command. Consiste Consiste em em usar usar polimorfismo polimorfismo para para construir construir objetos objetos que que encapsulam encapsulam um um comando comando e e oferecer oferecer um um único único método método executar() executar() com com a a implementação implementação do do comando comando a a ser ser executado executado estende OperacaoIncluir OperacaoAlterar OperacaoExcluir executar() executar() executar() 11
( 12
#$)* <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> 13
+,)$ <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> 14
-#. /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; 15
-#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 16
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 filhas public abstract void executar(httpservletrequest request) throws Exception; public String getproxpagina() { return proxpagina; public void setproxpagina(string novapagina) { proxpagina = novapagina; 17
3# 4 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ário Usuario usuario = new Usuario(req.getParameter("nome"), req.getparameter("cpf"), req.getparameter("idade")); // Utiliza o bean DAO para acessar o banco DAO.incluirUsuario(usuario); // Indica a próxima página a ser apresentada setproxpagina("/inclusaook.jsp"); request.setattribute("usuario", usuario); catch(exception e) { setproxpagina("/exemplo_mvcweb/paginaerro.jsp?msg=" + e.getmessage()); 18
3# 4 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ário Usuario usuario = new Usuario(req.getParameter("nome"), req.getparameter("cpf"), req.getparameter("idade")); // Utiliza o bean DAO para acessar o banco DAO.alterarUsuario(usuario); // Indica a próxima página a ser apresentada setproxpagina("/alteracaook.jsp"); request.setattribute("usuario", usuario); catch(exception e) { setproxpagina("/exemplo_mvcweb/paginaerro.jsp?msg=" + e.getmessage()); 19
3# 4 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ário Usuario usuario = new Usuario(req.getParameter("nome"), req.getparameter("cpf"), req.getparameter("idade")); // Utiliza o bean DAO para acessar o banco DAO.excluirUsuario(usuario); // Indica a próxima página a ser apresentada setproxpagina("/exclusaook.jsp"); request.setattribute("usuario", usuario); catch(exception e) { setproxpagina("/exemplo_mvcweb/paginaerro.jsp?msg=" + e.getmessage()); 20
% # &5 package controle;... public final class ServletControlador extends HttpServlet { // O conjunto de operações disponíveis neste controlador fica // armazenado em um HashMap private 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()); 21
% # '5 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á-lo try { operacao = getoperacao(strop); operacao.executar(request); catch (Exception e) { // redireciona para a página de erro this.redireciona("/exemplo_mvcweb/paginaerro.jsp?msg= + e.getmessage(), request, response); // caso esteja tudo certo, redireciona para a página apropriada this.redireciona(operacao.getproxpagina(), request, response); 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, % # 55 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); 23
#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