45
Java para Web com Struts Danilo Toshiaki Sato [email protected] Treinamento ALESP – SPL Módulo II

Java para Web com Struts

  • Upload
    arvid

  • View
    42

  • Download
    0

Embed Size (px)

DESCRIPTION

Java para Web com Struts. Danilo Toshiaki Sato [email protected] Treinamento ALESP – SPL Módulo II. Agenda - Módulo II. Recapitulando... Construindo o Model JavaBeans e escopo ActionForm DTO Lógica de negócio Construindo o Controller O ActionServlet O ActionMapping - PowerPoint PPT Presentation

Citation preview

Page 1: Java para Web com Struts

Java para Web com Struts

Danilo Toshiaki [email protected]

Treinamento ALESP – SPLMódulo II

Page 2: Java para Web com Struts

Copyleft 2006 Danilo Sato 2

Agenda - Módulo II

1. Recapitulando...2. Construindo o Model

1. JavaBeans e escopo2. ActionForm3. DTO4. Lógica de negócio

3. Construindo o Controller1. O ActionServlet2. O ActionMapping3. O ActionForward4. A Action

Page 3: Java para Web com Struts

Copyleft 2006 Danilo Sato 3

Recapitulando...

Fluxo Básico de Controle

ModelController

Page 4: Java para Web com Struts

Copyleft 2006 Danilo Sato 4

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)

Page 5: Java para Web com Struts

Copyleft 2006 Danilo Sato 5

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"/>

Page 6: Java para Web com Struts

Copyleft 2006 Danilo Sato 6

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

Page 7: Java para Web com Struts

Copyleft 2006 Danilo Sato 7

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)

Page 8: Java para Web com Struts

Copyleft 2006 Danilo Sato 8

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

Page 9: Java para Web com Struts

Copyleft 2006 Danilo Sato 9

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 HTML2. O controlador busca o ActionMapping associado

à URL requisitada3. O ActionMapping define o ActionForm e o Action

associados à requisição4. O controlador verifica se uma instância do

ActionForm já existe no escopo configurado5. Se a instância não existe, ela é criada e

armazenada no escopo correspondente

Page 10: Java para Web com Struts

Copyleft 2006 Danilo Sato 10

Construindo o Model6. 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()

Page 11: Java para Web com Struts

Copyleft 2006 Danilo Sato 11

Construindo o Model

Exemplo: ActionForm simplespackage 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() ...}

Page 12: Java para Web com Struts

Copyleft 2006 Danilo Sato 12

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; } // (...)

Page 13: Java para Web com Struts

Copyleft 2006 Danilo Sato 13

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"/>(...)

Page 14: Java para Web com Struts

Copyleft 2006 Danilo Sato 14

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)"/>

Page 15: Java para Web com Struts

Copyleft 2006 Danilo Sato 15

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

Page 16: Java para Web com Struts

Copyleft 2006 Danilo Sato 16

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>(...)

Page 17: Java para Web com Struts

Copyleft 2006 Danilo Sato 17

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

Page 18: Java para Web com Struts

Copyleft 2006 Danilo Sato 18

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

Page 19: Java para Web com Struts

Copyleft 2006 Danilo Sato 19

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

Page 20: Java para Web com Struts

Copyleft 2006 Danilo Sato 20

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

Page 21: Java para Web com Struts

Copyleft 2006 Danilo Sato 21

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

Page 22: Java para Web com Struts

Copyleft 2006 Danilo Sato 22

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

Page 23: Java para Web com Struts

Copyleft 2006 Danilo Sato 23

Construindo o Controller

ActionServletRequestProcessor

<form-beans> <form-bean .../> ...</form-beans>

<action-mappings> <action .../> ...</action-mappings>

Action

ActionForm

HttpRequest process() execute()

findMapping()

findFormBean()

Page 24: Java para Web com Struts

Copyleft 2006 Danilo Sato 24

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

Page 25: Java para Web com Struts

Copyleft 2006 Danilo Sato 25

Construindo o Controller ActionMappings são definidas no

arquivo de configuração do Struts Possíveis configurações de

mapeamento:1. Um Action, Um ActionForm2. Somente ActionForm3. Somente Action4. Somente JSP5. Dois Actions, Um ActionForm6. Dois Actions, Dois ActionForms

Page 26: Java para Web com Struts

Copyleft 2006 Danilo Sato 26

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>

Page 27: Java para Web com Struts

Copyleft 2006 Danilo Sato 27

Construindo o Controller

1. Um Action, Um ActionForm

Page 28: Java para Web com Struts

Copyleft 2006 Danilo Sato 28

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"/>

Page 29: Java para Web com Struts

Copyleft 2006 Danilo Sato 29

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>

Page 30: Java para Web com Struts

Copyleft 2006 Danilo Sato 30

Construindo o Controller

4. Somente JSP<action path ="/JSPOnlyAction" type ="org.apache.struts.actions.ForwardAction" parameter="/jsp/viewResult.jsp"/>

Page 31: Java para Web com Struts

Copyleft 2006 Danilo Sato 31

Construindo o Controller

5. Dois Actions, 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>

Page 32: Java para Web com Struts

Copyleft 2006 Danilo Sato 32

Construindo o Controller

5. Dois Actions, Um ActionForm

Page 33: Java para Web com Struts

Copyleft 2006 Danilo Sato 33

Construindo o Controller

6. Dois Actions, Dois ActionForms<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>

Page 34: Java para Web com Struts

Copyleft 2006 Danilo Sato 34

Construindo o Controller

6. Dois Actions, Dois ActionForms

Page 35: Java para Web com Struts

Copyleft 2006 Danilo Sato 35

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

Page 36: Java para Web com Struts

Copyleft 2006 Danilo Sato 36

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

ActionForwards 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

Page 37: Java para Web com Struts

Copyleft 2006 Danilo Sato 37

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>

Page 38: Java para Web com Struts

Copyleft 2006 Danilo Sato 38

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”

Page 39: Java para Web com Struts

Copyleft 2006 Danilo Sato 39

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

Page 40: Java para Web com Struts

Copyleft 2006 Danilo Sato 40

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;

Page 41: Java para Web com Struts

Copyleft 2006 Danilo Sato 41

Construindo o Controller Exemplo: Actionpackage 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() ...}

Page 42: Java para Web com Struts

Copyleft 2006 Danilo Sato 42

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); } // (...)

Page 43: Java para Web com Struts

Copyleft 2006 Danilo Sato 43

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>

Page 44: Java para Web com Struts

Copyleft 2006 Danilo Sato 44

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

Page 45: Java para Web com Struts

Copyleft 2006 Danilo Sato 45

Dúvidas ou Sugestões?