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].
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).
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,
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;
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:
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).
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).
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).
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).
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).
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.
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.
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).
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).
Figura 18: Adicionando a Biblioteca do Tomcat
Agora como no caso anterior vá a Tomcat project, só que agora escolha Update context
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 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
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
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
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 */
}
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)
{ 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) {
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.
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);
} 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 = 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")); } }
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
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"
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.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:
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" />
<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