Relatório do GPES. Conhecendo o Framework Struts



Documentos relacionados
J550. Apache Struts. Helder da Rocha

Arquitetura de Aplicações JSP/Web. Padrão Arquitetural MVC

Minicurso de MVC web com Struts. Felipe F Nascimento felipenasc@inf.puc-rio.br

Curso de Introdução ao

!" # # # $ %!" " & ' ( 2

Java para Desenvolvimento Web

Aula 03 - Projeto Java Web

Universidade da Beira Interior

Java para WEB. Servlets

Use a Cabeça! FREEMAN, Eric e Elisabeth. HTML com CSS e XHTML BASHMAN, Brian / SIERRA Kathy / BATES, Bert. Servlets & JSP

Como criar um EJB. Criando um projeto EJB com um cliente WEB no Eclipse

Associação Carioca de Ensino Superior Centro Universitário Carioca

INTRODUÇÃO À TECNOLOGIA SERVLETS

Prof. Roberto Desenvolvimento Web Avançado

Acessando um Banco de Dados

1. Introdução pág.3 2. Apresentação do sistema Joomla! pág.4 3. Acessando a administração do site pág.4 4. Artigos 4.1. Criando um Artigo 4.2.

DWR DIRECTED WEB REMOTING

Criação de Servlets Name Directory Build WAR JSP/Servlet frameworks Launch URL Package Class name Generate header comments

Programação Web. Professor: Diego Oliveira. Conteúdo 02: JSP e Servlets

4 O Workflow e a Máquina de Regras

Scriptlets e Formulários

Desenvolvimento WEB em JAVA. Palestrante: Lourival F. de Almeida Júnior

GUIA INTEGRA SERVICES E STATUS MONITOR

DESENVOLVENDO APLICAÇÃO UTILIZANDO JAVA SERVER FACES

Passo a Passo. WebSphere Message Broker. Fluxo como WebService

Java II. Sérgio Luiz Ruivace Cerqueira

ANDROID APPLICATION PROJECT

Configurar o Furbot no Eclipse

Curso de Aprendizado Industrial Desenvolvedor WEB

Desenvolvimento Web TCC Turma A-1

Sumário 1. SOBRE O NFGoiana DESKTOP Apresentação Informações do sistema Acessando o NFGoiana Desktop

Nota de Aula: Utilização da IDE Code::Blocks

Java II. Sérgio Luiz Ruivace Cerqueira

CONFIGURAÇÃO MINIMA EXIGIDA:

Curso - Padrões de Projeto Módulo 5: Model-View- Controller

TUTORIAL: MANTENDO O BANCO DE DADOS DE SEU SITE DENTRO DO DOMÍNIO DA USP USANDO O SSH!

Utilizando o correio eletrônico da UFJF com Thunderbird e IMAP

Manual de Publicaça o no Blog da Aça o TRIBOS nas Trilhas da Cidadania

DOCUMENTAÇÃO DO FRAMEWORK - versão 2.0

Manual do usuário. v1.0

Desenvolvimento de aplicação web com framework JavaServer Faces e Hibernate

WebWork 2. João Carlos Pinheiro.

Manual do sistema SMARsa Web

Revisão: Introdução. - Integração com o AutoManager; 1 Atualização de versão do banco de dados PostgreSQL

Prática Sobre Servlets e JSP

Instalando software MÉDICO Online no servidor

Novell. Novell Teaming 1.0. novdocx (pt-br) 6 April 2007 EXPLORAR O PORTLET BEM-VINDO DESCUBRA SEU CAMINHO USANDO O NOVELL TEAMING NAVIGATOR

Desenvolvimento Web TCC Turma A-1

Facebook. Java com o. Integrando Aplicações. Descubra como é fácil criar uma aplicação para rodar no Facebook. _capa

MANUAL DO ANIMAIL Terti Software

CONSTRUÇÃO DE BLOG COM O BLOGGER

MANUAL DE UTILIZAÇÃO SISTEMA DE CADASTRO INTRANET

Programando em PHP. Conceitos Básicos

Relatório do GPES. Descrição dos Programas e Plugins Utilizados. Programas Utilizados:

Gerenciamento de Contatos

Servlets e Applets, funcionamento e comparativo.

Integração de sistemas utilizando Web Services do tipo REST

MANUAL DO INSTAR-MAIL 1.0. Pagina de login e senha do Instar-Mail

Procedimentos para Reinstalação do Sisloc

Criação de um novo projeto no Eclipse utilizando Maven

( TIAGO DOS SANTOS MENDES ) PROGRAMAÇÃO DISPOSITIVOS MOVEIS ANDROID STUDIO

Programação Orientada a Objetos com PHP & MySQL Cookies e Sessões. Prof. MSc. Hugo Souza

Instalando o IIS 7 no Windows Server 2008

Instalando o IIS 7 no Windows Server 2008

MANUAL DE INSTALAÇÃO E CONFIGURAÇÃO. Motor Periférico Versão 8.0

BACKUP ONLINE PASSOS PARA CONFIGURAÇÃO INICIAL DO PRODUTO

Aula 4. Objetivos. Conteúdo dinâmico na internet.

Está apto a utilizar o sistema, o usuário que tenha conhecimentos básicos de informática e navegação na internet.

Manual de Utilização COPAMAIL. Zimbra Versão 8.0.2

Manual Ilustrado Menu Pronto Atendimento

NetBeans. Conhecendo um pouco da IDE

Sumário INTRODUÇÃO Acesso ao Ambiente do Aluno Ferramentas e Configurações Ver Perfil Modificar Perfil...

FACULDADE DE TECNOLOGIA SENAC GOIÁS PROGRAMAÇÃO PARA INTERNET TUTORIAL DE APLICAÇÃO JSF DESENVOLVIDO COM A FERRAMENTA ECLIPSE LUNA

WEBDESIGN. Professor: Paulo Marcos Trentin - paulo@paulotrentin.com.br Escola CDI de Videira

Aprenda como instalar o plugin EclipseUML no Eclipse e como utilizá-lo para fazer engenharia reversa de seu código-fonte.

18/04/2006 Micropagamento F2b Web Services Web rev 00

Esse manual é um conjunto de perguntas e respostas para usuários(as) do Joomla! 1.5.

ABORDAGEM DE FRAMEWORKS PARA JSF QUE AUXILIAM O DESENVOLVIMENTO DE SOFTWARE

Bem- Vindo ao manual de instruções do ECO Editor de COnteúdo.

Projeto SIGA-EPT. Manual do usuário Módulo Requisição de Almoxarifado SISTEMA INTEGRADO DE GESTÃO ACADÊMICA

1 REQUISITOS BÁSICOS PARA INSTALAR O SMS PC REMOTO

Procedimentos de Implantação ireport x Protheus

JDBC Java Database Connectivity

Sistemas Operacionais. Curso Técnico Integrado Profa: Michelle Nery

Passo a Passo: Reiniciar Senha do Contribuinte na Internet

Manual de Utilização ZENDESK. Instruções Básicas

MANUAL DO ADMINISTRADOR LOCAL. Entidade Municipal

GERENCIADOR DE CONTEÚDO

COMO INSTALAR ZIM 8.50 WINDOWS

WF Processos. Manual de Instruções

Como configurar s nos celulares. Ebook. Como configurar s no seu celular. W3alpha - Desenvolvimento e hospedagem na internet

Tutorial Instalação Dual Boot Ubuntu e Windows XP Virtualização com VirtualBox

Padrão Arquitetura em Camadas

V.1.0 SIAPAS. Sistema Integrado de Administração ao Plano de Assistência à Saúde. Contas Médicas

SPARK - Comunicador Instantâneo MANUAL DO USUÁRIO

Sistema de Prestação de Contas Siprec

Criando & Consumindo um WebService com ASP.NET 2.0 Publicado em: 25 de Agosto de 2007 Por Herman Ferdinando Arais

Criando uma agenda simples com NetBeans 6.5

Transcrição:

Relatório do GPES Relatório referente à criação da camada de regra de negócio com a utilização do Framework Struts para o desenvolvimento de um exemplo de Cadastro de Clientes. Conhecendo o Framework Struts Struts é um framework de aplicação, ou seja, uma aplicação que pode ser reutilizada, sendo semicompleta e podendo ser especializada para produzir aplicações personalizadas [1]. É um framework mantido pela Apache Software Foundation (ASF) [2] como parte do projeto Jakarta. A sua arquitetura foi desenvolvida baseada no Modelo 2 [3] que é uma variação do MVC (Model-View-Controller) ou Modelo-Visão-Controlador [4]. Foi originalmente criado para construir aplicações Smalltalk [5]. A principal diferença entre o MVC e o Modelo 2 é o fato da camada de apresentação comunicar-se diretamente com o modelo, ligação essa representada pelo padrão de notificação Observer [6]. Além do Struts o projeto Jakarta conta com outros projetos de fonte aberta como o Tomcat, Ant e o Velocity. A base do seu código fonte foi desenvolvida entre maio de 2000 e junho de 2001. O seu primeiro arquiteto e desenvolvedor foi Craig R. McClanahan, onde além do Struts ele também fez parte do desenvolvimento do Tomcat 4, atualmente esta trabalhando com o Java Server Faces (JSF) entre outros projetos [1]. O Struts está disponível para o público sob a licença Apache Software License [7], onde não existe nenhum custo para a sua utilização, podendo ser utilizado como base para um projeto comercializável sem nenhum custo pela sua utilização. O seu nome se deve ao fato do Struts ser utilizada por engenheiros de software como base para aplicações comerciais, assim como a base e a estrutura, que matem uma ponte ou um prédio [1]. O seu funcionamento é baseado em tecnologias já conhecidas como o Java Servlets [8], JavaBeans [9], JavaServer Pages (JSP) [10], Hypertext Transfer Protocol (HTML) [11] e Common Gateway Interface (CGI) [12] e o Extensible Markup Language (XML) [13]. A seguir será demonstrado o funcionamento básico do Framework Struts (Figura 1). 1

Figura 1: Funcionamento do Framework Struts [14] Abaixo será explicando cada ação que ocorre no funcionamento básico do Struts [14]: 1. O usuário faz uma solicitação através de uma url no browser. Ex: http://localhost:8080/cadastro/listusers.do. Note que no final da url tem um.do que será usado para invocar (na verdade mapear) o servlet controller do struts. 2. Se for a primeira solicitação que o container recebeu para esta aplicação, ele irá invocar o método init() da ActionServlet (controller do Struts) e irá carregar as configurações do arquivo struts-config.xml em estruturas de dados na memória. Vale lembrar que esta passagem só será executada uma única vez, pois nas solicitações subseqüentes, a servlet consulta estas estruturas na memória para decidir o fluxo a ser seguido. 3. Baseado no fluxo definido no arquivo struts-config.xml, e que neste momento já se encontra carregado em estruturas na memória, o ActionSerlet identificará qual o ActionForm (classe para a validação dos dados) irá invocar. A classe ActionForm através do método validate irá verificar a integridade dos dados que foram recebidos na solicitação que vem do browser. 4. O controle da aplicação é retomado pelo ActionServlet, que verifica o resultado do ActionForm. Se faltar alguma coisa (campo não preenchido, valor inválido, etc), o usuário recebe um formulário html (geralmente o mesmo que fez a solicitação), informando o motivo do não atendimento da solicitação, para que o usuário possa preencher corretamente os dados para fazer uma nova solicitação. Se não faltou nenhuma informação, ou seja, todos os dados foram enviados corretamente, o controle (controller) passa para o próximo passo (Action). 2

5. O ActionServlet, baseado no fluxo da aplicação (estruturas já carregadas em memória) invoca uma classe Action. A classe Action passará pelo método execute que irá delegar a requisição para a camada de negócio. 6. A camada de negócio irá executar algum processo (geralmente popular a um bean, ou uma coleção). O resultado da execução deste processo (objetos já populados) será usado na camada de apresentação para exibir os dados. 7. Quando o controle do fluxo da aplicação voltar ao Action que invocou o processo da camada de negócio, será analisado o resultado, e definido qual o mapa adotado para o fluxo da aplicação. Neste ponto, os objetos que foram populados na camada de negócio serão "atachados" como atributos na seção do usuário. 8. Baseado no mapeamento feito pelo o Action, o Controller faz um forward para o JSP para apresentar os dados. 9. Na camada de apresentação (View), os objetos que foram setados como atributos da sessão do usuário serão consultados para montar o html para o browser. 10. Chega o html da resposta requisitada pelo usuário. Componentes do Framework Struts Classes Básicas: ActionServlet: É a parte do Controller que recebe a requisição do usuário e envia a resposta; ActionForm: É uma classe que representa os campos dos formulários que será utilizado nas classes, implementando apenas os métodos reset e validate. Action: Geralmente responsável por validar a entrada dos dados, comunicar-se com a camada de persistência e retornar um ActionForward para o ActionServlet. ActionForward: É um objeto que contem o local para o qual a visão devera retornar a resposta da requisição solicitada. ActionMapping: Contem o caminho para o para o qual a aplicação devera ser direcionada, podendo também conter varias informações sobre como a classe Action deve-se comportar quando for solicitada. Arquivos de Configuração: MessageResources.properties: Local onde as mensagens e os labels podem ser armazenados, com a sua utilização facilita a internacionalização da aplicação. struts-config.xml: É utilizado para configurar os vários componentes do Framework Struts. validation.xml: Neste arquivo você pode descrever o seu formulário para a validação. validator-rules.xml: Arquivo que contem a forma como as validações básicas são feitas, sendo utilizado pelo validation.xml. 3

tiles-defs.xml: Com a sua ajuda você pode criar vários componentes, como menu, template, layout, entre outros, que podem ser usados em várias paginas JSP de forma dinâmica, facilitando assim a sua utilização. web.xml: É o descritor de desenvolvimento da aplicação web requerido pela especificação JavaServlet. O contêiner servlet/jsp usa esse arquivo para carregar e configurar sua aplicação. Tags: struts-html.tld: Utilizado na criação de um formulário HTML integrado com o Struts em uma pagina JSP; struts-bean.tld: Utilizado em uma pagina JSP para poder trabalhar com JavaBeans e suas propriedades; struts-logic.tld: Utilizado nas paginas JSP para testar os valores das propriedades, permitindo a criação de estruturas de repetição e condição além da administração do fluxo da aplicação; struts-nested: permite a definição de modelos de objetos aninhados e a capacidade de representá-los e administrá-los; struts-tiles.tld: permite a criação de modelos dinâmicos de páginas JSP que compartilham de um formato comum. Vantagens e Desvantagens de Utilizar o Framework Struts: Desvantagens: As desvantagens mostradas a seguir foram retiradas do livro Struts em Ação. Detalhar-sea apenas algumas dessas desvantagens. Para consultar mais detalhes sobre as demais consulte [1]: Um ActionServlet: Apenas um ActionServlet pode ser usado em uma única aplicação. Esse limite pode levar a conflitos de configuração; Requer uma compreensão dos componentes Struts: Para trabalhar no Struts, um desenvolvedor precisa compreender varias classes especiais e como elas interagem; Os lançamentos dos formatos não são rápidos: As versões do formato do Struts foram relativamente lentas em comparação com alguns outros produtos. Os desenvolvedores têm de usar a construção noturna para utilizar as ultimas melhorias. Também não há nenhum cronograma definido para os lançamentos; Limites i18n: Os recursos de mensagem do Struts são muito bons ao internacionalizar os labels e as mensagens de erro, mais não são adequados para gerenciar blocos maiores de texto; Nenhum modelo de eventos; Depuração; Nenhum modelo de dados default ou recomendações concretas; O revendedor não oferece um suporte de qualidade; A lista de correspondência é um obstáculo dos ricos; 4

Localização de exceções do JSP; As propriedades das tags são explicativas; Assinatura perform e execute; Nomenclatura não clara. Vantagens: As vantagens demonstradas a seguir foram retiradas do livro Struts em Ação, apenas algumas delas serão demonstradas com sua explicação, para consultar mais detalhes sobre as demais consulte [1]: Centrado no HTTP: O Struts é designado em torno do modelo de solicitaçãoresposta padrão HTTP, familiar para muitos desenvolvedores web; Leve: O Struts tem relativamente poucas classes básicas para os desenvolvedores aprenderem; Fonte aberta: O código-fonte completo é fornecido sob a Apache Software License liberal, deixando todas as suas opções abertas; Comunidade forte de desenvolvimento: Há uma forte comunidade de desenvolvimento sob o Struts, A correspondência é muito ativa. Muitas extensões dos desenvolvedores estão ativas; Suporte i18n: O suporte para a localização esta predefinida no Struts completamente; Fortemente baseado nos padrões da construção: O Framework Struts implementa vários padrões clássicos em sua arquitetura que são familiares para a maioria dos desenvolvedores; Modelo neutro: O Struts não é predisposto para nenhuma camada particular de permanência. Registro padrão; Registro de depuração opcional; Reúne o detalhe da implementação em uma configuração centralizada; Permite um arquivo de recursos da mensagem diferente para cada local; Comunidade forte de revendedores; Suporte forte do produto; Equipe forte de desenvolvimento; Versões estáveis; Alta compatibilidade/predisposição com tendência atual; Extensões tag com serviço total; Código-fonte bem documentado; Extensível. Criando o Projeto de Cadastro de Clientes Criando o Projeto: 5

Agora estará sendo dado inicio ao desenvolvimento do projeto de Cadastro de Clientes, o primeiro passo será criar o novo projeto. - Clicar em File, New, Project... (Figura 2). Figura 2: Criando um Novo Projeto - Na opção Java, escolha WebApp Project e pressione Next (Figura 3). Figura 3: Escolha do Tipo de Projeto - Em Project Name, escolha um nome para o projeto, que neste caso será cadastrocliente, logo após pressione Finish (Figura 4). 6

Figura 4: Escolhendo um Nome para o Projeto Pronto o projeto já esta criado. O Package Explorer ficará assim (Figura 5): Adicionando o Struts: Figura 5: Packge Explorer do Novo Projeto Para importar o projeto do Struts clique com o botão direito do mouse no projeto e depois vá a Import... (Figura 6). 7

Figura 6: Importando o Struts para o Projeto Em seguida escolha a opção Archive file, e vá a Next (Figura 7). Figura 7: Tipo de Arquivo a ser Importado Agora clique em Browse, procure o local onde foi descompactado o Struts. Dentro desta pasta procure pela pasta webapp (Figura 8). 8

Figura 8: Localizando o struts-blank.war Após o passo anterior ter sido executado não aparecerá nada na tela. Acesse então a opção Arquivos do Tipo e escolha (*.*), então escolha struts-blank.war e clique em Abrir (Figura 9). 9

Depois, clique em Finish (Figura 10). Figura 9: Escolhendo o Tipo de Projeto a Importar Figura 10: Finalizando a Importação Agora aparecerá uma mensagem perguntando se você quer substituir as pastas e arquivos com o mesmo nome, clique em Yes To All (Figura 11). 10

Figura 11: Substituindo Arquivos e Pastas com Mesmo Nome Pronta o Struts já esta adicionada ao projeto, o Package Explorer ficara assim (Figura 12): Figura 12: Packge Explorer com o Struts Importada Com isso o Struts já esta adicionada ao projeto. Configurando o Projeto: 11

Agora estará sendo feita a configuração do projeto. Com o botão direito no projeto escolha a opção Properties (Figura 13). Figura 13: Iniciando a Configuração do Projeto Na lista que aparece ao lado escolha a Opção TomCat. Marque a opção Is a Tomcat Project, em Context name escolha um nome para seu projeto. Neste caso, /cadastrocliente. Depois clique em Apply (Figura 14). 12

Figura 14: Definindo o Nome do Contexto no Container 15). Agora escolha a opção Java Buld Path, e em Libraries pressione Add JARs (Figura Figura 15: Importando os JARs Clique em cadastrocliente, em WEB-INF e em LIB e selecione todos os arquivos.jar e pressione OK (Figura 16). 13

Figura 16: Escolhendo os Arquivos a Serem Importados Pronto os pacotes já foram importados, clique em OK (Figura 17). Figura 17: Finalizando a Importação e Definição do Contexto Agora se deve adicionar as bibliotecas do TomCat. Com o botão direito do mouse no projeto vá a Tomcat project e escolha a opção Add Tomcat libraries to project buld path (Figura 18). 14

Figura 18: Adicionando a Biblioteca do Tomcat Agora como no caso anterior vá a Tomcat project, só que agora escolha Update context definition (Figura 19). 15

Figura 19: Atualizando o Contexto no Container Agora reinicie o Container clicando no ícone Restart Tomcat (Figura 20). Figura 20: Reiniciando o Tomcat Após um tempo irá aparecer a mensagem Server startup in... ms. Pronto o Container já foi reiniciado (Figura 21). Figura 21: Tomcat Reiniciado e Rodando 16

Agora para testar se o projeto esta funcionando corretamente acesse o link <http://127.0.0.1:8080/cadastrocliente>, onde será exibida a tela de boas vindas do Struts (Figura 22). Figura 22: Testando o Projeto Pronto o Struts já foi importada para o seu projeto e esta funcionando corretamente. Criando as Classes Criação dos Pacotes: Com o botão direito no projeto, escolha a opção New, Package (Figura 23). Figura 23: Criando os Pacotes Em Name coloque o nome do pacote que é br.com.cliente.bean. Onde cada ponto significa uma pasta, por exemplo, a estrutura de pastas deste exemplo ficara assim C:\cadastrocliente\WEB-INF\classes\br\com\cliente\bean (Figura 24). 17

Figura 24: Definindo o Nome do Pacote Faça a mesma ação para os seguintes pacotes: br.com.cliente.action br.com.cliente.form Package Explorer (Figura 25): Pronto os pacotes já estão criados. Criação das Classes: Figura 25: Package Explorer com os Pacotes Criados Para criar as classes pressione como botão direito no pacote br.com.cliente.form. Vá a New e em Class (Figura 26). 18

Figura 26: Criando as Classes Em Name escolha o nome da classe. Neste caso, ClienteForm (Figura 27). Figura 27: Definindo o Nome da Classe Faça a mesma ação para criar as seguintes classes: ClienteAction no pacote br.com.cliente.action ClienteBean no pacote br.com.cliente.bean CidadeBean no pacote br.com.cliente.bean EstadoBean no pacote br.com.cliente.bean Package Explorer (Figura 28): 19

Com isso as classes já estarão criadas Classe ClienteBean: Figura 28: Package Explorer com as Classes Criadas A classe Bean é responsável pelo encapsulamento dos objetos. Esses objetos são acessados pelos métodos set e get. A ilustração da classe Bean é exibida abaixo (Código 1). Code: package br.com.cliente.bean; public class ClienteBean implements Serializable private static final long serialversionuid = 1L; private int codigo; private String nome; private String telefone; private int cidade; private int estado; private String rua; private String bairro; private String complemento; private String cpf; private String rg; private String usuario; private String senha; private String status; private String nomecidade; private String nomeestado; /* * Criar os métodos set e get para todos os atributos */ Código 1: Implementação da Classe ClienteBean 20

Classe ClienteForm: A classe Form é uma classe que representa os campos dos formulários que será utilizado nas classes. Através dessa classe é que se envia todos os dados retirados da tela para a classe Bean, através do método setbean. Pode-se também recuperar os dados do Bean através do método getbean. Podendo também ser feita à validação nos campos nesta classe. Abaixo se apresenta o código da classe Form (Código 2). Code: package br.com.cliente.form; /* * Adcionar os import necessários */ public class ClienteForm extends ValidatorForm private static final long serialversionuid = 1L; private ClienteBean bean = new ClienteBean(); public ClienteBean getbean() return bean; public void setbean(clientebean bean) this.bean = bean; public void reset(actionmapping arg0, HttpServletRequest arg1) this.bean = new ClienteBean();; public ActionErrors validate(actionmapping arg0, HttpServletRequest arg1) ActionErrors errors = new ActionErrors(); if (this.bean.getnome().length() == 0) ActionMessage("validaformcampo.nome")); if (this.bean.getnome().length() > 50) ActionMessage("validaformcampo.nome.invalido")); if (this.bean.gettelefone().length() == 0) ActionMessage("validaformcampo.telefone")); if (this.bean.gettelefone().length() > 13) ActionMessage("validaformcampo.telefone.invalido")); if (this.bean.getestado() == 0) 21

ActionMessage("validaformcampo.estado")); if (this.bean.getcidade() == 0) ActionMessage("validaformcampo.cidade")); if (this.bean.getrua().length() == 0) ActionMessage("validaformcampo.rua")); if (this.bean.getrua().length() > 50) ActionMessage("validaformcampo.rua.invalido")); if (this.bean.getbairro().length() == 0) ActionMessage("validaformcampo.bairro")); if (this.bean.getbairro().length() > 50) ActionMessage("validaformcampo.bairro.invalido")); if (this.bean.getcpf().length() == 0) ActionMessage("validaformcampo.cpf")); if (this.bean.getcpf().length() > 14) ActionMessage("validaformcampo.cpf.invalido")); if (this.bean.getrg().length() == 0) ActionMessage("validaformcampo.rg")); if (this.bean.getrg().length() > 11) ActionMessage("validaformcampo.rg.invalido")); if (this.bean.getusuario().length() == 0) ActionMessage("validaformcampo.usuario")); if (this.bean.getusuario().length() > 15) ActionMessage("validaformcampo.usuario.invalido")); if (this.bean.getsenha().length() == 0) 22

ActionMessage("validaformcampo.senha")); if (this.bean.getsenha().length() > 6) ActionMessage("validaformcampo.senha.invalido")); return errors; Código 2: Implementação da Classe ClienteForm Classe ClienteAction: Na classe Action fica a regra de negócio. Nesta classe é que se indica o que será feito com os dados, como, por exemplo, enviar os dados para a classe que persiste no banco, redirecionar o usuário para uma determinada página de acordo com o resultado da sua solicitação. Segue abaixo o código para a classe Action (Código 3), a classe ClienteDAO que esta sendo utilizada nesta classe será criada e implementada no próximo relatório. Code: 23

package br.com.cliente.action; /* * Adcionar os import necessários */ public class ClienteAction extends DispatchAction private ClienteDAO dao; public ClienteAction() // TODO Auto-generated constructor stub dao = new ClienteDAO(); public ActionForward cadastrar(actionmapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) ClienteForm funform = ((ClienteForm) form); ClienteBean bean = funform.getbean(); ActionMessages messages = new ActionMessages(); bean.setstatus("ativo"); try if(dao.cadastrar(bean) == true) funform.setbean(new ClienteBean()); messages.add(actionmessages.global_message,new ActionMessage("cadastrar.sucesso")); savemessages(request,messages); return (mapping.findforward("sucesso")); catch (Exception e) // TODO Auto-generated catch block e.printstacktrace(); messages.add(actionmessages.global_message,new ActionMessage("cadastrar.erro")); savemessages(request,messages); return (mapping.findforward("erro")); messages.add(actionmessages.global_message,new ActionMessage("cadastrar.erro")); savemessages(request,messages); return (mapping.findforward("erro")); public ActionForward pesquisar(actionmapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) CidadeDAO cidadedao = new CidadeDAO(); CidadeBean cidade = new CidadeBean(); EstadoDAO estadodao = new EstadoDAO(); EstadoBean estado = new EstadoBean(); ClienteForm funform = ((ClienteForm) form); ClienteBean bean = funform.getbean(); ActionMessages messages = new ActionMessages(); try bean = (dao.pesquisar(bean)); cidade.setcodigo(bean.getcidade()); cidade = cidadedao.pesquisar(cidade); bean.setnomecidade(cidade.getcidade()); estado.setcodigo(bean.getestado()); estado = estadodao.pesquisar(estado); 24

bean.setnomeestado(estado.getestado()); funform.setbean(bean); if(bean.getnome() == null) messages.add(actionmessages.global_message,new ActionMessage("pesquisar.invalido")); savemessages(request,messages); return (mapping.findforward("pesquisar")); catch (Exception e) // TODO Auto-generated catch block e.printstacktrace(); return (mapping.findforward("erro")); public ActionForward pesalterar(actionmapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) CidadeDAO cidadedao = new CidadeDAO(); CidadeBean cidade = new CidadeBean(); EstadoDAO estadodao = new EstadoDAO(); EstadoBean estado = new EstadoBean(); ClienteForm funform = ((ClienteForm) form); ClienteBean bean = funform.getbean(); ActionMessages messages = new ActionMessages(); try bean = dao.pesquisar(bean); cidade.setcodigo(bean.getcidade()); cidade = cidadedao.pesquisar(cidade); bean.setnomecidade(cidade.getcidade()); estado.setcodigo(bean.getestado()); estado = estadodao.pesquisar(estado); bean.setnomeestado(estado.getestado()); funform.setbean(bean); if(bean.getnome() == null) messages.add(actionmessages.global_message,new ActionMessage("pesquisar.invalido")); savemessages(request,messages); return (mapping.findforward("pesalterar")); return (mapping.findforward("alterar")); catch (Exception e) // TODO Auto-generated catch block e.printstacktrace(); messages.add(actionmessages.global_message,new ActionMessage("alterar.erro")); savemessages(request,messages); return (mapping.findforward("erro")); public ActionForward alterar(actionmapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) CidadeDAO cidadedao = new CidadeDAO(); CidadeBean cidade = new CidadeBean(); ClienteForm funform = ((ClienteForm) form); ClienteBean bean = funform.getbean(); ActionMessages messages = new ActionMessages(); try cidade.setcodigo(bean.getcidade()); 25

cidade = cidadedao.pesquisar(cidade); if(cidade.getcodigoestado() == bean.getestado()) bean.setstatus("ativo"); if(dao.alterar(bean) == true) messages.add(actionmessages.global_message,new ActionMessage("alterar.sucesso")); savemessages(request,messages); return (mapping.findforward("sucesso")); else messages.add(actionmessages.global_message,new ActionMessage("alterar.cidade.invalido")); savemessages(request,messages); return (mapping.findforward("alterar")); catch (Exception e) // TODO Auto-generated catch block e.printstacktrace(); messages.add(actionmessages.global_message,new ActionMessage("alterar.erro")); savemessages(request,messages); return (mapping.findforward("erro")); messages.add(actionmessages.global_message,new ActionMessage("alterar.erro")); savemessages(request,messages); return (mapping.findforward("erro")); public ActionForward remover(actionmapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) ClienteForm funform = ((ClienteForm) form); ClienteBean bean = funform.getbean(); ActionMessages messages = new ActionMessages(); try bean = dao.pesquisar(bean); bean.setstatus("inativo"); if(dao.alterar(bean) == true) funform.setbean(new ClienteBean()); messages.add(actionmessages.global_message,new ActionMessage("remover.sucesso")); savemessages(request,messages); return (mapping.findforward("sucesso")); catch (Exception e) // TODO Auto-generated catch block e.printstacktrace(); messages.add(actionmessages.global_message,new ActionMessage("remover.erro")); savemessages(request,messages); return (mapping.findforward("erro")); messages.add(actionmessages.global_message,new ActionMessage("remover.erro")); savemessages(request,messages); return (mapping.findforward("erro")); Código 3: Implementação da Classe ClienteAction 26

Arquivos de Configuração Configurando o struts-config.xml: Esta é um dos principais arquivos do projeto. É através do struts-config.xml que as paginas sabem para onde deve ir e qual ação devem executar e para qual pagina devem retornar. Aqui serão adicionados os seguintes códigos ao arquivo existente, não sendo necessário alterar o restante do código existente no arquivo (Código 4). Code: <!-- ================================================ Form Bean Definitions --> <form-beans> <form-bean name="clienteform" type="br.com.cliente.form.clienteform" /> </form-beans> <!-- =========================================== Global Forward Definitions --> <global-forwards> <forward name="inicio" path="/inicio.do"/> <forward name="cadastrar" path="/cadastrar.do"/> <forward name="pesquisar" path="/pesquisar.do"/> <forward name="alterar" path="/alterar.do"/> <forward name="remover" path="/remover.do"/> <forward name="estado" path="/estado.do"/> <forward name="cidade" path="/cidade.do"/> </global-forwards> <!-- =========================================== Action Mapping Definitions --> <!-- Mapeamentos para cada action path - O caminho URI para este mapeamento type - Classe Java que que implementa as ações para este mapeamento 27

name - Nome do form-bean definido na seção form-beans que será utilizado por este mapeamento unknow - Configure como True se este mapeamento deve ser configurado default para esta aplicação para tratar todas as requisições não tratados por outro mapeamento scope - Identificador do escopo (Request ou Session), com qual o form-bean associado será criado input - Caminho do formulário de entrada ao qual o controle deve ser retornado no caso de haver algum erro de validação validate = Configure como True se o método validate() deste action deve ser invocado forward elements - Configuração dos ActionForward associados com este mapeamento --> <action-mappings> <action path="/inicio" forward="/pages/index.jsp"/> <action path="/cadastrar" forward="/pages/cliente/cadastrar.jsp"/> <action path="/pesquisar" forward="/pages/cliente/pesquisar.jsp"/> <action path="/alterar" forward="/pages/cliente/pesalterar.jsp"/> <action path="/remover" forward="/pages/cliente/remover.jsp"/> <action path="/estado" forward="/pages/cliente/estado.jsp"/> <action path="/cidade" forward="/pages/cliente/cidades.jsp"/> <action path="/clientecadastrar" type="br.com.cliente.action.clienteaction" name="clienteform" input="/pages/cliente/cadastrar.jsp" scope="request" parameter="id" validate="true" > <forward name="sucesso" path="/pages/cliente/sucesso.jsp" /> <forward name="erro" path="/pages/cliente/erro.jsp" /> <forward name="cadastrar" 28

path="/pages/cliente/cadastrar.jsp"/> </action> <action path="/cliente" type="br.com.cliente.action.clienteaction" name="clienteform" input="/clienteform" scope="request" parameter="id" validate="false" > <forward name="sucesso" path="/pages/cliente/sucesso.jsp" /> <forward name="erro" path="/pages/cliente/erro.jsp" /> <forward name="pesquisar" path="/pages/cliente/pesquisar.jsp" /> <forward name="alterar" path="/pages/cliente/alterar.jsp" /> <forward name="pesalterar" path="/pages/cliente/pesalterar.jsp"/> <forward name="remover" path="/pages/cliente/remover.jsp" /> </action> </action-mappings> Código 4: Alteração do Arquivo struts-config.xml Alterando o MessageResources.properties: Aqui, é onde todas as mensagens são centralizadas. Coma a utilização de uma chave, nome esse que vai ser utilizado quando estiver se referenciando a essa mensagem, seguida por = e a mensagem desejada (Código 5), antes de adicionar o código vá na mensagem errors.required e acrescente um # na frente da mensagem ficando assim, #errors.required=0 is required. Code: # -- Apresentação -- tela.titulo=informaçoões do Cliente tela.cadastrar=cadastrar Cliente tela.pesquisar=pesquisar Cliente tela.alterar=alterar Cliente tela.remover=remover Cliente tela.sucesso=sucesso tela.erro=erro # -- Link -- link.inicio=ir para Pagina Principal # -- Cadastrar -- cadastrar.sucesso=cadastro Realizado com Sucesso cadastrar.erro=erro no Cadastro. Tentar Novamente mais Tarde # -- Pesquisar -- pesquisar.invalido=codigo Invalido # -- Alterar -- alterar.sucesso=alteração Realizada com Sucesso alterar.erro=erro na Alteração. Tentar Novamente mais Tarde 29

alterar.cidade.invalido=esta Cidade não é Valida para esse Estado # -- Remover -- remover.sucesso=cliente Removido com Sucesso remover.erro=erro ao Remover o Cliente. Tentar Novamente mais Tarde # -- Validação dos Campos no Form -- validaformcampo.codigo=o campo 'CODIGO' é obrigatório. validaformcampo.nome=o campo 'NOME' é obrigatório. validaformcampo.nome.invalido=o campo 'NOME' é não pode conter mais de 50 caracteres. validaformcampo.telefone=o campo 'TELEFONE' é obrigatório. validaformcampo.telefone.invalido=o campo 'TELEFONE' não pode conter mais de 13 caracteres. validaformcampo.estado=o campo 'ESTADO' é obrigatório. validaformcampo.cidade=o campo 'CIDADE' é obrigatório. validaformcampo.rua=o campo 'RUA' é obrigatório. validaformcampo.rua.invalido=o campo 'RUA' não pode conter mais de 50 caracteres. validaformcampo.bairro=o campo 'BAIRRO' é obrigatório. validaformcampo.bairro.invalido=o campo 'BAIRRO' não pode conter mais de 50 caracteres. validaformcampo.complemento=o campo 'COMPLEMENTO' é obrigatório. validaformcampo.complemento.invalido=o campo 'COMPLEMENTO' não pode conter mais de 30 caracteres. validaformcampo.cpf=o campo 'CPF' é obrigatório. validaformcampo.cpf.invalido=o campo 'CPF' não pode conter mais de 14 caracteres. validaformcampo.rg=o campo 'RG' é obrigatório. validaformcampo.rg.invalido=o campo 'RG' não pode conter mais de 11 caracteres. validaformcampo.usuario=o campo 'USUARIO' é obrigatório. validaformcampo.usuario.invalido=o campo 'USUARIO' não pode conter mais de 15 caracteres. validaformcampo.senha=o campo 'SENHA' é obrigatório. validaformcampo.senha.invalido=o campo 'SENHA' não pode conter mais de 6 caracteres. # -- Validação dos Campos no validation.xml -- errors.required=o campo '0' é obrigatório. validacampo.codigo=codigo validacampo.nome=nome validacampo.telefone=telefone validacampo.cidade=cidade validacampo.estado=estado validacampo.rua=rua validacampo.bairro=bairro validacampo.complemento=complemento validacampo.cpf=cpf validacampo.rg=rg validacampo.usuario=usuario validacampo.senha=senha # -- Campos do Cliente -- campo.codigo=codigo: campo.nome=nome: campo.telefone=telefone: campo.telefone.exemplo=(ex: (42)-32221111) campo.cidade=cidade: campo.estado=estado: campo.rua=rua: campo.bairro=bairro: campo.complemento=complemento: campo.cpf=cpf: campo.rg=rg: 30

campo.usuario=usuario: campo.usuario.exemplo=(no maximo 15 caracteres) campo.senha=senha: campo.senha.exemplo=(no maximo 6 caracteres) # -- Botoes -- botao.login=entrar botao.cadastrar=cadastrar botao.pesquisar=pesquisar botao.remover=remover botao.alterar=alterar botao.limpar=limpar Configurando o validation.xml Código 5: Alteração do Arquivo MessageResources.properties O validation.xml é utilizado para fazer a validação, o código abaixo deve ser inserido entre as tags <formset> </formset>. Neste caso, define-se qual o campo a ser utilizado no property e qual o tipo de validação que deve ser feito no depends. Neste exemplo que está sendo demonstrado, todos os campos descriminados são requeridos, caso o usuário deixe um desses campos em branco ele mostrara a mensagem de acordo como o que estiver em arg0 key=, mensagem esta que estará no MessageResources (Código 6). Code: <formset> <form name="clienteform"> <field property="bean.codigo" depends="required"> <arg0 key="validacampo.codigo" /> </field> <field property="bean.nome" depends="required"> <arg0 key="validacampo.nome" /> </field> <field property="bean.telefone" depends="required"> <arg0 key="validacampo.telefone" /> </field> <field property="bean.cidade" depends="required"> <arg0 key="validacampo.cidade" /> </field> <field property="bean.estado" depends="required"> <arg0 key="validacampo.estado" /> </field> <field property="bean.rua" depends="required"> <arg0 key="validacampo.rua" /> </field> <field property="bean.bairro" depends="required"> <arg0 key="validacampo.bairro" /> </field> <field property="bean.complemento" depends="required"> <arg0 key="validacampo.complemento" /> </field> <field property="bean.cpf" depends="required"> <arg0 key="validacampo.cpf" /> </field> <field property="bean.rg" depends="required"> <arg0 key="validacampo.rg" /> </field> 31

</form> <field property="bean.usuario" depends="required"> <arg0 key="validacampo.usuario" /> </field> <field property="bean.senha" depends="required"> <arg0 key="validacampo.senha" /> </field> </formset> Código 6: Alteração do Arquivo validation.xml Alterando o web.xml No arquivo web.xml a única alteração que deve-se fazer será na pagina inicial, como esta sendo demonstrado abaixo (Código 7). Code: Referências <!-- The Usual Welcome File List --> <welcome-file-list> <welcome-file>/pages/index.jsp</welcome-file> </welcome-file-list> Código 7: Alteração do Arquivo web.xml [1] HUSTED, Ted et al. Struts em Ação. Rio de Janeiro: Editora Ciência Moderna Ltda., 2004. 1, 5, 50-55 p.. ISBN: 85-7393-299-6 [2] APACHE SOFTWARE FOUNDATION. Disponível em <http://www.apache.org/> acesso em 13-abr-2007. [3] WIKIPEDIA. Disponível em <http://pt.wikipedia.org/wiki/model_2> acesso em 13-abr- 2007. [4]. Disponível em <http://pt.wikipedia.org/wiki/mvc> acesso em 13-abr-2007. [5]. Disponível em <http://pt.wikipedia.org/wiki/smalltalk> acesso em 13-abr-2007. [6]. Disponível em <http://pt.wikipedia.org/wiki/observer> acesso em 13-abr-2007. [7] APACHE SOFTWARE FOUNDATION. Disponível em <http://www.apache.org/licenses/> acesso em 13-abr-2007. [8] WIKIPEDIA. Disponível em <http://pt.wikipedia.org/wiki/servlet> acesso em 13-abr- 2007. [9]. Disponível em <http://pt.wikipedia.org/wiki/javabeans> acesso em 05-mar-2007. [10]. Disponível em <http://pt.wikipedia.org/wiki/jsp> acesso em 13-abr-2007. [11]. Disponível em <http://pt.wikipedia.org/wiki/html> acesso em 13-abr-2007. [12]. Disponível em <http://pt.wikipedia.org/wiki/cgi> acesso em 13-abr-2007. [13]. Disponível em <http://pt.wikipedia.org/wiki/xml> acesso em 13-abr-2007. [14] SOUZA, Welington B. Struts Tutorial - Parte 1 de 2. Disponível em <http://www.portaljava.com.br/home/modules.php?name=content&pa=showpage&pid=63& page=1> acesso em 05-mar-2007. 32

Bibliografia GOETTEN, Vicente Junior. Desmitificando o Framework Jakarta Struts. Disponível em <http://www.javafree.org/content/view.jf?idcontent=22> acesso em 13-abr-2007. APACHE SOFTWARE FOUNDATION. Disponível em <http://struts.apache.org/1.2.9/userguide > acesso em 13-abr-2007. SOUZA, Welington B. Struts Tutorial - Parte 1 de 2. Disponível em <http://www.portaljava.com.br/home/modules.php?name=content&pa=showpage&pid=63& page=1> acesso em 05-mar-2007. 33