Java para Web com Struts: Módulo II - Construindo o Model e o Controller

Java para Web com Struts: Módulo II - Construindo o Model e o Controller
paly

O treinamento oferecido por Danilo Toshiaki Sato, disponibilizado pela ALESP e SPL,

  • Uploaded on | 0 Views
  • joachim joachim

About Java para Web com Struts: Módulo II - Construindo o Model e o Controller

PowerPoint presentation about 'Java para Web com Struts: Módulo II - Construindo o Model e o Controller'. This presentation describes the topic on O treinamento oferecido por Danilo Toshiaki Sato, disponibilizado pela ALESP e SPL,. The key topics included in this slideshow are . Download this presentation absolutely free.

Presentation Transcript


Slide1Java para Web com StrutsDanilo Toshiaki Sato dtsato@ime.usp.br Treinamento ALESP – SPL Módulo II

Slide2Copyleft 2006 Danilo Sato2 Agenda - Módulo II 1. Recapitulando... 2. Construindo o  Model 1. JavaBeans e escopo 2. ActionForm 3. DTO 4. Lógica de negócio 3. Construindo o  Controller 1. O  ActionServlet 2. O  ActionMapping 3. O  ActionForward 4. A  Action

Slide3Copyleft 2006 Danilo Sato3 Recapitulando...  Fluxo Básico de Controle Model Controller

Slide4Copyleft 2006 Danilo Sato4 Construindo o  Model  JavaBeans e escopo:  Numa aplicação web, os JavaBeans podem ser armazenados em diferentes escopos:  page : Beans visíveis apenas na página JSP (Variáveis locais no  service() )  request : Beans visíveis na página JSP e qualquer outra página ou Servlet incluído ou encaminhado a partir dessa página (atributos do  HttpServletRequest )  session : Beans visíveis em todos os Servlets e JSPs que participam de uma determinada sessão de usuário (atributos da  HttpSession )

Slide5Copyleft 2006 Danilo Sato5 Construindo o  Model  application : Beans visíveis em todos os Servlets e JSPs de uma mesma aplicação web (atributos do  ServletContext )  Exemplo:  Bean armazenado no request pelo Servlet:  Pode ser usado imediatamente num JSP encaminhado pelo Servlet:   MyCart myCart =  new  MyCart(...); request.setAttribute( "cart" , myCart); <jsp:useBean   id = "cart"   scope = "request" class = "com.mycompany.myApp.MyCart" />

Slide6Copyleft 2006 Danilo Sato6 Construindo o  Model  ActionForm  É um tipo especial de JavaBeans  Utilizado para armazenar os dados de entrada digitados pelo usuário num formulário HTML  Pode ser usado pelas Tags do Struts para mostrar os valores previamente digitados pelo usuário no caso de erro  Validação automática dos campos  Populado automaticamente pelo Struts

Slide7Copyleft 2006 Danilo Sato7 Construindo o  Model  Para criar um  ActionForm  você deve:  Estender a classe org.apache.struts.action.ActionForm  Definir uma propriedade pública para cada campo do formulário HTML que será enviado na requisição HTTP  OBS: Nesse contexto, considere “propriedade pública” como uma propriedade JavaBean (métodos  getter  e  setter )

Slide8Copyleft 2006 Danilo Sato8 Construindo o  Model  Ao criar um  ActionForm  você pode:  Sobrescrever o método  validate()  para validação dos campos de entrada do formulário  Sobrescrever o método  reset()  para limpar e inicializar os dados de um ActionForm

Slide9Copyleft 2006 Danilo Sato9 Construindo o  Model  O papel do  ActionForm  no ciclo de uma requisição: 1. O controlador do Struts recebe uma requisição HTTP com parâmetros do formulário HTML 2. O controlador busca o  ActionMapping  associado à URL requisitada 3. O  ActionMapping  define o  ActionForm  e o  Action associados à requisição 4. O controlador verifica se uma instância do ActionForm  já existe no escopo configurado 5. Se a instância não existe, ela é criada e armazenada no escopo correspondente

Slide10Copyleft 2006 Danilo Sato10 Construindo o  Model 6. O método reset() é chamado (implementação padrão não faz nada) 7. Para cada parâmetro HTTP cujo nome corresponde à uma propriedade do Bean, o método  setter  correspondente será chamado 8. O método  validate()  é chamado se o valor do atributo " validate " não for " false " no ActionMapping 9. Caso o  ActionForm  encontre erros de validação, ActionErrors  são armazenados no request e o controle é encaminhado para o formulário de entrada (atributo " input " do  ActionMapping ) 10. Caso não haja erros, o fluxo é encaminhado para a  Action  atrávés do método  execute()

Slide11Copyleft 2006 Danilo Sato11 Construindo o  Model  Exemplo:  ActionForm  simples package  app; import  org.apache.struts.action.*; public class  MeuForm  extends  ActionForm {    private  String nome =  null ;    public  String getNome() {      return   this .nome;   }    public void  setNome(String nome) {      this .nome = nome;   }    // Método validate() ...    // Método reset() ... }

Slide12Copyleft 2006 Danilo Sato12 Construindo o  Model  Exemplo: Método  validate()    // (...)   // Valida se nome não é nulo nem vazio    public  ActionErrors validate(ActionMapping mapping,                           HttpServletRequest request) {      ActionErrors errors =  new  ActionErrors();     if  (nome ==  null  || nome.trim().length() == 0) {       errors.add( "nome" ,                   new  ActionError( "erro.nome.invalido" );     }      return  errors;   }    // (...)

Slide13Copyleft 2006 Danilo Sato13 Construindo o  Model  Exemplo: Método  reset()  Arquivo de Configuração    // (...)   // Inicializa o valor do nome com o valor nulo    public   void  reset(ActionMapping mapping,                           HttpServletRequest request) {     this .nome =  null ;   }    // (...) (...) <form-bean  name = "meuForm"   type = "app.MeuForm" /> (...)

Slide14Copyleft 2006 Danilo Sato14 Construindo o  Model  Outras características do  ActionForm :  Permitem acesso à propriedades aninhadas:  Suporte à propriedades de mapeamento (Map) <html:text  property = “valores.telefoneFormatado" /> aForm.getValores().getTelefoneFormatado() public void  setEndereco(String nome, Object valor) public  Object getEndereco(String nome) <html:text  property = "endereco(nome)" />

Slide15Copyleft 2006 Danilo Sato15 Construindo o  Model  DynaActionForm  Uma forma de definir um  ActionForm sem escrever uma classe  Propriedades são declaradas no arquivo de configuração  Baseado no componente  DynaBean  do Jakarta Commons  Desvantagem: você não tem controle sobre o método  reset() , os campos serão atualizados para os valores padrão

Slide16Copyleft 2006 Danilo Sato16 Construindo o  Model  Exemplo:  DynaActionForm  Arquivo de Configuração: (...) <form-bean  name = "meuForm"        type = "org.apache.struts.action.DynaActionForm" >   <form-property          name = "nome"          type = "java.lang.String" /> </form-bean> (...)

Slide17Copyleft 2006 Danilo Sato17 Construindo o  Model  DTO =  Data Transfer Object  É um padrão de projeto que define um objeto responsável por levar dados entre as diferentes camadas e/ou componentes de um sistema  Diminui a quantidade de chamadas de método entre as camadas  Também conhecido como  Value Object  na comunidade Java

Slide18Copyleft 2006 Danilo Sato18 Construindo o  Model  Um pouco sobre lógica de negócio:  Dentre as responsabilidades do  Model  de um sistema, podemos destacar:  Armazenar o estado do sistema  Executar a lógica e regras de negócio  No contexto da nossa discussão, o  Model  no Struts refere-se à uma representação do estado do sistema numa aplicação web  Podemos enxergar os  ActionForms  como DTOs  Os dados do  ActionForms  geralmente são mapeados para mais de uma entidade persistida pelo sistema

Slide19Copyleft 2006 Danilo Sato19 Construindo o  Model  Um pouco sobre lógica de negócio:  Apesar do Struts não colocar nenhuma restrição, recomenda-se que a lógica de negócio esteja desacoplada da camada de apresentação  Uma camada de negócio desacoplada pode ser reutilizada em outras aplicações (inclusive não- web)  Validações simples são permitidas no  View (Exemplo: scripts JavaScript)  Recomendação : Não colocar lógica de negócio no  Action

Slide20Copyleft 2006 Danilo Sato20 Construindo o  Controller  O Struts fornece um Servlet ( ActionServlet ) que atua como controlador central para:  Processar requisições de usuários  Determinar os objetivos do usuário para aquela requisição  Obter dados do  Model  para disponibilizar na  View  Escolher a  View  apropriada para exibição ao usuário

Slide21Copyleft 2006 Danilo Sato21 Construindo o  Controller  Grande parte do trabalho do ActionServlet  é delegado para o RequestProcessor  O  ActionServlet  é responsável por:  Inicialização e limpeza de recursos  Determinar qual módulo responsável pelo tratamento da requisição  Encaminhar a requisição para o RequestProcessor  do módulo

Slide22Copyleft 2006 Danilo Sato22 Construindo o  Controller  O  RequestProcessor  é responsável pela maior parte do trabalho do Controller  Extensível através de métodos “gancho” ( hook methods ) – Exemplo:  setUp()  no JUnit  Responsabilidades básicas:  Encontrar a  Action  responsável pela URL  Popular e validar o  ActionForm  Tratamento de erros  Tratamento de permissões e segurança  Encaminhar processamento para a  Action

Slide23Copyleft 2006 Danilo Sato23 Construindo o  Controller ActionServlet RequestProcessor <form-beans>   <form-bean .../>    ... </form-beans> <action-mappings>   <action .../>    ... </action-mappings> Action ActionForm HttpRequest process() execute() findMapping() findFormBean()

Slide24Copyleft 2006 Danilo Sato24 Construindo o  Controller  Um  ActionMapping  representa uma configuração de mapeamento entre uma URI e uma classe  Action  Propriedades mais importantes:  type : Nome da classe da  Action  name : Nome do  ActionForm  a ser utilizado  path : a URI requisitada  unkown : deve ser " true " para a  Action  default  validate : deve ser " true " se o  ActionForm deve ser validado  forward : uma URI para onde a requisição será encaminhada

Slide25Copyleft 2006 Danilo Sato25 Construindo o  Controller  ActionMapping s são definidas no arquivo de configuração do Struts  Possíveis configurações de mapeamento: 1. Um  Action , Um  ActionForm 2. Somente  ActionForm 3. Somente  Action 4. Somente JSP 5. Dois  Action s, Um  ActionForm 6. Dois  Action s, Dois  ActionForm s

Slide26Copyleft 2006 Danilo Sato26 Construindo o  Controller 1. Um  Action , Um  ActionForm <action  path   =  "/fullAction"          type   =  "com.acme.struts.MyAction"          name   =  "myForm"          input  =  "/jsp/dataError.jsp" >   <forward  name = "OK"   path = "/jsp/viewResult.jsp" />   <forward  name = "ERROR"   path = "/jsp/busError.jsp" /> </action>

Slide27Copyleft 2006 Danilo Sato27 Construindo o  Controller 1. Um  Action , Um  ActionForm

Slide28Copyleft 2006 Danilo Sato28 Construindo o  Controller 2. Somente  ActionForm <action  path   = "/formOnlyAction"          type   = "org.apache.struts.actions.ForwardAction"          name   = "myForm"          input  = "/jsp/error.jsp"          parameter = "/jsp/viewResult.jsp" />

Slide29Copyleft 2006 Danilo Sato29 Construindo o  Controller 3. Somente  Action <action  path   = "/actionOnlyAction"          type   = "com.acme.struts.MyAction"          input  = "/jsp/error.jsp" >   <forward  name = "OK"   path = "viewResult.do" />   <forward  name = "ERROR"   path = "/jsp/error.jsp" /> </action>

Slide30Copyleft 2006 Danilo Sato30 Construindo o  Controller 4. Somente JSP <action  path   = "/JSPOnlyAction"          type   = "org.apache.struts.actions.ForwardAction"         parameter = "/jsp/viewResult.jsp" />

Slide31Copyleft 2006 Danilo Sato31 Construindo o  Controller 5. Dois  Action s, Um  ActionForm <action  path   =  "/sourceAction"          type   =  "com.acme.struts.MyAction1"          name   =  "myForm"          input  =  "/jsp/error1.jsp" >   <forward  name = "OK"   path = "/targetAction.do" /> </action> <action  path   =  "/targetAction"          type   =  "com.acme.struts.MyAction2"          name   =  "myForm"          input  =  "/jsp/error2.jsp" >   <forward  name = "OK"   path = "/jsp/viewTarget.jsp" /> </action>

Slide32Copyleft 2006 Danilo Sato32 Construindo o  Controller 5. Dois  Action s, Um  ActionForm

Slide33Copyleft 2006 Danilo Sato33 Construindo o  Controller 6. Dois  Action s, Dois  ActionForm s <action  path   =  "/inputAction"          type   =  "com.acme.struts.MyAction1"          name   =  "inputForm"          input  =  "/jsp/error1.jsp" >   <forward  name = "OK“            path = "/outputAction.do"  redirect = "true" /> </action> <action  path   =  "/outputAction"          type   =  "com.acme.struts.MyAction2"          name   =  "outputForm"          input  =  "/jsp/error2.jsp" >   <forward  name = "OK"   path = "/jsp/viewTarget.jsp" /> </action>

Slide34Copyleft 2006 Danilo Sato34 Construindo o  Controller 6. Dois  Action s, Dois  ActionForm s

Slide35Copyleft 2006 Danilo Sato35 Construindo o  Controller  Um  ActionForward  representa uma URI sob um nome lógico  Definidos no arquivo de configuração do Struts  Utilizados na  Action  para definir para onde a requisição deve ser encaminhada  Vantagens:  Evitam URIs “hardcoded” na aplicação  Estrutura de navegação declarativa, documentada no  struts-config.xml

Slide36Copyleft 2006 Danilo Sato36 Construindo o  Controller  Diferença entre  forward  e  redirect :  forward : mantém a requisição HTTP no contexto da aplicação no servidor  redirect : instrui o cliente (navegador) a fazer uma nova requisição HTTP  ActionForward s podem ser globais ( <global-forwards> ) ou locais a um ActionMapping (corpo da tag  <action> )  Para buscar um  ActionForward  na  Action :  mapping.findForward( "nome.do.forward" );  Recomendação : redirecionar a página inicial para uma  Action

Slide37Copyleft 2006 Danilo Sato37 Construindo o  Controller  Exemplos: <global-forwards>    <!-- ActionForward Global -->   <forward  name = "erro.generico"             path = "/jsp/genericError.jsp" /> </global-forwards> <action-mappings>   <action  (...) >      <!-- ActionForward Local -->     <forward  name = "OK"               path = "viewResult.do"               redirect = "true" />   </action> </action-mappings>

Slide38Copyleft 2006 Danilo Sato38 Construindo o  Controller  As classes  Action  implementam a lógica específica de cada aplicação  Seu objetivo é processar uma requisição e retornar um ActionForward  indicando para onde o controle deve ser encaminhado  É o centro da arquitetura do Struts  Analogia: “mini-servlet”

Slide39Copyleft 2006 Danilo Sato39 Construindo o  Controller  Algumas das funcionalidades implementadas na  Action :  Validar o estado atual da sessão (Ex: login)  Validação das propriedades do  ActionForm necessárias  Chamar métodos com lógica de negócio  Atualizar o estado do sistema  Atualizar objetos no servidor para utilização nos próximos passos do processamento (escopo de request  e  session , geralmente)  Tratar erros no processamento  Determinar a página de exibição e retornar o ActionForward  correspondente

Slide40Copyleft 2006 Danilo Sato40 Construindo o  Controller  Para implementar um  Action :  Estender a classe org.apache.struts.action.Action  ou uma de suas subclasses disponibilizadas do Struts  Implementar o método: public  ActionForward execute(     ActionMapping mapping,     ActionForm form,     HttpServletRequest request,     HttpServletResponse response)    throws  Exception;

Slide41Copyleft 2006 Danilo Sato41 Construindo o  Controller  Exemplo:  Action package  app; // Import Struts classes ... public class  MeuAction  extends  Action {    public  ActionForward execute(ActionMapping mapping,       ActionForm form, HttpServletRequest request,       HttpServletResponse response)  throws  Exception {     MeuForm meuForm = (MeuForm) form;     String usuario = validaUsuario(meuForm);     HttpSession session = request.getSession();     session.setAttribute( "USUARIO" , usuario);      return  mapping.findForward( "OK" );   }   // Método validaUsuario() ... }

Slide42Copyleft 2006 Danilo Sato42 Construindo o  Controller  Exemplo: Método  validaUsuario()    // (...)   // Valida se usuário existe com o nome informado    private  String validaUsuario(MeuForm form)        throws  UsuarioInvalidoException {     String nome = form.getNome();      try  {       LDAPDirectory auth = LDAPDirectory.getInstance();        return  auth.validateUser(nome);      catch  (Exception e) {        throw new  UsuarioInvalidoException(nome);   }    // (...)

Slide43Copyleft 2006 Danilo Sato43 Construindo o  Controller  Exemplo:  struts-config.xml <action  path   =  "/login"          type   =  "app.MeuAction"          name   =  "meuForm"          input  =  "/jsp/validateError.jsp" >   <forward  name = "OK"   path = "/jsp/viewResult.jsp" />   <exception  key = "erro.usuario.invalido"               type = "app.UsuarioInvalidoException"               path = "/jsp/loginError.jsp" /> </action>

Slide44Copyleft 2006 Danilo Sato44 Construindo o  Controller  Algumas recomendações:  Pense na concorrência quando escrever uma  Action  Trate erros. Evite mostrar exceções para o usuário  Evite usar o método  perform()  do Struts 1.0  O Struts 1.1 define o método  execute() que lança  Exception  e facilita o tratamento de erros declarativo

Slide45Copyleft 2006 Danilo Sato45 Dúvidas ou Sugestões?