Struts - Marco Reis

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