Embed
Email

Struts

Document Sample
Struts
Shared by: HC111126152854
Categories
Tags
Stats
views:
1
posted:
11/26/2011
language:
pages:
81
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.

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









action

org.apache.struts.action.ActionServlet



config

/WEB-INF/struts-config.xml



1





action

*.do



web.xml



/tags/struts-bean

/WEB-INF/struts-bean.tld





/tags/struts-logic

/WEB-INF/struts-logic.tld





/tags/struts-html

/WEB-INF/struts-html.tld





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:











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



















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.

2.







3.





4.





5.



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:

Gerentes

| Agências

| Cliente

| Contas-Corrente

| Página Inicial

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





























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



































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



1.







2.





























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.





2.





3.





4.





5.

6.





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



1.

2.







3.





4.

5.





6.





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





































struts-config.xml





















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





















1.

2.











3.





CadastroDeGerente.jsp









4.













5.









CadastroDeGerente.jsp

6.





7.













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







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







































struts-config.xml





































struts-config.xml































ListaDasAgencias.jsp











































ListaDasAgencias.jsp





















do Gerente





















ListaDasAgencias.jsp

















































ListaDasAgencias.jsp



















CadastroDeAgencia.jsp















































CadastroDeAgencia.jsp















































CadastroDeAgencia.jsp





















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

}

}


Related docs
Other docs by HC111126152854
Sayfa1
Views: 2  |  Downloads: 0
Moodle?? ???2006/8/19
Views: 0  |  Downloads: 0
What MATLAB Is and Does:
Views: 0  |  Downloads: 0
1 le 2b3f
Views: 13  |  Downloads: 0
Softball Mechanic Tutorial
Views: 1  |  Downloads: 0
PRESIDENT�S MANAGEMENT REPORT
Views: 1  |  Downloads: 0
grad74
Views: 20  |  Downloads: 0
By registering with docstoc.com you agree to our
privacy policy

You are almost ready to download!

You are almost ready to download!