Struts Jakarta Struts Marco Antonio, Arquiteto de Software – TJDF [email protected] Última revisão: Maio/2007 Struts Framework para facilitar a implementação da arquitetura MVC em aplicações JSP. Tem se tornado um padrão mundial. Bastante completo. Demanda muito tempo para o aprendizado. Serviços oferecidos pelo Struts Um poderoso Servlet de controle que faz a delegação das regras de negócio para uma classe específica. É configurado via XML. Validadores para diversas situações. Gerenciamento de exceção. Utilitários para upload. Utilitários para manipulação de javaBeans. * vários desses utilitários foram transferidos para projetos separados para reutilização em outros sistemas, mesmo sem o Struts. Download Faça o download do Struts no site jakarta.apache.org/struts/index.html. Descompacte o conteúdo do Struts na sua pasta pessoal. Principais arquivos O framework está no arquivo struts.jar, mas, assim como tudo no Java, ele necessita de diversas outras bibliotecas. Esse mecanismo é bastante prático, pois facilita a instalação, portabilidade, atualização, correção, etc. Copie as bibliotecas (.jar) para o SistemaBancario/lib e registre-as (Add to Build Path). Copie as tag libs (.tld) para o SistemaBancarioWeb/WEB-INF. web.xml <?xml version="1.0" ?> <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"> <web-app> <servlet> <servlet-name>action</servlet-name> <servlet-class>org.apache.struts.action.ActionServlet</servlet-class> <init-param> <param-name>config</param-name> <param-value>/WEB-INF/struts-config.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>action</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping> web.xml <taglib> <taglib-uri>/tags/struts-bean</taglib-uri> <taglib-location>/WEB-INF/struts-bean.tld</taglib-location> </taglib> <taglib> <taglib-uri>/tags/struts-logic</taglib-uri> <taglib-location>/WEB-INF/struts-logic.tld</taglib-location> </taglib> <taglib> <taglib-uri>/tags/struts-html</taglib-uri> <taglib-location>/WEB-INF/struts-html.tld</taglib-location> </taglib> </web-app> web.xml Arquivo padrão para configurar qualquer aplicação web. Deve ficar dentro do diretório WEB-INF da aplicação. Esse diretório, a partir de agora, é obrigatório. Dentro dele estarão todas as bibliotecas necessárias ao nosso trabalho. Principais tags do web.xml Servlet: indica o nome do Servlet do Struts, a classe desse Servlet e o arquivo de configuração do Struts, quem vamos ver na sequência. Load-on-startup: opcional. Faz o ActionServlet ser carregado quando o servidor web é iniciado. Servlet-mapping: indica que o Servlet responde apenas ao padrão *.do. Atenção: se você acessar uma página .html comum do servidor, o ActionServlet não é acessado. web.xml Taglib: biblioteca de tags proprietárias do Struts para fazer tarefas comuns. Exemplos: Ler os valores dos atributos de uma classe (JavaBean), ler o arquivo de mensagens (application.properties), fazer loops, comparações, verificar condições (existe, não existe), mostrar componentes HTML. Existem vários concorrentes, mas todos seguem o mesmo princípio, mudando apenas a sintaxe. Algumas vezes, nem isso. Atualizando o contexto Quando você cria um projeto no Tomcat através do plugin, é criada uma entrada similar a essa no arquivo c:\Tomcat\conf\server.xml: <Context path="/sistemabancarioweb" reloadable="true" docBase="E:\sistemas\SistemaBancarioWeb" workDir="E:\sistemas\SistemaBancarioWeb\work" > <Logger className="org.apache.catalina.logger.SystemOutLogger" verbosity="4" timestamp="true"/> </Context> Esse arquivo tem a configuração de todas as aplicações (contextos) que existem nessa instalação do Tomcat. Como estamos alterando bastante as configurações do ambiente, se ocorrer algum erro ou comportamento estranho da aplicação é necessário atualizar o contexto. Siga esses passos: Botão direito no projeto (SitemaBancarioWeb) – Tomcat Project – Update Context Definition. tools.jar Em algumas instalações do Java temos problemas com o registro da máquina. Para evitar essa situação, vamos registrar o arquivo tools.jar, que é a biblioteca de utilitários da linguagem. Vá no menu Window – Preferences – Tomcat e veja a configuração final no próximo slide. JVM Settings Principais taglibs Bean: gerencia os beans (classes de entidade), acessa propriedades, mensagens, cookies, etc. Logic: faz comparações, avalia condições, faz loops, Html: representa os componentes html, tornando a sua utilização mais simples. struts-config.xml <!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" "http://struts.apache.org/dtds/struts-config_1_2.dtd"> <struts-config> <action-mappings> <action path="/BemVindo" type="com.sistemabancario.apresentacao.action.BemVindoAction"> <forward name="Sucesso" path="/jsp/BemVindo.jsp" /> </action> </action-mappings> <message-resources parameter="resources.application" /> </struts-config> Entenda o struts-config.xml Path: indica a URL que deve ser chamada para executar essa ação (BemVindo). Type: Classe que representa a ação desejada. Forward: indica os caminho que podem ser seguidos para essa ação. Em geral, indica sucesso o fracasso para abrir alguma página. Path (forward): página JSP que vai ser mostrada. Message-resources: arquivo que contém as mensagens/rótulos da sua aplicação (internacionalização). Resources indica o diretório, application o arquivo. A extensão .properties fica implícita! application.properties # cadastro.nome=Nome cadastro.endereco=Endereço cadastro.telefone=Telefone cadastro.id=Código # mensagem.editar=Editar mensagem.excluir=Excluir # cadastroDeAgencia.tituloDaPaginaDeConsulta=Consulta Agências cadastroDeAgencia.tituloDaPaginaDeCadastro=Cadastro de Agências # cadastroDeGerente.tituloDaPaginaDeConsulta=Consulta Gerentes cadastroDeGerente.tituloDaPaginaDeCadastro=Cadastro de Gerente cadastroDeGerente.listaDeGerentes=Lista de Gerentes # sistema.tituloDoSistema=Sistema Bancário sistema.mensagemDeBoasVindas=Bem-Vindo ao Sistema Bancário application.properties Arquivo de configuração de mensagens da aplicação. Crie esse arquivo no SistemaBancario/src/resources. Você pode colocar as mensagem em várias línguas e utilizá-las na sua aplicação. BemVindoAction.java package com.sistemabancario.apresentacao.action; import javax.servlet.http.*; import org.apache.struts.action.*; public class BemVindoAction extends Action { public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { return mapping.findForward("Sucesso"); } } Atenção Todas as páginas JSP devem estar dentro de um diretório chamado jsp (crie esse diretório), para uma melhor organização de sua aplicação. BemVindo.jsp 1. <%@ taglib uri="/tags/struts-bean" prefix="bean"%> 2. <link rel="stylesheet" href="css/Estilo.css" type="text/css"> <table> <tr> <td> 3. <jsp:include page="Cabecalho.jsp"/> <html> <head> 4. <title><bean:message key="sistema.tituloDoSistema"/></title> </head> <body> 5. <h1><bean:message key="sistema.mensagemDeBoasVindas"/></title></h1> </html> BemVindo.jsp 1. declara que a página utiliza a taglib bean, nesse caso para ler o arquivo de mensagens. 2. folha de estilos da aplicação. 3. recurso do JSP para incluir nesse ponto, outra página .jsp. Utiliza sempre o padrão taglib:função, nesse caso jsp:include. 4. lê o arquivo de configuração e recupera a mensagem do título do sistema. Também utiliza o padrão taglib:função. A tag utilizada é bean, a função message lê a mensagem associada a uma chave. 5. lê a mensagem de boas-vindas configurada. Cabecalho.jsp Opções: <a href="ListarGerentes.do">Gerentes</a> | Agências | Cliente | Contas-Corrente | <a href="BemVindo.do">Página Inicial</a> Acessando a primeira aplicação Struts Para acessar nossa tela de boas-vindas, utilizamos a URL seguinte: http://localhost:8080/sistemabancarioweb/BemVindo.do A extensão .do faz parte da especificação do Struts. Esse padrão foi configurado no web.xml (url-pattern). Quando você utilizar esse padrão na URL do browser, irá chamar a aplicação Struts através do ActionServlet. Toda vez que uma solicitação com final .do é acessada pelo browser, o Servlet do Struts entra em ação. Dinâmica da aplicação Você acessou a action BemVindo (struts-config.xml) através da URL BemVindo.do. O Struts direcionou a chamada para a classe BemVindoAction. Como o objetivo é apenas mostrar a página de boas-vindas, não existe nenhum processamento extra nessa classe. Quando estivermos consultando dados, esse processamento ficará numa classe similar. O método chamado pelo Struts é o execute(). Veja no exemplo a lista de parâmetros. Toda ação deve ficar em uma subclasse de Action. Por exemplo ExibirClienteAction, InserirClienteAction. Core classes Mais uma ação Vamos acrescentar mais uma tag action na nossa aplicação. Dessa vez, vamos listar todos os gerentes. struts-config.xml <!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" "http://struts.apache.org/dtds/struts-config_1_2.dtd"> <struts-config> <action-mappings> <action path="/BemVindo" type="com.sistemabancario.apresentacao.action.BemVindoAction"> <forward name="Sucesso" path="/jsp/BemVindo.jsp" /> </action> <action path="/ListarGerentes" type="com.sistemabancario.apresentacao.action.ListarGerentesAction"> <forward name="Sucesso" path="/jsp/ListaDosGerentes.jsp" /> </action> </action-mappings> <message-resources parameter="resources.application" /> </struts-config> struts-config.xml Adicionamos a ação ListarGerentes. Para acessar essa ação acesse a URL: http://localhost:8080/sistemabancarioweb/ListarGerentes.do Depois de acessar essa URL, o Struts irá direcionar a ação para o execute da classe ListarGerentesAction. A maior parte de sua aplicação (na verdade, de qualquer aplicação) seguirá passos similares. ListarGerentesAction.java package com.sistemabancario.apresentacao.action; import java.util.*; import javax.servlet.http.*; import org.apache.struts.action.*; import com.sistemabancario.persistencia.*; public class ListarGerentesAction extends Action { public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { DAOGerente daoGerente = new DAOGerente(); Collection lista = daoGerente.consultarTodos(); request.setAttribute("gerentes", lista); return mapping.findForward("Sucesso"); } } DAOGerente – mock package com.sistemabancario.persistencia; import java.util.*; import com.sistemabancario.formularios.*; public class DAOGerente { public FormularioGerente consultarPeloId(long id) { FormularioGerente g = new FormularioGerente(); g.setEndereco("Algum endereço"); g.setId(id); g.setNome("Algum nome"); g.setTelefone("3214-4323"); return g; } public void inserir(FormularioGerente gerente) { System.out.println("Estou inserindo um novo gerente..."); System.out.println(gerente.getId()); System.out.println(gerente.getNome()); System.out.println(gerente.getEndereco()); System.out.println(gerente.getTelefone()); } public void atualizar(FormularioGerente gerente) { System.out.println("Estou atualizando um gerente..."); System.out.println(gerente.getId()); System.out.println(gerente.getNome()); System.out.println(gerente.getEndereco()); System.out.println(gerente.getTelefone()); } DAOGerente – mock public Collection consultaTodos() { Collection lista = new ArrayList(); FormularioGerente g = new FormularioGerente(); g.setEndereco("Taguatinga"); g.setNome("Jose"); g.setTelefone("3352-1212"); g.setId(1); lista.add(g); g = new FormularioGerente(); g.setEndereco("Asa Sul"); g.setNome("Maria"); g.setTelefone("3423-4512"); g.setId(2); lista.add(g); g = new FormularioGerente(); g.setEndereco("Asa Norte"); g.setNome("Joao"); g.setTelefone("3242-4321"); g.setId(3); lista.add(g); g = new FormularioGerente(); g.setEndereco("Lago Norte"); g.setNome("Paulo"); g.setTelefone("3248-7654"); g.setId(4); lista.add(g); return lista; } } ListarGerentesAction Quando você acessou a URL ListarGerentes.do, o Struts chamou o método execute (atenção para a lista de parâmetros!!!). O objetivo é recuperar uma collection (o Struts trabalha com os tipos mais comuns do Java), que é a lista dos gerentes. Para isso utilizamos o DAOGerente. Logo em seguida, guardamos essa lista na sessão do browser. Vamos recuperá-la posteriormente na página JSP. ListaDosGerentes.jsp <%@ taglib uri="/tags/struts-html" prefix="html"%> <%@ taglib uri="/tags/struts-bean" prefix="bean"%> <%@ taglib uri="/tags/struts-logic" prefix="logic"%> <link rel="stylesheet" href="css/Estilo.css" type="text/css"> <html> <head> <title><bean:message key="cadastroDeGerente.tituloDaPaginaDeConsulta"/> </title> </head> <body> <table> <tr> <td> <jsp:include page="Cabecalho.jsp"/> </td> </tr> </table> ListaDosGerentes.jsp Declaração das taglibs que vamos usar nessa página. Html para os componentes html. Bean para acessar os javabeans Logic para o loop. Lembre-se: vamos mostar vários registros. ListaDosGerentes.jsp <h1><bean:message key="cadastroDeGerente.tituloDaPaginaDeConsulta"/></h1> 1. <!-- logic:present name="gerentes" (isso é opcional)--> <table border="1"> <tr> <th> 2. <bean:message key="cadastro.nome"/> </th> <th> <bean:message key="cadastro.endereco" /> </th> <th> <bean:message key="cadastro.telefone" /> </th> <th> <bean:message key="mensagem.editar" /> </th> <th> <bean:message key="mensagem.excluir" /> </th> </tr> ListaDosGerentes.jsp 1. utiliza a taglib logic para verificar se o atributo “gerentes” existe mesmo na sessão. Caso exista, ele executa o conteúdo, podendo mostrar uma mensagem caso não encontre o atributo na sessão. 2. lê as mensagens associadas às chaves. ListaDosGerentes.jsp 1. <logic:iterate id="gerente" name="gerentes"> <tr> <td> 2. <bean:write name="gerente" property="nome"/> </td> <td> 3. <bean:write name="gerente" property="endereco"/> </td> <td> 4. <bean:write name="gerente" property="telefone"/> </td> <td align=center> 5. <html:link page="/ExibirGerente.do" paramId="id" paramName="gerente" paramProperty="id"> 6. <html:image src="imagens/edit.gif" alt="Editar Registro" /> </html:link> </td> ListaDosGerentes.jsp 1. logic:iterate é uma tag que faz iteração, ou seja, repetição. Name indica o bean que limita essas repetições (gerentes, que é a lista de todos os gerentes, veja a classe ListarGerenteAction). O id representará cada um dos elementos da lista. Cada elemento será referenciado por gerente. 2. bean:write escreve na tela o valor da propriedade nome no primeiro gerente da lista. Name indica o bean gerente dessa iteração. Property indica a propriedade do bean. A propriedade deve existir no bean em questão. Todas as conversões são automáticas, por conta do Struts. ListaDosGerentes.jsp 3. escreve o valor da propriedade endereco. 4. escreve o valor da propriedade telefone. 5. html:link é uma ligação com a action ExibirGerente. Quando você clicar aqui, vamos criar um parâmetro id com o valor do id do gerente em da iteração atual. Vamos passar esse valor para uma página e mostrar os dados desse gerente, com a finalidade de edição. Veja a imagem. 6. html:image mostra uma imagem, para fins estéticos, apenas isso. Tela da consulta Dinâmica da consulta Quando acessarmos a action ExibirGerente, passaremos o id que vamos consultar. Quando o id tiver algum valor válido, vamos carregar a tela com os dados do gerente. Se você não passar nenhum id, o sistema irá inserir o gerente. Na outra situação, vamos atualizar um já existente. ListaDosGerentes.jsp <td align=center> 1. <html:link page="/ExcluirGerente.do" paramId="id" paramName="gerente" paramProperty="id"> 2. <html:image src="imagens/delete_2x.gif" alt="Excluir Registro" /> </html:link> </td> </tr> 3. </logic:iterate> <tr> <td colspan="5"> 4. <html:link page="/ExibirGerente.do"> 5. <html:img src="imagens/add.gif" alt="Adicionar Registro" border="0" align="right" /> </html:link> </table> 6. <!-- /logic:present (isso é opcional) --> </body> </html> ListaDosGerentes.jsp 1. a exclusão funciona da mesma forma que a edição. Vamos passar um id, e a página seguinte irá excluir o gerente associado. 2. uma imagem, também para fins estéticos. 3. fim da iteração. Tudo que está entre o início e o fim da tag logic:iterate será repetido enquando existirem mais gerentes na lista. 4. abre a página de cadastro, exibindo uma página em branco, pois não foi informado nenhum id. 5. mais uma vez nossa imagem. 6. fim da tag logic:present, que verifica se realmene existe o atributos gerentes na sessão. Tem como finalidade garantir que você passou a lista dos gerentes. struts-config.xml <!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" "http://struts.apache.org/dtds/struts-config_1_2.dtd"> <struts-config> <form-beans> <form-bean name="formularioGerente" type="com.sistemabancario.apresentacao.formulario.FormularioGerente"> </form-bean> </form-beans> <action-mappings> <action path="/BemVindo" type="com.sistemabancario.apresentacao.action.BemVindoAction"> <forward name="Sucesso" path="/jsp/BemVindo.jsp" /> </action> <action path="/ListarGerentes" type="com.sistemabancario.apresentacao.action.ListarGerentesAction"> <forward name="Sucesso" path="/jsp/ListaDosGerentes.jsp" /> </action> <action path="/ExibirGerente" type="com.sistemabancario.apresentacao.action.ExibirGerenteAction"> <forward name="ExibirGerente" path="/jsp/CadastroDeGerente.jsp" /> </action> struts-config.xml <action path="/CadastrarGerente" type="com.sistemabancario.apresentacao.action.CadastrarGerenteAction" name="formularioGerente"> <forward name="ListarGerentes" path="/ListarGerentes.do" /> </action> </action-mappings> <message-resources parameter="resources.application" /> </struts-config> Novidades no struts-config.xml Até agora vimos apenas ações de consulta (BemVindo e ListarGerentes). A outra situação é o cadastro. Toda vez que precisamos de uma página para cadastro, vamos criar um formulário (form-bean) e sua respectiva classe (ActionForm). FormularioGerente.java package com.sistemabancario.apresentacao.formulario; import org.apache.struts.action.*; public class FormularioGerente extends ActionForm { private long id; private String nome; private String endereco; private String telefone; public String getEndereco() { return endereco; } public void setEndereco(String endereco) { this.endereco = endereco; } public long getId() { return id; } public void setId(long id) { this.id = id; } public String getNome() { return nome; } FormularioGerente.java public void setNome(String nome) { this.nome = nome; } public String getTelefone() { return telefone; } public void setTelefone(String telefone) { this.telefone = telefone; } } FormularioGerente.java Essa classe deve ter atributos correspondentes a todos os campos da tela. A primeira impressão que temos é que duplicamos código, pois temos uma classe de entidade bastante parecida. Precisamos lembrar que esse é um exemplo básico e existem estratégias específicas para eliminar esse tipo de problema. ExibirGerenteAction.java package com.sistemabancario.apresentacao.action; import javax.servlet.http.*; import org.apache.struts.action.*; import com.sistemabancario.entidades.*; import com.sistemabancario.persistencia.*; public class ExibirGerenteAction extends Action { public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { Gerente gerente = new Gerente(); String id = request.getParameter("id"); if (id != null) { DAOGerente daoGerente = new DAOGerente(); Long idGerente = new Long(id); gerente = daoGerente.consultarPeloId(idGerente); } request.setAttribute("gerente", gerente); return mapping.findForward("ExibirGerente"); } } ExibirGerenteAction.java Nessa classe recuperamos o valor do parâmetro id, caso ele exista. Quando esse valor é diferente de nulo (o parâmetro foi informado) vamos no DAOGerente e recuperamos o objeto correspondente. Logo em seguida, colocamos o gerente na sessão, para ser recuperado na página seguinte. Se o parâmetro id não for informado, o gerente da sessão não terá valores para seus atributos, por isso os campos da tela seguinte estarão em branco. CadastroDeGerente.jsp <%@ taglib uri="/tags/struts-html" prefix="html"%> <%@ taglib uri="/tags/struts-bean" prefix="bean"%> <link rel="stylesheet" href="css/Estilo.css" type="text/css"> <html> <head> <title><bean:message key="cadastroDeGerente.tituloDaPaginaDeCadastro"/></title> </head> <body> <h1><bean:message key="cadastroDeGerente.tituloDaPaginaDeCadastro"/></title></h1> <table border=1> 1. <html:form action="CadastrarGerente"> 2. <html:hidden property="id" name="gerente"/> <tr> <td> <bean:message key="cadastro.nome" /> </td> <td> 3. <html:text property="nome" name="gerente" maxlength="30" size="30" /> </td> </tr> CadastroDeGerente.jsp <td> <bean:message key="cadastro.endereco" /> </td> <td> 4. <html:text property="endereco" name="gerente" size="30" /> </td> <tr> <td> <bean:message key="cadastro.telefone" /> </td> <td> 5. <html:text property="telefone" name="gerente" size="20" /> </td> </tr> <tr> <td> CadastroDeGerente.jsp 6. <html:button onclick="submit()" property="btnGravar" value="Gravar" /> </td> <td> 7. <html:button onclick="action='ListarGerentes.do';submit()" property="btnVoltar" value="Voltar" /> </td> </tr> </html:form> </table> </body> </html> CadastroDeGerente.jsp 1. form:action é a tag que indica qual a ação do botão de submit, nesse caso Gravar. 2. no html:hidden iremos armazenar o atributo id do gerente. Name indica o bean que deve ter sido carregado na classe ExibirGerenteAction. No caso da inclusão, esse valor será “0” (zero). 3, 4, 5. html:text é uma caixa de texto que contém o valor do atributo nome, endereco, telefone, do bean gerente. 6. botão de submit, ou seja, submeter todas essas informações para a action CadastrarGerente. Property indica o nome do botão. 7. botão de voltar com javascript para redirecionar nossa página para a action ListarGerentes, sem gravar nenhuma informação dessa tela. Tela de cadastro Veja o atributo id na URL do browser, com o valor 7. Se você suprimir essa informação, a tela será carregada com os campos em branco. CadastrarGerenteAction.java package com.sistemabancario.apresentacao.action; import javax.servlet.http.*; import org.apache.commons.beanutils.*; import org.apache.struts.action.*; import com.sistemabancario.apresentacao.formulario.*; import com.sistemabancario.entidades.*; import com.sistemabancario.persistencia.*; public class CadastrarGerenteAction extends Action { public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { String id = request.getParameter("id"); 1. FormularioGerente formularioGerente = (FormularioGerente) form; DAOGerente daoGerente = new DAOGerente(); Gerente gerente = new Gerente(); BeanUtils.copyProperties(gerente, formularioGerente); 2. if(id == null || id.equals("") || id.equals(“0”)) { daoGerente.inserir(gerente); } else { daoGerente.atualizar(gerente); } return mapping.findForward(“Sucesso”); } } CadastrarGerenteAction.java 1. Esse é um mecanismo automático do Struts. Estamos recuperando o formulário da página anterior, que era o cadastro de gerentes. Os atributos desse formulário têm os mesmos valores digitados pelo usuário na tela de cadastro. 2. Verifica se o id foi informado. As condições estão aí apenas para ilustrar quais as possibilidades de valor que teremos, dependendo da lógica que você utilize na sua aplicação. 3. BeanUtils é uma classe utilitária do Jakarta que copia os valores dos atributos iguais entre os objetos informados. Nesse caso, vamos copiar todos os atributos iguais para do objeto formularioGerente para o gerente 4. Nosso DAOGerente grava apenas objetos do tipo Gerente, mas o Struts trabalha apenas com o FormularioGerente, por isso a cópia é obrigatória Obs: os itens 3 e 4 não se aplicam a essa versão struts-config.xml <action path="/ExcluirGerente" type="com.sistemabancario.apresentacao.action.ExcluirGerenteAction"> <forward name="ListarGerentes" path="/ListarGerentes.do" /> </action> struts-config.xml Última action da configuração do Struts. Acrescente essas tags ao arquivo de configuração já existente. ExcluirGerenteAction.java package com.sistemabancario.apresentacao.action; import javax.servlet.http.*; import org.apache.struts.action.*; import com.sistemabancario.persistencia.*; public class ExcluirGerenteAction extends Action { public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { String id = request.getParameter("id"); DAOGerente daoGerente = new DAOGerente(); Long idGerente = new Long(id); daoGerente.excluir(idGerente); return mapping.findForward("ListarGerentes"); } } ExcluirGerenteAction.java O id, informado na tela de consulta, é utilizado como parâmetro para a exclusão no DAOGerente Em seguida, voltamos à página de consulta, vendo uma lista atualizada com os gerentes restantes Dúvidas? struts-config.xml <!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" "http://struts.apache.org/dtds/struts-config_1_2.dtd"> <struts-config> <form-beans> <form-bean name="formularioGerente" type="com.sistemabancario.apresentacao.formulario.FormularioGerente"> </form-bean> <form-bean name="formularioAgencia" type="com.sistemabancario.apresentacao.formulario.FormularioAgencia"> </form-bean> </form-beans> <action-mappings> <action path="/BemVindo" type="com.sistemabancario.apresentacao.action.BemVindoAction"> <forward name="Sucesso" path="/jsp/BemVindo.jsp" /> </action> <action path="/ListarGerentes" type="com.sistemabancario.apresentacao.action.ListarGerentesAction"> <forward name="Sucesso" path="/jsp/ListaDosGerentes.jsp" /> </action> struts-config.xml <action path="/ExibirGerente" type="com.sistemabancario.apresentacao.action.ExibirGerenteAction"> <forward name="ExibirGerente" path="/jsp/CadastroDeGerente.jsp" /> </action> <action path="/CadastrarGerente" type="com.sistemabancario.apresentacao.action.CadastrarGerenteAction" name="formularioGerente"> <forward name="ListarGerentes" path="/ListarGerentes.do" /> </action> <action path="/ExcluirGerente" type="com.sistemabancario.apresentacao.action.ExcluirGerenteAction"> <forward name="ListarGerentes" path="/ListarGerentes.do" /> </action> <action path="/ExibirAgencia" type="com.sistemabancario.apresentacao.action.ExibirAgenciaAction"> <forward name="SucessoNaExibicao" path="/jsp/CadastroDeAgencia.jsp" /> </action> struts-config.xml <action path="/CadastrarAgencia" type="com.sistemabancario.apresentacao.action.CadastrarAgenciaAction" name="formularioAgencia"> <forward name="ListarAgencias" path="/ListarAgencias.do" /> </action> <action path="/ListarAgencias" type="com.sistemabancario.apresentacao.action.ListarAgenciasAction"> <forward name="Sucesso" path="/jsp/ListaDasAgencias.jsp" /> </action> </action-mappings> <message-resources parameter="resources.application" /> </struts-config> ListaDasAgencias.jsp <%@ taglib uri="/tags/struts-html" prefix="html"%> <%@ taglib uri="/tags/struts-bean" prefix="bean"%> <%@ taglib uri="/tags/struts-logic" prefix="logic"%> <link rel="stylesheet" href="css/Estilo.css" type="text/css"> <html> <head> <title><bean:message key="cadastroDeAgencia.tituloDaPaginaDeConsulta"/> </title> </head> <body> <table> <tr> <td> <jsp:include page="Cabecalho.jsp"/> </td> </tr> </table> <h1><bean:message key="cadastroDeAgencia.tituloDaPaginaDeConsulta"/></h1> <logic:present name="agencias"> <table border="1"> <tr> ListaDasAgencias.jsp <th> <bean:message key="cadastro.nome"/> </th> <th> <bean:message key="cadastro.endereco" /> </th> <th> <bean:message key="cadastro.telefone" /> </th> <th> <bean:message key="cadastro.nome" /> do Gerente </th> <th> <bean:message key="mensagem.editar" /> </th> <th> <bean:message key="mensagem.excluir" /> </th> </tr> <logic:iterate id="agencia" name="agencias"> <tr> ListaDasAgencias.jsp <td> <bean:write name="agencia" property="nome"/> </td> <td> <bean:write name="agencia" property="endereco"/> </td> <td> <bean:write name="agencia" property="telefone"/> </td> <td> <bean:write name="agencia" property="gerente.nome" /> </td> <td align=center> <html:link page="/ExibirAgencia.do" paramId="id" paramName="agencia" paramProperty="id"> <html:image src="imagens/edit.gif" alt="Editar Registro" /> </html:link> </td> <td align=center> <html:link page="/ExcluirAgencia.do" paramId="id" paramName="agencia" paramProperty="id"> <html:image src="imagens/delete_2x.gif" alt="Excluir Registro" /> </html:link> </td> </tr> </logic:iterate> ListaDasAgencias.jsp <tr> <td colspan="6"> <html:link page="/ExibirAgencia.do"> <html:img src="imagens/add.gif" alt="Adicionar Registro" border="0" align="right" /> </html:link> </table> </logic:present> </body> </html> CadastroDeAgencia.jsp <%@ taglib uri="/tags/struts-html" prefix="html"%> <%@ taglib uri="/tags/struts-bean" prefix="bean"%> <link rel="stylesheet" href="css/Estilo.css" type="text/css"> <html> <head> <title><bean:message key="cadastroDeAgencia.tituloDaPaginaDeCadastro"/></title> </head> <body> <h1><bean:message key="cadastroDeAgencia.tituloDaPaginaDeCadastro"/></title></h1> <table border=1> <html:form action="CadastrarAgencia"> <html:hidden property="id" name="agencia"/> <tr> <td> <bean:message key="cadastro.nome" /> </td> <td> <html:text property="nome" name="agencia" maxlength="30" size="30" /> </td> </tr> <td> <bean:message key="cadastro.endereco" /> </td> CadastroDeAgencia.jsp <td> <html:text property="endereco" name="agencia" size="30" /> </td> <tr> <td> <bean:message key="cadastro.telefone" /> </td> <td> <html:text property="telefone" name="agencia" size="20" /> </td> </tr> <tr> <td> <bean:message key="cadastroDeGerente.listaDeGerentes" /> </td> <td> <html:select property="gerente.id" name="agencia"> <html:optionsCollection name="gerentes" label="nome" value="id" /> </html:select> </td> </tr> <tr> <td> CadastroDeAgencia.jsp <html:button onclick="submit()" property="btnGravar" value="Gravar" /> </td> <td> <html:button onclick="action='ListarAgencias.do';submit()" property="btnVoltar" value="Voltar" /> </td> </tr> </html:form> </table> </body> </html> FormularioAgencia.java package com.sistemabancario.apresentacao.formulario; import org.apache.struts.action.*; public class FormularioAgencia extends ActionForm { private String id; private String nome; private String endereco; private String telefone; public String getEndereco() { return endereco; } public void setEndereco(String endereco) { this.endereco = endereco; } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getNome() { return nome; } public void setNome(String nome) { this.nome = nome; } FormularioAgencia.java public String getTelefone() { return telefone; } public void setTelefone(String telefone) { this.telefone = telefone; } } CadastrarAgenciaAction.java package com.sistemabancario.apresentacao.action; import javax.servlet.http.*; import org.apache.commons.beanutils.*; import org.apache.struts.action.*; import com.sistemabancario.apresentacao.formulario.*; import com.sistemabancario.entidades.*; import com.sistemabancario.persistencia.*; public class CadastrarAgenciaAction extends Action { public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { String id = request.getParameter("id"); String idG = request.getParameter("gerente.id"); FormularioAgencia formularioAgencia = (FormularioAgencia) form; DAOAgencia daoAgencia = new DAOAgencia(); Agencia agencia = new Agencia(); Long idGerente = new Long(idG); Gerente gerente = new DAOGerente().consultarPeloId(idGerente); CadastrarAgenciaAction.java if (id == null || id.equals("") || id.equals("0")) { BeanUtils.copyProperties(agencia, formularioAgencia); agencia.setGerente(gerente); daoAgencia.inserir(agencia); } else { Long idAgencia = new Long(id); agencia = daoAgencia.consultarPeloId(idAgencia); BeanUtils.copyProperties(agencia, formularioAgencia); agencia.setGerente(gerente); daoAgencia.atualizar(agencia); } return mapping.findForward("ListarAgencias"); } } ExibirAgenciaAction.java package com.sistemabancario.apresentacao.action; import java.util.*; import javax.servlet.http.*; import org.apache.struts.action.*; import com.sistemabancario.entidades.*; import com.sistemabancario.persistencia.*; public class ExibirAgenciaAction extends Action { public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { Agencia agencia = new Agencia(); String id = request.getParameter("id"); if (id != null) { DAOAgencia daoAgencia = new DAOAgencia(); Long idAgencia = new Long(id); agencia = daoAgencia.consultarPeloId(idAgencia); } else { agencia.setGerente(new Gerente()); } ExibirAgenciaAction.java DAOGerente daoGerente = new DAOGerente(); Collection lista = daoGerente.consultarTodos(); request.setAttribute("agencia", agencia); request.setAttribute("gerentes", lista); return mapping.findForward("SucessoNaExibicao"); } } ListarAgenciasAction.java package com.sistemabancario.apresentacao.action; import java.util.*; import javax.servlet.http.*; import org.apache.struts.action.*; import com.sistemabancario.persistencia.*; public class ListarAgenciasAction extends Action { public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { DAOAgencia daoAgencia = new DAOAgencia(); Collection lista = daoAgencia.consultarTodos(); request.setAttribute("agencias", lista); return mapping.findForward("Sucesso"); } }