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