© JCFJ
10.1
SEL6303 –
S
istemas de Informação Web
JSP/Servlets –
Web e Tecnologia Java: JSP/Servlets
Aula 10
10.2
SEL6303 –
S
istemas de Informação Web
JSP/Servlets –
Desenvolvimento em N Camadas
A tendência atual no desenvolvimento de programas corporativos é fornecer estruturas de N camadas Ö Objetiva-se obter aplicativos seguros, flexíveis e disponíveis.
As soluções técnicas atuais que implementam esta solução são:
– J2EE (Java 2 Enterprise Edition) da Sun Microsystems; – Plataforma .NET (.NET Framework) da Microsoft.
Atualmente existem diversos servidores de aplicações que podem abrigar soluções que empregam esta tecnologia.
Os clientes que podem tirar proveito desta arquitetura podem ser tão simples quanto um navegador Web.
A terminologia utilizada pode ser confusa e usada de maneira inconsistente Ö Uma camada pode ser tanto um camada física representando uma separação física (máquinas diferentes) quanto uma camada lógica representando um software Ö Múltiplas camadas lógicas podem estar na mesma camada física (uma mesma máquina).
Quando for necessário se utilizará explicitamente os termos camada física e camada lógica. – Introdução
© JCFJ
10.3
SEL6303 –
S
istemas de Informação Web
JSP/Servlets –
Uma Camada – Desenvolvimento Monolítico
Computadores de grande porte ou computadores pessoais independentes, são e foram ambientes ideais para se encontrar aplicativos monolíticos Ö Grandes softwares contendo toda as funcionalidades da aplicação Ö Manutenção difícil (algumas vezes chamado código espaguete).
Toda entrada do usuário, verificação da lógica do negócio e acesso a dados era processada pela mesma máquina por uma única aplicação Ö Esta solução era satisfatória para um ambiente onde imperavam os computadores de grande porte e/ou os centros de dados corporativos pois se tinha um controle absoluto e as próprias aplicação evoluíam mais lentamente.
Atualmente os sistemas exigem um alto nível de manutenção que é quase incompatível com aplicações monolíticas Ö Pode-se chegar a situações de recompilações diárias.
Para aplicativos simples que não utilizam conectividade de rede o desenvolvimento monolítico pode ser suficiente Ö Entretanto, mesmo nestes casos (um cliente acessando um banco de dados) estes aplicativos podem tirar proveito do modelo de diversas camadas.
Como tanto a lógica de negócio como de apresentação e o acesso aos dados estão codificadas juntas, a recompilação de muitas partes do código pode ser necessária dificultando a adição de novas funcionalidades Ö Suplementarmente, alterações em uma parte do sistema podem introduzir erros em outras partes não relacionadas.
A instalação do mesmo sistema em máquinas diferentes também introduz o problema de controle das versões que é um problema suplementar a ser tratado.
– Introdução
10.4
SEL6303 –
S
istemas de Informação Web
JSP/Servlets –
Uma Camada
Banco de Dados Lógica de
Apresentação Lógica deNegócio Acesso a DadosLógica de
Martin Bond et alli., Aprenda J2EE em 21 Dias, Pearson Education do Brasil Ltda, 2003.
A divisão em camadas lógicas de funcionalidade pode ser baseada nas diferentes responsabilidades das partes do código da aplicação:
– Lógica de Apresentação: está ligada a interação do usuário com a aplicação e a maneira com a qual as informações são apresentadas aos usuários
– Lógica do Negócio: implementa o processamento ligado às regras do negócio para o qual foi desenvolvida a aplicação
– Lógica de Acesso aos Dados: está ligada a conexão realizada com as fontes de dados e também a manipulação pela lógica de negócio dos dados da fonte de dados
© JCFJ
10.5
SEL6303 –
S
istemas de Informação Web
JSP/Servlets –
Duas Camadas
Surgimento em conseqüência do desejo de se compartilhar dados entre aplicativos executados em máquinas diferentes Ö Utilização de uma máquina para abrigar o servidor de banco de dados. Banco de Dados Lógica de Acesso a Dados Lógica de
Apresentação Lógica deNegócio Com duas camadas a aplicação implementa
a lógica de apresentação e de negócios Ö Os dados são acessíveis em outra máquina através de uma conexão a um banco de dados Ö Alterações na lógica de acesso a dados não devem interferir com o restante.
No limite desta arquitetura toda a camada de acesso aos dados pode ser trocada Ö Um outro banco de dados pode, por exemplo, ser utilizado sem interferência nas outras duas camadas desde que a interface entre as duas camadas não mude.
– Introdução
10.6
SEL6303 –
S
istemas de Informação Web
JSP/Servlets –
Duas Camadas – Conseqüências
Em aplicações de duas camadas o cliente ainda mantém contato com a lógica de negócio e precisa saber detalhes da localização da fonte de dados Ö Como o cliente concentra grande parte do processamento este arquitetura é conhecida como Cliente Gordo(Thick) Ö Clientes gordos normalmente precisam ser atualizados quando a aplicação muda Ö Dificuldades para manter versões atualizadas.
O cliente gordo irá ter acesso ao código referente a lógica do negócio (mesmo que compilado) o que pode ser um problema.
Com a Internet iniciou-se a separação da lógica do negócio da interface do usuário Ö Usuários da Internet precisam acessar aplicativos sem instalar código em suas máquinas Ö Eles têm acesso aos aplicativos através de navegadores Web.
Como a lógica do negócio não reside mais na máquina do usuário o cliente é denominado Cliente Magro(Thin)
© JCFJ
10.7
SEL6303 –
S
istemas de Informação Web
JSP/Servlets –
Três Camadas
Com três camadas separa-se efetivamente cada uma das lógicas de funcionalidades em camadas diferentes Öo Cliente Gordo torna-se Magro Ö a lógica de apresentação está separada.
A lógica de apresentação está separada em uma camada lógica e física própria Ö Diferentes tipos de lógica de
apresentação podem ser utilizadas (HTML, interface gráfica, etc.) para acessar a lógica de negócio.
Este tipo de arquitetura de três camadas tornou-se o modelo utilizado na maior parte das Aplicações Web Ö A separação em camadas torna os sistemas mais flexíveis em relação às alterações que podem ser feitas
A separação em camadas físicas diferentes pode ainda oferecer uma maior flexibilidade em relação ao hardware pois pode permitir a separação da aplicação em máquinas diferentes. Como a lógica de apresentação está em sua própria camada o código específico desta camada
pode ser escrito por especialistas em apresentação que não precisam conhecer a tecnologia utilizada nas outras duas camadas.
Banco de Dados Lógica de Acesso a Dados Lógica de Apresentação – Introdução Lógica de Negócio 10.8 SEL6303 – S
istemas de Informação Web
JSP/Servlets –
O Padrão MVC e JSP – I
[6]
O Padrão
MVC
(
Model, View, Controller
) tem origem no Framework MVC de
Smalltalk Ö Em aplicações Web os termos MVC e Model 2 são normalmente
intercambiáveis.
MVC e Model 2 são normalmente utilizados para descrever a estrutura de uma
aplicação
Struts
.
Aplicações Web baseadas em JSP normalmente são divididas em aplicações JSP de
arquitetura Model 1 e Model 2 Ö Aplicações com Model 1 normalmente são
apropriadas para sistemas simples.
Em aplicações baseadas no padrão MVC o fluxo de controle é mediado por um
Controlador que delega requisições a gerenciadores específicos Ö Os gerenciadores
estão ligados ao modelo e cada gerenciador funciona como um adaptador entre a
requisição e o modelo.
O Modelo representa ou encapsula o estado ou a lógica de um negócio.
Após o modelo ter operado, o controle é reenviado pelo controlador à visão
apropriada Ö O encaminhamento pode ser determinado pelo controlador através de
um mapeamento.
© JCFJ
10.9
SEL6303 –
S
istemas de Informação Web
JSP/Servlets –
O Padrão MVC e JSP – II
[5]
Aplicações complexas utilizando Model 1 normalmente tem uma grande quantidade
de scriptlets com código Java presente nas páginas JSP Ö O desenvolvedor deve
conhecer Java.
Navegador
JSP
Javabean
Servidor de Aplicação Fontes de Dados
1 2 3 4 – Introdução
Arquitetura Model 1
10.10 SEL6303 – Sistemas de Informação Web
JSP/Servlets –
O Padrão MVC e JSP – III
[5]
Aplicações que utilizam Model 2 utilizam Servlets e JSP tirando vantagem das
melhores características de cada uma das tecnologias Ö O servlet funcionará como o
controlador da aplicação criando também todos os objetos e beans utilizados pelas
páginas JSP.
Arquitetura Model 2
Navegador Servlet (Controler) Javabean (Model)Servidor de Aplicação Fontes de Dados
1 2 3 4 JSP (View) instancia 5 – Introdução
© JCFJ
10.11
SEL6303 –
S
istemas de Informação Web
JSP/Servlets –
Apache Struts
Struts é um Framework que pode ser utilizado para o desenvolvimento de aplicações
JSP utilizando a arquitetura MVC oferecendo:
– Um Servlet que deve ser utilizado como controlador sendo configurável através de um documento XML Ö Este servlet irá encaminhar as requisições a classes (Action Classes) que devem ser criadas pelo desenvolvedor para realizar o processamento.
– Um coleção de bibliotecas de tags (taglibs) que podem ser utilizadas no desenvolvimento da aplicação evitando atualização de código nas páginas e facilitando o desenvolvimento.
– Classes auxiliares que auxiliam na implementação de diferentes operações corriqueiras no desenvolvimento de Sistemas Web Java, como suporte a tratamento de XML,
preenchimento de Javabeans ou gerenciamento externo do conteúdo de interface de usuário (diversas línguas).
– Introdução
10.12
SEL6303 –
S
istemas de Informação Web
JSP/Servlets –
Apache Struts - Componentes
Model
(
M
): geralmente o modelo é implementado através de um objeto Java (um
Javabean).
View
(
V
): normalmente a visão é implementada através de uma página HTML ou JSP.
Controller
(
C
): é implementado por um objeto de
org.apache.struts.action.ActionServlet
ou de uma sub-classe.
Classes Auxiliares
: Struts oferece um conjunto de classes que auxiliam no
desenvolvimento:
– FormBeans: utilizada no encapsulamento de dados de formulários HTML Ö Ligado ao Modelo.
– ActionErrors: utilizada no encapsulamento de dados de erros Ö Ligada ao Modelo.
– Tags Personalizadas (Custon Tags): encapsulam a lógica para a apresentação Ö Ligada à Visão.
– Actions: implementam a lógica dos comandos Ö Ligada ao Controle.
– ActionForward: utilizadas no encapsulamento da lógica de redirecionamento Ö Ligada ao Controle.
© JCFJ
10.13
SEL6303 –
S
istemas de Informação Web
JSP/Servlets –
Apache Struts – O Modelo
[4]
O modelo de um sistema baseado no padrão MVC pode normalmente ser dividido em dois subsistemas ÖEstado interno (substantivos) do sistema e as Ações(verbos) que levam a mudança de estados.
Diversas aplicações representam o estado interno por Javabeans Ö As propriedades dos beans representam os detalhes do estado do sistema Ö Dependendo da complexidade do sistema os beans podem estar conectados ou não a bancos de dados para persistência dos dados.
Grandes aplicações normalmente serão desenvolvidas com beans que oferecem métodos que irão realizar a manipulação da informação mantida pelos beans ou utilizando Session EnterpriseJava Beans (J2EE).
Aplicações mais simples podem ter as operações do sistema inseridas em Classes Action que são parte da camada Controle Ö Opção útil quando a lógica for simples ou quando a
reutilização da lógica não for necessária.
A camada Modelo de uma aplicação MVC normalmente está ligada a uma tecnologia
específica Ö Struts permite que se utilize diversas tecnologias em comunicação com o modelo, como JDBC, Enterprise Java Beans, Object Relational Bridge, etc.
Embora a lógica possa ser inserida no controle devido a simplicidade de um sistema, recomenda-se fortemente que a Lógica da Aplicação (como as coisas são feitas)
esteja separada do papel desempenhado pelas Classes Action (o quê fazer). – Introdução
10.14
SEL6303 –
S
istemas de Informação Web
JSP/Servlets –
Apache Struts – A Visão
[4]
Em um sistema baseado no padrão MVC a parte Visão é normalmente construída utilizando a tecnologia de JavaServer Pages – JSP Ö Possibilidade de utilização de texto estático HTML (ou XML) com a inserção de conteúdo dinâmico baseado na interpretação de tags especiais. O ambiente JSP inclui uma série de tags de ação (<jsp:useBean>) e oferece a possibilidade
de desenvolvimento e utilização de tags personalizadas.
O Framework Struts inclui uma série de Bibliotecas de Tags que facilitam a criação de interfaces de usuário que podem ser facilmente transformadas para se adaptar a diferentes línguas Ö Estas taglibs interagem facilmente com beans ActionFormÖActionForm
capturam e validam as entradas de um formulário.
As Taglibs Struts oferecem suporte a camada Visão de aplicações MVC Ö Algumas podem acessar objetos da camada de Controle e outras podem ser utilizadas no desenvolvimento de aplicações Ö Outras Taglibs incluindo JSTL podem ser utilizadas com Struts Ö Templates Velocity (ver www.apache.org) e XSLT também podem ser utilizadas.
© JCFJ
10.15
SEL6303 –
S
istemas de Informação Web
JSP/Servlets –
Apache Struts – O Controlador
[4]
Em um sistema baseado no padrão MVC o Controlador deve receber as requisições dos clientes (normalmente um usuário utilizando um navegador), decidir que função da lógica de negócios deve ser realizada para então delegar a responsabilidade de produzir a interface do usuário a um componente da Visão.
Em Struts o componente primário de um Controlador é um servlet da classe ActionServlet
Ö Este servlet é configurado definindo um conjunto de ActionMappingÖ Um
ActionMappingdefine o caminho para um nome totalmente qualificado de uma Action Class Ö Todas as ações são subclasses de org.apache.struts.action.Action Ö
Actionsencapsulam chamadas para classes que implementam a lógica de negócios,
interpretam os resultados e finalmente despacham o controle para o componente apropriado da Visão que irá cria a resposta.
Struts permite que se utilize o modelo de comando na aplicação Ö A aplicação chama a
“Página de Menu” sem saber a localização da página JSP específica Ö Real separação entre a lógica de controle (o quê fazer) da lógica de apresentação (como a informação é apresentada). O Framework Struts fornece diversos componentes que implementam a camada Controle de
uma aplicação MVC Ö Servlet de Controle, possibilidade de utilizar gerenciadores de requisições desenvolvidos pelos usuários e diversos objetos de suporte.
– Introdução
10.16
SEL6303 –
S
istemas de Informação Web
JSP/Servlets –
Funcionamento – I
[4]
Os componentes chave de uma aplicação Struts são [4]:
– ActionServlet: é o controlador da aplicação despachando as ações a serem executadas.
– Action: é um classe que deve ser estendida por cada ação (comando do modelo de comandos) a ser implementada.
– struts-config.xml: arquivo que define os mapeamentos entre as ações as páginas os beans e os dados. JSP ActionServlet FormBean Bean Action Dados ou DAO HTTP delega despacha preenche lê – Introdução
© JCFJ
10.17
SEL6303 –
S
istemas de Informação Web
JSP/Servlets –
Funcionamento – II
[5]
Quando inicializado, o Controlador analisa o arquivo de configuração (
struts-config.xml) e o utiliza para criar outros objetos da camada de controle Ö O conjunto destes objetos representa a Configuração Struts que define entre outras coisas os
ActionsMappings(org.apache.struts.action.ActionMappings) da aplicação.
O servlet de controle Struts consulta os ActionMappings e encaminha as requisições HTTP aos outros componentes do Framework Ö Requisições podem ser encaminhadas para
JavaServer Pages ou subclasses Action (org.apache.struts.action.Action) criadas pelo desenvolvedor Ö Os mapeamentos auxiliam o Controlador a transformar requisições HTTP em ações Ö Um ActionMapping individual
(org.apache.struts.action.ActionMapping) contem normalmente as seguintes propriedades:
a. O caminho da requisição (request path).
b. O tipo do objeto (Subclasse de Action) que age sobre a requisição c. Outras propriedades necessárias.
O objeto Actionpode manipular a requisição e responder ao cliente (normalmente um navegador) ou indicar que o controle deve ser encaminhado a outro componente Ö Objetos
Actiontêm acesso ao servlet de controle e consequentemente a seus métodos Ö Quando um objeto encaminha o processamento ele pode encaminhar objetos (Javabeans) colocando-os nos contextos compartilhados por servlets Java.
– Introdução
10.18
SEL6303 –
S
istemas de Informação Web
JSP/Servlets –
Funcionamento – III
[5]
continuação...Ö Ex.: um objeto Actionpode criar um bean responsável por manter uma cesta de compras, adicionar itens a cesta, colocar o bean no contexto da sessão e então encaminhar o controle para outro mapeamento.
Em uma aplicação Struts a maior parte da Lógica de Negócio é representada utilizando-se Javabeans Ö Uma Actionpode acessar as propriedades do Javabeans sem conhecer seu funcionamento Ö Devido ao encapsulamento implementado, os objetos Action podem se concentrar no tratamento de erros e no encaminhamento do controle.
Javabeans também podem ser utilizados para manipular formulários de entrada de dados Ö pPde-se definir um conjunto de Beans dedicados ao tratamento das entradas (Form Beans) Ö Estes beans são subclasses de ActionForm(org.apache.struts.action.ActionForm)
Ö Objetos ActionFormfacilitam o armazenamento e validação dos dados fornecidos em formulários Ö Eles são automaticamente salvos em um dos contextos padrão e podem ser utilizados por outros objetos como Actionou páginas JSP.
Um bean de formulário (Form Beans) pode ser utilizado por uma página JSP para coletar dados do usuário, por um objeto Actionpara validar os dados e então novamente pela página JSP para reapresentar os dados Ö Caso erros ligados ao preenchimento do formulário apareçam Struts fornece um mecanismo para a apresentação de mensagens de erros.
© JCFJ
10.19
SEL6303 –
S
istemas de Informação Web
JSP/Servlets –
Funcionamento – IV
[5]
A criação de um ActionFormé “gerenciada” por ActionFormBeansÖ
ActionFormBeans(org.apache.struts.action.ActionFormBeans) compõem uma coleção de objetos descritores (descriptor objetcs) que são usados para criar instâncias de objetos ActionFormem tempo de execução Ö Quando um mapeamento necessita de um
ActionFormo servlet controlador verifica os descritores e cria um objeto do tipo
especificado Ö A seguinte seqüência de eventos ocorre quando há uma chamada por uma mapeamento que usa um ActionForm:
– O servlet controlador ou recupera ou cria uma instância de um bean ActionForm; – O servlet de controle passa o bean para um objeto Action;
– Se a requisição estiver sendo usada para submeter uma página de entrada, o objeto Action pode examinar os dados Ö Se necessário, os dados podem ser enviados de volta ao formulário de entrada com uma lista de mensagens a serem apresentadas na página (validação dos dados), caso contrário os dados podem ser enviados a camada de negócio.
– Se a requisição estiver sendo utilizada para criar uma página de entrada, o objeto Action pode popular o bean com quaisquer dados que sejam necessários à página Ö Struts fornece tags personalizados que podem ser utilizadas com esta finalidade Ö As páginas JSP não necessitam conhecer nada da aplicação, somente o nome dos campos e para onde enviar os dados.
– Introdução
10.20
SEL6303 –
S
istemas de Informação Web
JSP/Servlets –
Funcionamento – V
[5]
Em aplicações simples um objeto Actionpode algumas vezes gerenciar a lógica de negócio associada com a requisição Ö Entretanto, na maior parte dos casos um objeto Action deve invocar outro objeto, normalmente um Javabean, para implementar a lógica de negócio Ö Deste modo o objeto Actionpode se concentrar no tratamento de erros e no fluxo de controle da aplicação.
Para permitir reutilização em diferentes plataformas, Javabeans que se ocupam com a lógica de negócios não devem se referir a nenhum objeto da aplicação Web Ö Os objetos Action
devem traduzir os detalhes solicitados pela requisição HTTP para passá-los aos beans da lógica de negócio como variáveis Java regulares Ö Ex.: uma aplicação de banco de dados:
– Um bean da lógica de negócio deve se conectar ao banco de dados e realizar as consultas; – O bean da lógica de negócio retorna o resultado para o objeto Action;
– O objeto Action armazena o resultado em um Form Bean na requisição; – A página JSP apresenta o resultado em uma formulário HTML.
© JCFJ
10.21
SEL6303 –
S
istemas de Informação Web
JSP/Servlets –
Funcionamento - Resumo
1. Usuário clica em um link em uma página HTML 2. Servlet controlador recebe a requisição, verifica as
informações de mapeamento em struts-config.xml e encaminha o processamento para uma ação
3. A ação faz uma chamado para um serviço da camada de modelo. 4. O serviço faz uma chamada aos dados (banco de dados) e os
dados solicitados são retornados. 5. O Serviço retorna a ação.
6. A ação encaminha o processamento a um recurso da camada Visão (uma página JSP)
7. O Servlet verifica o mapeamento do recurso solicitado e encaminha o processamento a página JSP.
8. O arquivo JSP é invocado e enviado ao navegador como HTML. 9. Ao usuário é apresentada uma nova página HTML no navegador.
http://www.exadel.com/tutorial/struts/ 5.2/guess/strutsintro.html
10.22
SEL6303 –
S
istemas de Informação Web
JSP/Servlets –
Utilização de Struts
O Framework Struts foi criado por Craig R. McClanaham e doado à Fundação Apache em 2000 Ö Ele pode ser obtido em http://jakarta.apache.org/struts ou diretamente em http://ftp.pucpr.br/apache/jakarta/struts/binaries/jakarta-struts-1.1.zipÖ O arquivo obtido deve ser descompactado em um diretório qualquer (para manter o conjunto talvez no diretório raiz das aplicações Apache).
Todos os arquivos .jar devem ser copiados para o diretório WEB-INF/lib da aplicação ou para TOMCAT_HOME/lib estando neste caso disponíveis para todas as aplicações.
Todos os arquivos .tld (taglibs) devem ser copiados para o diretório WEB-INF/ da aplicação.
Tendo copiado os .jar e os .tld para os diretórios apropriados se pode começar a
desenvolver uma aplicação com Struts Ö Inicialmente este procedimento será realizado para desenvolver uma aplicação com os mesmos plugins utiliziados até agora Ö Crie um diretório Aula10, no Eclipse crie uma aplicação Web no diretório Aula10 criado e copie os arquivos para os locais apropriados.
© JCFJ
10.23
SEL6303 –
S
istemas de Informação Web
JSP/Servlets –
Importação de struts.jar
Para que a aplicação possa utilizar as funcionalidades do Framework Struts é necessário fazer a declaração do arquivo struts.jar nas bibliotecas do projeto Ö Clicar sobre Aula10/Properties e então selecionar Add External JAR... e localizar e importar o arquivo struts.jar.
10.24
SEL6303 –
S
istemas de Informação Web
JSP/Servlets –
A Visão
Inicialmente se irá criar a página JSP responsável pela comunicação com o usuário Ö Esta página deve ser criada em Aula10.
aula10.jsp
<%@ taglib uri="/bean" prefix="bean" %> <%@ taglib uri="/html" prefix="html" %> <%@ taglib uri="/logic" prefix="logic" %> <%@ taglib uri="/tags" prefix="tag" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html>
<head>
<title>Pedidos via Struts.</title> </head>
<body>
<h1>Faça o seu pedido!</h1> <html:errors/> <tag:type/> <tag:items/> <html:form action="Aula10_02.do"> <table> Importação das taglibs do Struts.
Importação de uma taglib que será desenvolvida.
Tag personalizada de Struts que insere mensagens de erro relativas ao preenchimento do formulário (T26). Tags personalizada que serão desenvolvidas. type armazena em um atributo de nome type os diferentes tipos de refeições e items os diferentes conteúdo das refeições (T33 – T34).
Tag que cria o formulário onde os dados serão apresentados. Em Struts, ações com a extensão .do
são automaticamente mapeadas (web.xml) para o servlet controlador.
© JCFJ
10.25
SEL6303 –
S
istemas de Informação Web
JSP/Servlets –
A Visão
aula10.jsp – continuação... <table> <tr> <td align="LEFT" valign="TOP"> <bean:message key="items"/> <br /><logic:iterate id="items1" name="items"> <html:multibox property="items"> <%= items1 %> </html:multibox> <%= items1 %> <br /> </logic:iterate> </td> <td align="LEFT" valign="TOP"> <bean:message key="type"/> <br /> <html:select property="type"> <html:options name="type"/> </html:select> </td> </tr> <tr> <td align="LEFT"> <br /> <bean:message key="email"/> <html:text property="email"/> </td> <tr> </table> <br />
<html:submit value="Fazer Pedido"/> </html:form>
</body> </html>
– Utilização – A Visão
Utilizando a taglib bean recupera do arquivo ApplicationResources.properties a chave de nome items a ser apresentada (Ts 28-30)
Utilizando a taglib logic realiza uma
iteração para criar uma série de elementos checkbox com os valores estabelecidos pelo tag <tag:items> (T31 – T32).
Utilizando a taglib html define uma série de elementos checkbox (T25).
Utilizando as tag select e options da taglib html cria uma Lista de Seleção com os valores criados pela tag <tag:type>. (T29)
Recupera do arquivo ApplicationResources.properties a chave de nome type a ser apresentada (T28).
Recupera do arquivo ApplicationResources.properties a chave de nome email a ser apresentada e utilizando a tag <html:text> cria a área para entrada do e-mail (T28).
Utilizando a tag <html:submit> cria o botão de envio do formulário (T30).
10.26
SEL6303 –
S
istemas de Informação Web
JSP/Servlets –
© JCFJ
10.27
SEL6303 –
S
istemas de Informação Web
JSP/Servlets –
A Taglib <html> de Struts – I
Cria um controle do tipo checkbox com diversos checkbox. multibox
Cria uma opção de select. option
Cria um conjunto de opções de select. options
Cria um controle do tipo password. password
Cria um elemento HTML <html>. html
Cria um controle do tipo image. image
Cria um controle do tipo img. img
Cria uma âncora ou um hyperlink HTML. link
Apresenta mensagens de erro. errors
Cria um controle do tipo file. file
Define um formulário de entrada de dados. form
Cria um controle do tipo hidden. hidden
Cria um controle do tipo checkbox. checkbox
Cria um botão cancel. cancel
Cria um controle do tipo button. button
Cria um elemento HTML <base>. base
Funcionalidade Nome da Tag
– Utilização – A Visão
Esta taglib contém tags usadas na criação de formulário Struts e também na criação de interfaces HTML.
10.28
SEL6303 –
S
istemas de Informação Web
JSP/Servlets –
A Taglib <html> de Struts – II
Cria um botão submit. submit
Cria um controle do tipo text. text
Cria um controle do tipo textarea. textarea
Cria um controle do tipo select. select
Cria uma URI. rewrite
Cria um botão reset. reset
Cria um controle do tipo radio. radio
Funcionalidade Nome da Tag
Atributos de <html:errors>
Nome do property para o qual as mensagens de erro serão apresentadas. O defaulté apresentar todas as mensagens. property
Nome do bean no escopo onde as mensagens de erro foram armazenadas.
name
Atributo da sessão para a locale (língua) das mensagens a serem apresentadas.
locale
Especifica o contexto do servlet a ser usado. bundle
Funcionalidade Nome da Atributo
© JCFJ
10.29
SEL6303 –
S
istemas de Informação Web
JSP/Servlets –
A Taglib <html> de Struts – III
Atributos de <html:form>Nome totalmente qualificado da classe do bean que deve ser criada se o bean ainda não existir.
type
Um estilo CSS a ser aplicado ao formulário. style
A classe do estilo CSS a ser aplicada ao formulário. styleClass
O identificador a ser atribuido ao formulário HTML. styleId
Frame destino ao qual o formulário será submetido. target
O nome do bean no escopo da requisição ou sessão do qual as propriedades serão usadas para armazenar os dados do formulário.
name
Tratador de evento Javascript chamado quando o botão reset é pressionado. onreset
Tratador de evento Javascript chamado quando o botão submit é pressionado. onsubmit
O escopo do bean associado ao formulário (request ou session). scope
O método HTTP (GET ou POST) a ser utilizado na submissão. method
O nome de um campo ao qual o foco vai ser inicialmente usando uma função Javascript.
focus
A codificação a ser usada para enviar o conteúdo se o método for POST. enctype
URL a qual o formulário será submetido. action Funcionalidade Nome do Atributo – Utilização – A Visão 10.30 SEL6303 – S
istemas de Informação Web
JSP/Servlets –
O Arquivo ApplicationResources.properties
Este arquivo é utilizado para armazenar as mensagens utilizadas na aplicação, inclusive mensagens de erro.
As mensagens declaradas neste arquivo podem ser manipuladas em uma página JSP com o auxílio da taglib struts-bean do Struts.
– Utilização – A Visão
ApplicationResource.properties
email=<b>Seu e-mail:</b> type=<b>Tipo:</b> items=<b>Item:</b>
error.noemail=<li><font color="red">Por favor, forneça seu endereço e-mail.</font></li> error.notype=<li><font color="red">Por favor, selecione um tipo.</font></li>
error.noitems=<li><font color="red">Por favor, selecione ao menos um item.</font></li> errors.header=<font color="red">Por favor, corrija o(s) seguinte(s) erro(s):<ul>
errors.footer=</ul>
Declaração das mensagens (chaves) a serem utilizadas.
Declaração das mensagens de erro a serem utilizadas
Cabeçalho e rodapé da página de erro que são automaticamente utilizados (obrigatórios).
© JCFJ
10.31
SEL6303 –
S
istemas de Informação Web
JSP/Servlets –
A Taglib <bean> de Struts – I
Esta taglib contém tags úteis para o acesso a beans e suas propriedades e também para definir novos beans que são acessíveis ao restante da página através de variáveis de script e atributos com escopo page.
Cria um bean contendo o número de elementos. size
Cria um objeto de configuração Struts e torna-o disponível como um bean. struts
Escreve o valor de uma propriedade de um bean no objeto JspWriter. write
Escreve a string de uma mensagem “internacionalizada” na resposta. page
Cria uma variável de script usando o valor de um parâmetro de request. parameter
Carrega um recurso de uma aplicação Web e torna-o disponível como um bean. resource
Carrega o objeto response e torna-o disponível como um bean. include
Cria uma variável de script usando o valor fornecido por um cabeçalho request. header
Cria uma variável de script usando um valor fornecido pela propriedade de um bean. define
Cria uma variável de script usando um valor fornecido por um cookie. cookie Funcionalidade Nome da Tag – Utilização – A Visão 10.32 SEL6303 – S
istemas de Informação Web
JSP/Servlets –
A Taglib <bean> de Struts – II
Atributos de <bean:xxxxx>Identifica o escopo JSP (page, request, session ou application) onde Struts irá procurar o bean.
scope
Define o nome de uma propriedade de um bean JSP identificado por name. property
Especifica o nome com o qual um bean será manipulado. name
Especifica uma chave em um arquivo de propriedades. key
Especifica a variável/atributo de script que será criado pela tag. id
Funcionalidade Nome do Atributo
© JCFJ
10.33
SEL6303 –
S
istemas de Informação Web
JSP/Servlets –
A Taglib <logic> de Struts – I
Esta taglib contém tags que são úteis na manipulação da geração condicional de texto de saída, na realização de iterações (loops) sobre objetos de coleções para a geração repetitiva de texto de saída bem como para a gerência do fluxo da aplicação.
Realiza uma iteração sobre outros elementos. iterate
Verifica se o valor de um atributo é diferente de uma String. notMatch
“Forward” uma requisição. forward
Redireciona uma requisição. redirect
Compara o valor de um atributo contra um valor1 para verificar se o mesmo é maior que o valor1
greaterThan
Compara o valor de um atributo contra um valor1 para verificar se o mesmo é menor que o valor1
lessThan
Verifica se o valor de um atributo é igual a uma String. match
Compara o valor de um atributo contra um valor1 para verificar se o mesmo é menor ou igual ao valor1
lessEqual
Compara o valor de um atributo contra um valor1 para verificar se o mesmo é maior ou igual ao valor1
greaterEqual
Compara o valor de um atributo contra um valor1 para verificar se não são iguais. notequal
Compara o valor de um atributo contra um valor1 para verificar se são iguais. equal Funcionalidade Nome da Tag – Utilização – A Visão 10.34 SEL6303 – S
istemas de Informação Web
JSP/Servlets –
A Taglib <logic> de Struts – II
Atributos de <logic:xxxxx>O índice de início a partir do qual a iteração deve ser começada. offset
Nome de uma propriedade de um bean cujo método get retorna a coleção sobre a qual a iteração vai ser realizada.
property
Identifica o escopo JSP (page, request, session ou application) onde Struts irá procurar o bean.
scope
Nome totalmente qualificado da classe Java do tipo de dado fornecido pelo bean JSP.
type
O Nome do bean JSP contendo a coleção sobre a qual vai ser feita a iteração. name
Define o número máximo de elementos sobre os quais deve ser feita a iteração em uma página.
length
O nome de um bean JSP com escopo de página que contém o índice da coleção em cada iteração.
indexId
O nome de um bean JSP com escopo de página que contém o elemento corrente de uma coleção em cada iteração.
id
Uma coleção sobre a qual será feita uma iteração. collection
Funcionalidade Nome do Atributo
© JCFJ
10.35
SEL6303 –
S
istemas de Informação Web
JSP/Servlets –
A Taglib Personalizada Criada
Procedimento semelhante ao apresentado na Aula 9 será utilizado para criar a Biblioteca de Tags personalizada que será utilizada na aplicação Ö Deve-se criar a Classe Gerenciadora da Tag, Criar o Arquivo tld da taglib e declará-la no arquivo web.xml da aplicação.
aula10.tld
<?xml version="1.0"?>
<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN" "http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd"> <taglib> <tlibversion>1.0</tlibversion> <jspversion>1.2</jspversion> <shortname>StrutsExample</shortname> <info>
Suporta o Exemplo Struts </info> <tag> <name>type</name> <tagclass>beans.Type</tagclass> <bodycontent>empty</bodycontent> </tag> <tag> <name>items</name> <tagclass>beans.Items</tagclass> <bodycontent>JSP</bodycontent> </tag> </taglib>
Declaração da tag type que é controlada pela classe Java Type que está no pacote tags.
Declaração da tag item que é controlada pela classe Java Items que está no pacote tags. – Utilização – A Visão
10.36
SEL6303 –
S
istemas de Informação Web
JSP/Servlets –
As Classes Gerenciadoras das Tags
Type.java
package tags;
import javax.servlet.jsp.tagext.TagSupport; public class Type extends TagSupport {
public int doStartTag() {
String[] typeArray = {"", "Pizza", "Calzone", “Sanduíche"}; pageContext.setAttribute("type", typeArray);
return SKIP_BODY; }
}
O gerenciador cria uma lista com os diferentes tipos de comida e a armazena no contexto como o atributo type que pode ser utilizado pelas tags Struts. – Utilização – A Visão – A Taglib Personalizada Criada
Items.java
package tags;
import javax.servlet.jsp.tagext.TagSupport; public class Items extends TagSupport {
public int doStartTag() {
String[] itemsArray = {"Lingüiça", "Queijo", "Calabresa", "Carne", "Pimenta"}; pageContext.setAttribute("items", itemsArray);
return SKIP_BODY; }
}
O gerenciador cria uma lista com os itens dos diferentes tipos de comida e a armazena no contexto como o atributo items que pode ser utilizado pelas tags Struts.
© JCFJ
10.37
SEL6303 –
S
istemas de Informação Web
JSP/Servlets –
O Arquivo web.xml
Como em qualquer aplicação Web em web.xml mapeamentos devem ser declarados.
web.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN" "http://java.sun.com/j2ee/dtds/web-app_2_2.dtd"> <web-app> <servlet> <servlet-name>action</servlet-name> <servlet-class>org.apache.struts.action.ActionServlet</servlet-class> <init-param> <param-name>application</param-name> <param-value>ApplicationResources</param-value> </init-param> <load-on-startup>2</load-on-startup> </servlet> <servlet-mapping> <servlet-name>action</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping>
Definição de um servlet de nome action que corresponde ao servlet ActionServlet que é o servlet Controlador de Struts.
Mapeamento da extensão
.dopara o servlet action.
– Utilização
10.38
SEL6303 –
S
istemas de Informação Web
JSP/Servlets –
O Arquivo web.xml
web.xml – continuação... <taglib> <taglib-uri>/bean</taglib-uri> <taglib-location>/WEB-INF/struts-bean.tld</taglib-location> </taglib> <taglib> <taglib-uri>/html</taglib-uri> <taglib-location>/WEB-INF/struts-html.tld</taglib-location> </taglib> <taglib> <taglib-uri>/logic</taglib-uri> <taglib-location>/WEB-INF/struts-logic.tld</taglib-location> </taglib> <taglib> <taglib-uri>/tag</taglib-uri> <taglib-location>/WEB-INF/aula10.tld</taglib-location> </taglib> </web-app>Declaração das taglibs de Struts e da taglib que será criada. – Utilização
© JCFJ
10.39
SEL6303 –
S
istemas de Informação Web
JSP/Servlets –
O Controlador
URLs com o padrão “.do ” vão ser todas conectadas a um servlet ActionServletdo Struts de nome action(definição no arquivo web.xml).
Este servlet age como o Controladorda aplicação Ö É necessário fornecer um Adaptador
que irá funcionar com o controlador Ö Este adaptador é baseado na classe StrutsAction. Um objeto actioné um adaptador entre o conteúdo de uma requisição de entrada e a lógica
de negócio que será executada para fazer o tratamento da entrada Ö O controlador irá
selecionar um objeto Actionapropriado para cada requisição e chamar o método perform
deste objeto.
A conexão entre o Controlador (um objeto ActionServlet) e o adaptador Actioné declarada no arquivo WEB-INF\struts-config.xml.
Neste exemplo de utilização, o adaptador Actioné representado pela classe
Aula10_02.javae a o bean que implementa o modelo pela classe Aula10_03.java O bean Aula10_03.java deve ser declarado com o elemento <form-beans> no
arquivo struts-config.xml Ö Deve-se tambémregistrar o adaptador
Aula10_02.javano arquivo struts-config.xml.
– Utilização
10.40
SEL6303 –
S
istemas de Informação Web
JSP/Servlets –
O Arquivo struts-config.xml
– Utilização – O Controlador
struts-config.xml
<?xml version="1.0"?>
<!DOCTYPE struts-config PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 1.0//EN" "http://jakarta.apache.org/struts/dtds/struts-config_1_0.dtd"> <struts-config>
<form-beans>
<form-bean name="Aula10_03" type="beans.Aula10_03"/> </form-beans> <action-mappings> <action path="/Aula10_02" type="beans.Aula10_02" name="Aula10_03" scope="request" input="/aula10_01.jsp">
<forward name="OK" path="/aula10_05.jsp"/> </action>
</action-mappings> </struts-config>
Declaração do bean que implementa o modelo.
Quando um usuário enviar dados para
Aula10_02.do, o servlet de controle irá enviar um objeto bean do modelo totalmente inicializado (Aula10_03) para o adaptador Aula10_02 Ö desta maneira o código tem acesso aos dados do modelo.
Adaptador.
Se o código no adaptador decidir que os dados passados a eles estão corretos, ele diz ao controlador para encaminhar (forward) os resultados para a visão JSP que é representada pela página aula10_05.jsp. Caso erros ocorram, o processamento será encaminhado a página de entrada, aula10_01.jsp.
© JCFJ
10.41
SEL6303 –
S
istemas de Informação Web
JSP/Servlets –
O Adaptador – Aula10_02
Aula10_02.java package beans; import beans.Aula10_03; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.struts.action.*;public class Aula10_02 extends Action {
public ActionForward perform(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException {
ActionErrors actionerrors = new ActionErrors(); Aula10_03 orderForm = (Aula10_03) form; String email = orderForm.getEmail(); if(email.trim().equals("")) {
actionerrors.add(ActionErrors.GLOBAL_ERROR, new ActionError("error.noemail")); }
String type = orderForm.getType(); if(type.trim().equals("")) {
actionerrors.add("ActionErrors.GLOBAL_ERROR", new ActionError("error.notype")); }
Faz a importação do bean do modelo.
Cópia do bean Aula10_03 passada a classe.
Criação de um objeto ActionError do Struts para gerenciamento de erros. Criação de um bean e atribuição a ele dos valores do bean passado pelo controlador. Recuperação do valor da propriedade email do bean.
Se email for vazio, adiciona um ActionError de nome error.noemail (verificar no arquivo de propriedades – T28) a estrutura ActionErrors. – Utilização – O Controlador 10.42 SEL6303 – S
istemas de Informação Web
JSP/Servlets –
O Adaptador – Aula10_02
Aula10_02.java – continuação...
String[] items = orderForm.getItems(); if(items == null) {
actionerrors.add("ActionErrors.GLOBAL_ERROR", new ActionError("error.noitems")); }
if(actionerrors.size() != 0) { saveErrors(request, actionerrors);
return new ActionForward(mapping.getInput()); }
return mapping.findForward("OK"); }
}
Se a estrutura ActionErrors tiver algum elemento ele será salvo e o processamento será desviado para a página inicial declarada pelo elemento input no arquivo struts-config.xml (T38).
Se nenhum erro dor detectado o processamento será desviado para a página definida no arquivo struts-config.xml (T38) Ö diversos desvios podem ser implementados sendo que cada um tem um nome Öneste exemplo existe um só de nome OK Ö o método findForward irá localizar pelo nome, o encaminhamento correto a ser feito.
Se nenhum erro ocorrer, após ter recebido uma chamada da página aula10_01.jsp, o controlador irá encaminhar ao usuário a página de resultado aula10_05.jsp.
© JCFJ
10.43
SEL6303 –
S
istemas de Informação Web
JSP/Servlets –
Apresentação dos Erros
10.44
SEL6303 –
S
istemas de Informação Web
JSP/Servlets –
A Página de Resultados
Na página de resultados tem-se acesso aos dados do bean Aula10_03 Ö Estes dados podem ser escritos na página de resultados utilizando o tag <bean:write>.
Utilizando-se o tag <bean:message>se pode obter a chave que apresenta um título e depois com o bean <bean:write>se pode apresentar seu valor.
O tag <logic:iterate> pode ser utilizado para verificar escolhas múltiplas, como por exemplo a que pode ser feita para diferentes itens de um tipo de comida.
– Utilização – O Controlador
<bean:message key=“type” />
<bean:write name=“Aula10_03” property=“type” />
<bean:message key=“items” />
<logic:iterate id=“items1” name=“Aula10_03” property=“items” /> <%= items1 %>
<br />
© JCFJ
10.45
SEL6303 –
S
istemas de Informação Web
JSP/Servlets –
A Página de Resultados
aula10_05.jsp
<%@ taglib uri="/bean" prefix="bean" %> <%@ taglib uri="/logic" prefix="logic" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>Dados do Pedido</title> </head> <body> <h1>Dados do Pedido</h1> <bean:message key="type"/>
<bean:write name="Aula10_03" property="type"/> <br />
<br />
<bean:message key="items"/> <br />
<logic:iterate id="items1" name="Aula10_03" property="items"> <%= items1 %>
<br /> </logic:iterate> <br />
<bean:message key="email"/>
<bean:write name="Aula10_03" property="email"/> <br /> </body> </html> – Utilização – O Controlador 10.46 SEL6303 – S
istemas de Informação Web
JSP/Servlets –
O Modelo
No exemplo apresentado o modelo armazena e retorna os dados que o usuário fornece Ö o modelo
normalmente implementa a lógica de manipulação dos dados da aplicação Ö Normalmente é aqui que deve ser criada a conexão com um banco de dados e a manipulação dos dados.
Em Struts o componente do modelo deve baseado na classe ActionForm.
Aula10_03.java
package beans;
import org.apache.struts.action.ActionForm; public class Aula10_03 extends ActionForm {
private String email = ""; private String type = ""; private String[] items; public String getEmail() {
return email; }
public void setEmail(String email) {
this.email = email; }
public String getType() {
return type; }
Aula10_03.java – continuação...
public void setType(String type) {
this.type= type; }
public String[] getItems() { return items;
}
public void setItems(String[] items) { this.items = items;
} }
Como os dados não são armazenados em um banco de dados, esta classe apresenta somente os métodos getters e setters para as propriedades manipuladas nas páginas.
© JCFJ
10.47
SEL6303 –
S
istemas de Informação Web
JSP/Servlets –
Apresentação do Resultado
10.48
SEL6303 –
S
istemas de Informação Web
JSP/Servlets –
Web e Tecnologia Java: JSP/Servlets
© JCFJ
10.49
SEL6303 –
S
istemas de Informação Web
JSP/Servlets –
Vantagens
Adiciona todas as bibliotecas Struts necessárias no Classpath do projeto e cria os arquivos de configuração e o arquivo de propriedades padrão e oferece diversos módulos.
Easy Form: Cria o arquivo JSP com seu arquivo de propriedades e também o bean Form com os métodos setter e getters e adiciona a definição do bean no arquivo de configuração.
Easy Action: cria uma classe Action e adiciona a definição do mapeamento da ação no arquivo de configuração.
Easy Forward: cria redirecionamentos (forwards) locais e globais que definem onde o controle será redirecionado.
Easy Exception: manipula as exceções.
Easy Message Resources: cria arquivos de propriedades de recursos que são muito importantes para a internacionalização e localização da aplicação.
Easy Plug-in: cria plugins.
Easy Datasource: conecta uma aplicação a um data source. Easy Module: modulariza a aplicação.
10.50
SEL6303 –
S
istemas de Informação Web
JSP/Servlets –
Instalação e Configuração
A configuração básica realizada anteriormente é necessária:
– É necessário ter o Java SDK instalado (1.4.2 ou maior).
– É preciso ter o arquivo zip de Struts descompactado em algum lugar. – É necessário ter o MySQL instalado bem como uma cópia do Connect/J.
É necessário instalar o servidor Tomcat Ö fazer o download em
http://ftp.pucpr.br/apache/jakarta/tomcat-5/v5.0.19/bin/jakarta-tomcat-5.0.19.exe Ö este diretório será referenciado como TOMCAT_HOME depois executar o
instalador Ö instalar abaixo de Apache Groups para manter os produtos agrupados. Realizar o download do plugin Easy Struts em
http://osdn.dl.sourceforge.net/sourceforge/easystruts/org.easystruts.ecli pse_0.6.4.zipÖ descompactar o arquivo no diretório plugins da instalação do eclipse.
Instalar o plugin Sysdeo Tomcat Ö realizar o download em
http://www.sysdeo.com/eclipse/tomcatPluginV221.zipÖ descompactar o arquivo no
© JCFJ
10.51
SEL6303 –
S
istemas de Informação Web
JSP/Servlets –
Configuração do Plugin Sysdeo Tomcat
Com o Eclipse inicializado deve-se no menu Window/Preferences escolher a opção Tomcate realizar as seguintes operações para compilar uma página JSP:
– Definir a versão do Tomcat para a versão instalada.
– Definir Tomcat Home para o local da instalação do Tomcat.
– Definir “Perspective to switch when Tomcat is started” para Java. – Na opçãp Tomcat/JVM Settings/Classpath adicionar o arquivo tools.jar que
normalmente encontra-se em JAVA_HOME/lib.
No menu Window/Preferences escolher a opção Java/Classpath Variables adicionar uma nova variável TOMCAT_HOME tendo como valor o diretório de instalação do Tomcat.
No menu Window/Customize Perspective abrir a opção Other e verificar se a sub-opção Tomcat está selecionada Ö caso não esteja selecionar.
Verificar se com os botões do plugin é possível inicializar e para o servidor Tomcat.
10.52
SEL6303 –
S
istemas de Informação Web
JSP/Servlets –
Configuração do Plugin Easy Struts
No menu Window/Preferences escolher a opção Easy Struts e selecionar a orelha Struts 1.1. Adicionar todos os arquivos .jar localizados em STRUTS_HOME/jakarta-struts-1.1/lib. Adicionar todos os arquivos .tld localizados em STRUTS_HOME/jakarta-struts-1.1/lib.
© JCFJ
10.53
SEL6303 –
S
istemas de Informação Web
JSP/Servlets –
Criação de uma Aplicação
Selecionar a opção File/New/Project/Java/Tomcat Project e selecionar Next.
Definir o nome do projeto como sendo easyStruts e definir o diretório onde ele será armazenado e clicar em Next.
Verificar que a opção “Can update server.xmlfile” está selecionada e clicar em Finish.
10.54
SEL6303 –
S
istemas de Informação Web
JSP/Servlets –
Adição das Facilidades de Easy Struts
Selecionar a opção File/New/Other e selecionar na opção Java/Easy Struts a opção Add Easy Struts support e clicar em Next.
Realizar as configurações apresentadas para obter um “ambiente” Struts vazio.
© JCFJ
10.55
SEL6303 –
S
istemas de Informação Web
JSP/Servlets –
Uma Easy Action Associada a um Formulário
Na janela dedicada ao plugins Easy Struts clicar sobre easyStruts com o botão direito e selecionar Wizard.../Action and form.
Realize as configurações apresentadas para criar as propriedades (chaves) do formulário.
10.56
SEL6303 –
S
istemas de Informação Web
JSP/Servlets –
Uma Easy Action Associada a um Formulário
Na seqüência se deve definir os mapeamentos (T10.40) Ö após clicar em Next preencher a janela como apresentado. Após clicar em Finish o sistema vai gerar os arquivos com.asprise.struts.form.OwnerForm.java ecom.asprise.struts.form.OwnerAction.java no diretório easyStruts/WEB-INF/src e também o arquivo owner.jsp no diretório easyStruts/WEB-INF Ö deve-se completar estes arquivos para finalizar o formulário, adicionar validação das entradas do usuário e processamento da validação dos erros.
© JCFJ
10.57
SEL6303 –
S
istemas de Informação Web
JSP/Servlets –
Modificando a Classe ActionForm
Deve-se alterar todas as referências ao tipo de dados Integer para int Ö editar o arquivo clicando sobre ele e utilizando as mensagens de erros fazer as alterações.
Deve-se inserir o código do método validate() para verificar as entradas do usuário para as propriedades do formulário. OwmerForm.java package com.asprise.struts.form; import javax.servlet.http.HttpServletRequest; import org.apache.struts.action.ActionError; import org.apache.struts.action.ActionErrors; import org.apache.struts.action.ActionForm; import org.apache.struts.action.ActionMapping; public class OwnerForm extends ActionForm {
// --- Instance Variables private String greet = "Mr.";
private String address; private String email; private int tel = 0; private String name;
10.58
SEL6303 –
S
istemas de Informação Web
JSP/Servlets –
Modificando a Classe ActionForm
OwmerForm.java
// --- Methods public ActionErrors validate(
ActionMapping mapping, HttpServletRequest request) {
ActionErrors errors = new ActionErrors(); if (greet == null || greet.trim().equals("")) {
errors.add("greet", new ActionError("error.greet")); }
if (name == null || name.trim().equals("")) {
errors.add("name", new ActionError("error.name")); }
if (address == null || address.trim().equals("")) {
errors.add("address", new ActionError("error.address")); }
if (email == null || email.trim().equals("")) {
errors.add("email", new ActionError("error.noEmail")); }
else if (email.indexOf("@")==-1) {
errors.add("email", new ActionError("error.wrongEmail")); }
if (tel==0) {
errors.add("tel", new ActionError("error.tel")); }
return errors; }
Tratamento de erros com as mensagens armazenadas no arquivo de propriedades
© JCFJ
10.59
SEL6303 –
S
istemas de Informação Web
JSP/Servlets –
Modificando a Classe ActionForm
OwmerForm.java
public void reset(ActionMapping mapping, HttpServletRequest request) { greet = "Mr."; address = ""; email = ""; tel = 0; name = ""; }
public String getGreet() { return greet;
}
public void setGreet(String greet) { this.greet = greet;
}
public String getAddress() { return address;
}
public void setAddress(String address) { this.address = address;
}
public String getEmail() { return email;
}
Definição das propriedades e dos métodos getters e setters para as propriedades
10.60
SEL6303 –
S
istemas de Informação Web
JSP/Servlets –
Modificando a Classe ActionForm
OwmerForm.java
public void setEmail(String email) { this.email = email;
}
public int getTel() { return tel; }
public void setTel(int tel) { this.tel = tel;
}
public String getName() { return name;
}
public void setName(String name) { this.name = name;
} }
Métodos getters e setters para as propriedades
© JCFJ
10.61
SEL6303 –
S
istemas de Informação Web
JSP/Servlets –
O Arquivo ApplicationResources.properties
ApplicationResources.properties
# Resources for parameter
'com.asprise.struts.ApplicationResources' # Project P/easyStruts
errors.header=<h4>Validation Error(s)</h4><ul> errors.footer=</ul><hr>
error.greet=<li>Choose your greet error.name=<li>Enter your name error.address=<li>Enter your address error.tel=<li>Enter your contact number error.wrongEmail=<li>Correct your email error.noEmail=<li>Enter your email
10.62
SEL6303 –
S
istemas de Informação Web
JSP/Servlets –
Modificando a Classe Action
A classe OwnerAction simplesmente apresenta a mensagem “Thank you, Miss Nancy Chen” no redirecionamento local que é definido como sendo a página JSP success.jsp.
Deve-se modificar o método execute() de OwnerAcion (toda classe action deve implementar o método execute()). OwmerAction.java package com.asprise.struts.action; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.struts.action.Action; import org.apache.struts.action.ActionForm; import org.apache.struts.action.ActionForward; import org.apache.struts.action.ActionMapping; import com.asprise.struts.form.OwnerForm; public class OwnerAction extends Action {
// --- Instance Variables
Importação do form bean para manipular suas propriedades
© JCFJ
10.63
SEL6303 –
S
istemas de Informação Web
JSP/Servlets –
Modificando a Classe Action
OwmerAction.java
// --- Methods public ActionForward execute(
ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) throws Exception {
OwnerForm ownerForm = (OwnerForm) form; String greet = ownerForm.getGreet();
String name = ownerForm.getName(); request.setAttribute("name", name); request.setAttribute("greet", greet);
// Forward control to the specified success target return (mapping.findForward("success"));
} }
Recuperação das propriedades do bean e armazenamento destas propriedades na requisição
Encaminhamento do processamento a ação identificada por success.
10.64
SEL6303 –
S
istemas de Informação Web
JSP/Servlets –
Modificando a Página owner.jsp
O formulário deve ser completado adicionando os tags <html> que irão fazer a apresentação das informações e o tratamento dos erros.
owner.jsp
<%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean"%> <%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html"%> <html>
<head> <meta
name = "Generator"
content = "Easy Struts Xslt generator for Eclipse (http://easystruts.sf.net)."> <title>Struts Form for ownerForm</title>
</head> <body>
<html:form action="/owner">
greet : <html:select property="greet">
<html:option value=""></html:option> <html:option value="Mr.">Mr.</html:option> <html:option value="Miss">Miss</html:option> <html:option value="Mrs.">Mrs.</html:option> </html:select><html:errors property="greet"/>
name : <html:text property="name"/><html:errors property="name"/></br> address : <html:text property="address"/><html:errors property="address"/></br> email : <html:text property="email"/><html:errors property="email"/></br> tel : <html:text property="tel"/><html:errors property="tel"/></br>
<html:submit/><html:cancel/> </html:form>
<html:errors /> <body>
© JCFJ
10.65
SEL6303 –
S
istemas de Informação Web
JSP/Servlets –
Codificando a Página JSP success.jsp
Para finalizar se deve codificar a página success.jsp que irá apresentar a mensagem “Thank you, Miss Nancy Chen” quando a página owner.jsp for preenchida sem erros.
sucess.jsp
<%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean"%> <%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %> <logic:present name="name" scope="request">
Thank you,
<logic:present name="greet" scope="request"> <bean:write name="greet" scope="request"/> </logic:present>
<bean:write name="name" scope="request"/> </logic:present>
Verifica se existe um bean de nome name no escopo request.
Caso exista apresenta a mensagem recuperando as informações do bean
10.66
SEL6303 –
S
istemas de Informação Web
JSP/Servlets –
Examinando o Arquivo struts-config.xml
Um duplo clique sobre o arquivo struts-config.xml de configuração da aplicação faz com que uma “interface gráfica” seja apresentada Ö nesta interface se pode configurar diversos aspectos da aplicação.