struts jakarta struts marco antonio, arquiteto de software – tjdf [email protected] Última...

81
Struts Jakarta Struts Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis. net Última revisão: Maio/2007

Upload: internet

Post on 17-Apr-2015

106 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Struts Jakarta Struts Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Última revisão: Maio/2007

Struts

Jakarta Struts

Marco Antonio,

Arquiteto de Software – TJDF

[email protected]

Última revisão: Maio/2007

Page 2: Struts Jakarta Struts Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Ú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.

Page 3: Struts Jakarta Struts Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Última revisão: Maio/2007

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.

Page 4: Struts Jakarta Struts Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Última revisão: Maio/2007

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.

Page 5: Struts Jakarta Struts Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Última revisão: Maio/2007

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.

Page 6: Struts Jakarta Struts Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Última revisão: Maio/2007

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>

Page 7: Struts Jakarta Struts Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Última revisão: Maio/2007

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>

Page 8: Struts Jakarta Struts Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Última revisão: Maio/2007

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.

Page 9: Struts Jakarta Struts Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Última revisão: Maio/2007

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.

Page 10: Struts Jakarta Struts Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Última revisão: Maio/2007

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.

Page 11: Struts Jakarta Struts Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Última revisão: Maio/2007

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.

Page 12: Struts Jakarta Struts Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Última revisão: Maio/2007

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.

Page 13: Struts Jakarta Struts Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Última revisão: Maio/2007

JVM Settings

Page 14: Struts Jakarta Struts Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Última revisão: Maio/2007

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.

Page 15: Struts Jakarta Struts Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Última revisão: Maio/2007

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>

Page 16: Struts Jakarta Struts Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Última revisão: Maio/2007

Entenda o struts-config.xmlPath: 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!

Page 17: Struts Jakarta Struts Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Última revisão: Maio/2007

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

Page 18: Struts Jakarta Struts Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Última revisão: Maio/2007

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.

Page 19: Struts Jakarta Struts Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Última revisão: Maio/2007

BemVindoAction.javapackage 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");

}

}

Page 20: Struts Jakarta Struts Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Última revisão: Maio/2007

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.

Page 21: Struts Jakarta Struts Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Última revisão: Maio/2007

BemVindo.jsp1. <%@ 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>

Page 22: Struts Jakarta Struts Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Última revisão: Maio/2007

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.

Page 23: Struts Jakarta Struts Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Última revisão: Maio/2007

Cabecalho.jspOpções:

<a href="ListarGerentes.do">Gerentes</a>

| Agências

| Cliente

| Contas-Corrente

| <a href="BemVindo.do">Página Inicial</a>

Page 24: Struts Jakarta Struts Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Última revisão: Maio/2007

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.

Page 25: Struts Jakarta Struts Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Última revisão: Maio/2007

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.

Page 26: Struts Jakarta Struts Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Última revisão: Maio/2007

Core classes

Page 27: Struts Jakarta Struts Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Última revisão: Maio/2007

Mais uma ação

Vamos acrescentar mais uma tag action na nossa aplicação.Dessa vez, vamos listar todos os gerentes.

Page 28: Struts Jakarta Struts Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Última revisão: Maio/2007

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>

Page 29: Struts Jakarta Struts Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Última revisão: Maio/2007

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.

Page 30: Struts Jakarta Struts Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Última revisão: Maio/2007

ListarGerentesAction.javapackage 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");

}

}

Page 31: Struts Jakarta Struts Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Última revisão: Maio/2007

DAOGerente – mockpackage 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()); }

Page 32: Struts Jakarta Struts Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Última revisão: Maio/2007

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

Page 33: Struts Jakarta Struts Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Última revisão: Maio/2007

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.

Page 34: Struts Jakarta Struts Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Última revisão: Maio/2007

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>

Page 35: Struts Jakarta Struts Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Última revisão: Maio/2007

ListaDosGerentes.jsp

Declaração das taglibs que vamos usar nessa página.Html para os componentes html.Bean para acessar os javabeansLogic para o loop. Lembre-se: vamos mostar vários registros.

Page 36: Struts Jakarta Struts Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Última revisão: Maio/2007

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>

Page 37: Struts Jakarta Struts Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Última revisão: Maio/2007

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.

Page 38: Struts Jakarta Struts Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Última revisão: Maio/2007

ListaDosGerentes.jsp1. <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>

Page 39: Struts Jakarta Struts Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Última revisão: Maio/2007

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.

Page 40: Struts Jakarta Struts Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Última revisão: Maio/2007

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.

Page 41: Struts Jakarta Struts Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Última revisão: Maio/2007

Tela da consulta

Page 42: Struts Jakarta Struts Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Última revisão: Maio/2007

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.

Page 43: Struts Jakarta Struts Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Última revisão: Maio/2007

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>

Page 44: Struts Jakarta Struts Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Última revisão: Maio/2007

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.

Page 45: Struts Jakarta Struts Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Última revisão: Maio/2007

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>

Page 46: Struts Jakarta Struts Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Última revisão: Maio/2007

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>

Page 47: Struts Jakarta Struts Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Última revisão: Maio/2007

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

Page 48: Struts Jakarta Struts Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Última revisão: Maio/2007

FormularioGerente.javapackage 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;

}

Page 49: Struts Jakarta Struts Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Última revisão: Maio/2007

FormularioGerente.java public void setNome(String nome) {

this.nome = nome;

}

public String getTelefone() {

return telefone;

}

public void setTelefone(String telefone) {

this.telefone = telefone;

}

}

Page 50: Struts Jakarta Struts Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Última revisão: Maio/2007

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.

Page 51: Struts Jakarta Struts Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Última revisão: Maio/2007

ExibirGerenteAction.javapackage 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");

}

}

Page 52: Struts Jakarta Struts Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Última revisão: Maio/2007

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.

Page 53: Struts Jakarta Struts Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Última revisão: Maio/2007

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>

Page 54: Struts Jakarta Struts Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Última revisão: Maio/2007

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>

Page 55: Struts Jakarta Struts Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Última revisão: Maio/2007

CadastroDeGerente.jsp6. <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>

Page 56: Struts Jakarta Struts Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Última revisão: Maio/2007

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.

Page 57: Struts Jakarta Struts Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Última revisão: Maio/2007

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.

Page 58: Struts Jakarta Struts Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Última revisão: Maio/2007

CadastrarGerenteAction.javapackage 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”);

}

}

Page 59: Struts Jakarta Struts Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Última revisão: Maio/2007

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

Page 60: Struts Jakarta Struts Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Última revisão: Maio/2007

struts-config.xml <action path="/ExcluirGerente"

type="com.sistemabancario.apresentacao.action.ExcluirGerenteAction">

<forward name="ListarGerentes" path="/ListarGerentes.do" />

</action>

Page 61: Struts Jakarta Struts Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Última revisão: Maio/2007

struts-config.xml

Última action da configuração do Struts.Acrescente essas tags ao arquivo de configuração já existente.

Page 62: Struts Jakarta Struts Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Última revisão: Maio/2007

ExcluirGerenteAction.javapackage 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");

}

}

Page 63: Struts Jakarta Struts Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Última revisão: Maio/2007

ExcluirGerenteAction.java

O id, informado na tela de consulta, é utilizado como parâmetro para a exclusão no DAOGerenteEm seguida, voltamos à página de consulta, vendo uma lista atualizada com os gerentes restantes

Page 64: Struts Jakarta Struts Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Última revisão: Maio/2007

Dúvidas?

Page 65: Struts Jakarta Struts Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Última revisão: Maio/2007

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>

Page 66: Struts Jakarta Struts Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Última revisão: Maio/2007

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>

Page 67: Struts Jakarta Struts Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Última revisão: Maio/2007

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>

Page 68: Struts Jakarta Struts Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Última revisão: Maio/2007

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>

Page 69: Struts Jakarta Struts Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Última revisão: Maio/2007

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>

Page 70: Struts Jakarta Struts Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Última revisão: Maio/2007

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>

Page 71: Struts Jakarta Struts Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Última revisão: Maio/2007

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>

Page 72: Struts Jakarta Struts Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Última revisão: Maio/2007

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>

Page 73: Struts Jakarta Struts Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Última revisão: Maio/2007

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>

Page 74: Struts Jakarta Struts Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Última revisão: Maio/2007

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>

Page 75: Struts Jakarta Struts Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Última revisão: Maio/2007

FormularioAgencia.javapackage 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;

}

Page 76: Struts Jakarta Struts Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Última revisão: Maio/2007

FormularioAgencia.java public String getTelefone() {

return telefone;

}

public void setTelefone(String telefone) {

this.telefone = telefone;

}

}

Page 77: Struts Jakarta Struts Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Última revisão: Maio/2007

CadastrarAgenciaAction.javapackage 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);

Page 78: Struts Jakarta Struts Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Última revisão: Maio/2007

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

}

}

Page 79: Struts Jakarta Struts Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Última revisão: Maio/2007

ExibirAgenciaAction.javapackage 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());

}

Page 80: Struts Jakarta Struts Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Última revisão: Maio/2007

ExibirAgenciaAction.java DAOGerente daoGerente = new DAOGerente();

Collection lista = daoGerente.consultarTodos();

request.setAttribute("agencia", agencia);

request.setAttribute("gerentes", lista);

return mapping.findForward("SucessoNaExibicao");

}

}

Page 81: Struts Jakarta Struts Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Última revisão: Maio/2007

ListarAgenciasAction.javapackage 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");

}

}