• Nenhum resultado encontrado

Relatório do GPES. Conhecendo o Framework Struts

N/A
N/A
Protected

Academic year: 2021

Share "Relatório do GPES. Conhecendo o Framework Struts"

Copied!
33
0
0

Texto

(1)

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].

(2)

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

(3)

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,

(4)

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-se-a Detalhar-se-apenDetalhar-se-as Detalhar-se-algumDetalhar-se-as dessDetalhar-se-as desvDetalhar-se-antDetalhar-se-agens. PDetalhar-se-arDetalhar-se-a consultDetalhar-se-ar mDetalhar-se-ais detDetalhar-se-alhes sobre Detalhar-se-as demDetalhar-se-ais 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;

(5)

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ção-resposta 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:

(6)

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

(7)

Figura 4: Escolhendo um Nome para o Projeto

Pronto o projeto já esta criado. O Package Explorer ficará assim (Figura 5):

Figura 5: Packge Explorer do Novo Projeto

Adicionando o Struts:

Para importar o projeto do Struts clique com o botão direito do mouse no projeto e depois

vá a Import... (Figura 6).

(8)

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

(9)

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

(10)

Figura 9: Escolhendo o Tipo de Projeto a Importar

Depois, clique em Finish (Figura 10).

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

(11)

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.

(12)

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.

(13)

Figura 14: Definindo o Nome do Contexto no Container

Agora escolha a opção Java Buld Path, e em Libraries pressione Add JARs… (Figura

15).

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

(14)

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

(15)

Figura 18: Adicionando a Biblioteca do Tomcat

Agora como no caso anterior vá a Tomcat project, só que agora escolha Update context

(16)

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

(17)

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

(18)

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):

Figura 25: Package Explorer com os Pacotes Criados

Pronto os pacotes já estão criados.

Criação das Classes:

Para criar as classes pressione como botão direito no pacote br.com.cliente.form. Vá a

(19)

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

(20)

Figura 28: Package Explorer com as Classes Criadas

Com isso as classes já estarão criadas

Classe ClienteBean:

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

}

(21)

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) { errors.add(ActionErrors.GLOBAL_MESSAGE,new ActionMessage("validaformcampo.nome")); } if (this.bean.getNome().length() > 50) { errors.add(ActionErrors.GLOBAL_MESSAGE,new ActionMessage("validaformcampo.nome.invalido")); } if (this.bean.getTelefone().length() == 0) { errors.add(ActionErrors.GLOBAL_MESSAGE,new ActionMessage("validaformcampo.telefone")); } if (this.bean.getTelefone().length() > 13) { errors.add(ActionErrors.GLOBAL_MESSAGE,new ActionMessage("validaformcampo.telefone.invalido")); } if (this.bean.getEstado() == 0)

(22)

{ errors.add(ActionErrors.GLOBAL_MESSAGE,new ActionMessage("validaformcampo.estado")); } if (this.bean.getCidade() == 0) { errors.add(ActionErrors.GLOBAL_MESSAGE,new ActionMessage("validaformcampo.cidade")); } if (this.bean.getRua().length() == 0) { errors.add(ActionErrors.GLOBAL_MESSAGE,new ActionMessage("validaformcampo.rua")); } if (this.bean.getRua().length() > 50) { errors.add(ActionErrors.GLOBAL_MESSAGE,new ActionMessage("validaformcampo.rua.invalido")); } if (this.bean.getBairro().length() == 0) { errors.add(ActionErrors.GLOBAL_MESSAGE,new ActionMessage("validaformcampo.bairro")); } if (this.bean.getBairro().length() > 50) { errors.add(ActionErrors.GLOBAL_MESSAGE,new ActionMessage("validaformcampo.bairro.invalido")); } if (this.bean.getCpf().length() == 0) { errors.add(ActionErrors.GLOBAL_MESSAGE,new ActionMessage("validaformcampo.cpf")); } if (this.bean.getCpf().length() > 14) { errors.add(ActionErrors.GLOBAL_MESSAGE,new ActionMessage("validaformcampo.cpf.invalido")); } if (this.bean.getRg().length() == 0) { errors.add(ActionErrors.GLOBAL_MESSAGE,new ActionMessage("validaformcampo.rg")); } if (this.bean.getRg().length() > 11) { errors.add(ActionErrors.GLOBAL_MESSAGE,new ActionMessage("validaformcampo.rg.invalido")); } if (this.bean.getUsuario().length() == 0) { errors.add(ActionErrors.GLOBAL_MESSAGE,new ActionMessage("validaformcampo.usuario")); } if (this.bean.getUsuario().length() > 15) { errors.add(ActionErrors.GLOBAL_MESSAGE,new ActionMessage("validaformcampo.usuario.invalido")); } if (this.bean.getSenha().length() == 0) {

(23)

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.

(24)

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);

(25)

} 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 {

(26)

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")); } }

(27)

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

(28)

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"

(29)

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

(30)

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:

(31)

botao.remover=Remover botao.alterar=Alterar botao.limpar=Limpar

Código 5: Alteração do Arquivo MessageResources.properties

Configurando o validation.xml

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

(32)

<field property="bean.usuario" depends="required"> <arg0 key="validacampo.usuario" />

</field>

<field property="bean.senha" depends="required"> <arg0 key="validacampo.senha" />

</field> </form>

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

<!-- 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

Referências

[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.

(33)

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.

Referências

Documentos relacionados

O primeiro tratamento foi denominado controle e não continha o complexo enzimático D1; o segundo tratamento foi o controle positivo, com inclusão do complexo enzimático na

a) Análise Curricular – todos os títulos e publicações referentes ao currículo lattes do candidato deverão ser devidamente comprovados, através de cópias com

Moving teeth presenting concrescence is not conve- nient, as it requires very intense forces and tends to in- duce more severe root resorption if dislocation occurs. Figure 2B - In

No âmbito deste último Programa, as metas a atingir seriam a criação de novas instalações para a sede do Instituto, criar e instalar as novas Escolas de Hotelaria e Turismo

Medidas de proteção para a Brigada de Combate a Incêndios: Utilizar equipamento de respiração autônoma com pressão positiva e roupas apropriadas para contato com

•Ainda que o ácido glicólico seja para todos os tipos de pele, ele ajuda normalizar a pele ressecada por conta da renovação celular, pois excesso de células mortas formam uma

[r]

A Papelaria Fernandes não dispõe de um plano de aquisição de acções para os seus funcionários, não estando também definido qualquer plano de “Stock Options” quer para