Título do Curso
Transcrição
Título do Curso
Desenvolvimento web com Java e tecnologias relacionadas Struts :: Webwork :: JSF :: AJAX :: Spring :: JasperReport/JFreechart Eclipse :: NetBeans & Tecnologias relacionadas Rafael Rocha Cavalcanti SCJP 1.5 :: SCWCD 1.4 :: LPI(away) Colaborador do GUJ e Debian-PE Arquiteto/Engenheiro :: Stefanini Recife-PE [email protected] :: http://faelcavalcanti.wordpress.com Missão :: Objetivo Apresentar, motivar e exercitar o desenvolvimento para plataforma Java EE para Web, utilizando Servlet’s e JSP, bem como adequação do framework Struts entre tecnologias relacionadas como AJAX além de uma breve introdução sobre conceitos da Web2.0 2 Metodologias utilizadas neste curso • • • • Exposições e discussões teóricas Exercícios práticos de projeto Modelagem voltado à realidade em projetos Fórum :: Lista de Discussão Meio de unificar o grupo interessado sobre o assunto • Manter perspectivas de inovações e soluções a todos • Retirar dúvidas quando não presente • 3 O que este curso não cobre ou não é ? • Não cobre • Desenvolvimento para outras plataformas que não seja Java • Desenvolvimento para outras plataformas do Java como • • • Java SE, Java ME e até Java EE Avançado Técnicas de persistência em banco de dados Não visa • Aprendizado de lógica de programação • Desenvolver programas para terceiros 4 Cronograma do Curso Curso Parte 1 Parte 2 Parte 3 Parte 4 Introdução Web Applications Framework Struts AJAX e Web 2.0 Camadas de Rede e Protocolos Servlet’s Struts 1.1 Evolução Arquitetura JSP Struts 2.0 Java EE Tag Libraries JSTL 5 Livros sugeridos 6 Antes de iniciarmos ... • • • • • • • Nome Empresa que trabalha Onde estuda ou estudou Experiência da área de Engenharia de Software • Desenvolvimento de software com Java na plataforma Web • Desenvolvimento em outras plataformas Experiência em outras áreas Razões para estar fazendo este treinamento Quais são as suas expectativas deste curso 7 Introdução Camadas da rede, Protocolos e Linguagens Uma perspectiva de sua evolução 8 Intro I :: Uma abordagem sobre a evolução 9 Intro I :: Camada de pilhas de protocolo depois antes 10 Intro I :: Comunicação entre camadas 11 Intro I :: Modelo OSI (Open Systems Interconnect) 12 Intro I :: Modelo TCP/IP (Visão Interna) 13 Intro I :: Comparativo entre os modelos TCP/IP x OSI • Modelo TCP/IP • • • • • Pilha de protocolos da internet na camada de apresentação Utiliza conceito de [port] para gerenciar processos num [host] Mais útil para entendimento das redes atuais Não possui as camadas de sessão e apresentação Modelo OSI • Camada física sujeita a erros • • • Lida com aspectos mecânicos, sinais elétricos e outros meios físicos Não é rico suficientemente nas camadas mais baixas Transferência de dados fim entre processos e hosts 14 Intro I :: Topologia TCP/IP (Arpanet) 15 Intro I :: Plataformas disponíveis “W3C” 16 Intro I :: Topologia (Abordagem entre Camadas) • Proporcionalidades • • • Disponibilidade de várias linguagens interpretadas e compiladas Novas tendências proporcionada de acordo com a necessidade Novos modelos de arquiteturas simbolizam novos adeptos (paadigmas) 17 Intro I :: HTTP (HyperText Transfer Protocol) • • Surgiu com a necessidade de informações em 1990; • Utiliza a porta 80 como padrão (implícita na url) • Comunica-se com o servidor através de HTML (Hypertext Markup Language) Primeira versão chamada HTTP/0.9 • • A versão HTTP/1.0 foi desenvolvida entre 1992 e 1996 • Suprir necessidade de transferir não apenas texto Passou a transferir novos tipos MIME (Multipurpose Internet Mail Extension) • Foram implementados novos métodos como [POST] e [HEAD] • • Protocolo através de texto ASCII e possuía único método [GET] Versão atual HTTP/1.1 descrito em 1999 na RFC2606 • • • Uso de conexões persistentes e servidores com suporte a proxy; Foram adicionados novos métodos Também adotado como protocolo genérico para os outros [FTP] 18 Intro I :: Linguagem HTML (HyperText Markup Language) • Especificação formal desenvolvida por Tim Berners-Lee • • Tecnologia fruto do casamento dos padrões Hytime e SGML Desde de 1996, as especificações vêm sendo mantidas pela W3C Consequentemente tornou-se também uma norma internacional • Última especificação lançada com a recomendação HTML 4.01 • • Linguagem de marcação de texto • Objetivo de manter apresentação dos dados • • • Renderização do conteúdo ocorre na interpretação pelo browser Um arquivo HTML pode ter extensão .htm ou html • • Não possui informação sobre os dados apresentados(diferente XML) Este arquivo é composto por diversas tags (formatação dos dados) Diversas extensões comumente utilizadas :: DHTML e XHTML 19 Intro I :: HTML (Exemplo de código) 20 Evolução do modelo Arquiteturas Uma breve abordagem 21 Intro II :: Evolução quanto à arquitetura • Atuações de aplicações enterprise • • • • • Benefícios quanto a evolução das aplicações enterprises • • • Presentation Logic :: Lógica de apresentação Business Logic :: Lógica de negócios Data access logic :: Lógica de acesso aos dados System services :: Serviços de sistemas Definição de tipo de flexibilidade em fazer mudanças Deslocamento da localização dos serviços de sistemas Evolução por camadas • • • Single tier Two tier Three tier • • • RPC based Remote object based Three tier (HTML browser e Web server) 22 Intro II :: Arquitetura Single Tier (Orientada via Mainframe) • • • • Terminais burros são conectados diretamente para o mainframe Modelo centralizado (oposto ao modelo distribuído) Todas as camadas presentes dentro de uma aplicação no mainframe Prós : • • • Gerenciamento no cliente não é requerido Consistência dos dados é facilmente arquivada Contra : • • Funcionalidade centralizada (todas as camadas em uma só) Dificuldades para atualizações e manutenções, inclusive pouco reuso 23 Intro II :: Arquitetura Two Tier (Modelo Cliente-Servidor) Clientes sobrecarregados conversando com servidor de dados • Execução da lógica de negócios e apresentação processada no cliente • Prós : • • • Independência fabricante de banco de dados Contras : Dificuldade de atualizações e manutenções • Alto acoplamento no modelo de dados • • • • Alto tráfico de rede • • Atualizações tornam-se custosas Cada cliente é comprometido Transferência feita por poucos dados est u q re se n SQL o re s p L SQ T CP /I P TC P/ IP Dependência de configuração de banco • Instalação de cliente de base de dados 24 Intro II :: Arquitetura Three Tier (Baseado no modelo MVC) Cliente magro :: Negócios e dados separados da apresentação • Lógica de negócios e acesso dos dados ficam residem no servidor • Prós : • • • Mais flexibilidade de mudanças na lógica de negócios Contras : • • Complexidade é introduzida na camada de midle-tier server Cliente e midle-tier possuem alto acoplamento Implementação depende da infra-estrutura relacionada • Pouca eficiência no reuso de código • RPC request SQL request RPC response SQL response database 25 Intro II :: Arquitetura Three Tier (Modelo de Objetos) • Lógica de negócios e dados são capturados como objetos Agora são descritos dentro de uma abstração (contrato de interface) • Modelo de objetos utilizados em linguagens :: CORBA e Java/RMI • Prós : • Acoplamento um pouco mais baixo do que o modelo RPC • Código pode mais reusável • Contras : • Complexidade na camada de midle-tier server ainda necessita ser endereçada • Object request SQL request Object response SQL response database 26 Intro II :: Arquitetura Three Tier (Modelo Web-server) • Facilitação pelos browsers Lógica de apresentação e conversação com servidor via HTTP • Lógica negócios e dados são manipulados como conteúdo dinâmico • • • Entre outras tecnologias :: CGI, Servlet, ASP, PHP, Python, Perl, Ruby, ... Prós : Sem gerenciamento no cliente, necessita apenas do browser • Suporte para vários tipos de dispositivos como celulares, palms, etc. • • Contras : • Alta complexidade na camada de midle-tier server HTML request SQL request HTML response SQL response database 27 Intro II :: Comparativo (Camadas x Modelo de arquitetura) • Single-tier • • Única camada de desenvolvimento. Código difícil de ser mantido Multi-tier Separação em diversas camadas. • Manutenções mais flexíveis sem afetar as outras camadas • • Monolítico • • 1(um) binário por arquivo, compilado(código-objeto), link-editado, redistribuído o tempo todo a cada modificação de sistema Baseado em objetos Partes plugáveis, reuso, melhor design(coeso), fáceis atualizações, etc. • Possibilita que fase de projeto não dependa da fase de desenvolvimento • 28 Intro II :: Observações e questionamentos • Complexidade na camada intermediária ainda persiste? • Duplicidade de serviços de sistemas ainda necessitam ser providas para uma maior extensibilidade de aplicações (enterprise applications) Controle de concorrência e transações • Load-balancing e segurança • Gerenciamento de recursos e Pool de Conexões • • Como resolver este problema • • Comumente compartilha-se o container que manipula os serviços de sistemas que estão em uma camada superior Código proprietário versus código aberto (independência de fabricante) 29 Intro II :: Abordagem de soluções (Proprietárias x Fechadas) • Soluções proprietárias • Modelo de “containers e componentes” • • • Lógica de negócios entrelaçada com classes de componentes. O contrato entre componentes e containers são definidos dentro de uma de arquitetura fechada. Problem of proprietary solution: Vendor lock-in Exemplo: Tuxedo, .NET • Não se pode reimplementar ou redefinir. Depende do fornecedor. • Atualmente extensões open-source, estão se beneficiando dos frameworks existentes de diversas plataformas como java. • • Soluções abertas • • Modelo de “containers e componentes” no qual o container provê serviço de sistemas dentro de uma arquitetura aberta mantida por grandes parceiros mundiais e individuais. (IBM, Red Hat, ...) :: JCP J2EE/JEE fundamentalmente provê portabilidade de código pela plataforma Java e consequentemente seus componentes(frameworks) 30 Porquê Java EE? Uma introdução básica na arquitetura Java EE 31 Java EE :: Ganho de plataforma pelos desenvolvedores • Pode ser usado em qualquer implementação de modelo J2EE/JEE • • • Vasta quantidade de recursos disponíveis por diversas comunidades • • Produção de qualidade mantida por implementações genéricas na qual é livre e disponível a re-implementação e redistribuição (copyleft) Também possui outros produtos para fins comerciais visando manter um controle alternativo escalável e tolerante a falhas. Inúmeras referências, monografias, livros, padrões, frameworks; Podem implementar em junção com componentes de terceiros • Visando manter compatibilidade com tecnologias de outros fabricantes ou hardwares específicos 32 Java EE :: Ganho de plataforma pelos fornecedores Fornecedores trabalham em conjunto colaborando com a evolução da especificação da plataforma Java • Competem dentro das implementações específicas • • • Em áreas de escalabilidade, performance, avaliabilidade, gerenciamento, e desenv olvimento de ferramentas customizáveis Liberdade para inovar enquanto mantém a portabilidade da aplicação, ao invés de focar em melhores ou novas re-implementações já existentes e de grande aceitação e qualidade 33 Java EE :: Ganho de plataforma pelos usuários Aplicação portável (portabilidade garantida pela plataforma Java) • Muitas implementações escolhem as possibilidades disponíveis baseadas em vários requerimentos • • • • Preço (free para grandes softwares/sistemas) Escalabilidade, desde um único CPU para processados com clusters(EJB) Ferramentas de performace Inúmeros desenvolvedores no mundo todo • A maioria das distribuições Linux, hoje, já o acompanham (GPLv2) • 34 Java EE :: Arquitetura (Visão Geral) 35 Java EE :: Arquitetura (Uma outra visão) 36 Java EE :: API disponível e tecnologias relacionadas • J2EE 1.4 APIs and Technologies • • • • • • • • • • • J2SE 1.4 (improved) JAX-RPC (new) Web Service for J2EE J2EE Management e Deployment JMX 1.1 JMS 1.1 JTA 1.0 Servlet 2.4 JSP 2.0 EJB 2.1 JavaMail 1.3 • Java EE 5 • • • • • • • JAX-WS 2.0 & JSR 181 Java Persistence (JPA) EJB 3.0 JAXB 2.0 JavaSever Faces 1.2 new JSP 2.1 Others 37 Java EE :: Novas API’s incorporadas no Java EE 5 38 Web Applications Colocar subtítulo 39 WebApplications :: Introdução Evolução do modelo de arquitetura cliente-servidor • Diferentemente de sites web, gerenciam conteúdo dinâmico • • • • Conteúdo no qual será processado por um servidor de aplicação web Servidor retorna conteúdo HTML que será renderizado pelo browser Os elementos de uma aplicação web ficam residentes no servidor Popularizados como clientes magros (Facilitam distribuição) • Possuem muitas variações de estrutura de acordo com a plataforma • • Geralmente sua estrutura é implementado em 3(três) camadas Podem ser escritos em qualquer linguagem (tratamento depende do servidor) • Exemplo de linguagens suportadas • Java, Python, Ruby, PHP, Perl, ASP, CGI, ColdFusion, .... • 40 WebApplications :: Objetos Request e Response • Request • Informações que são enviadas para o servidor pelo cliente Por onde o usuário envia os dados a partir de um formulário HTML • No qual os cabeçalhos da requisição são enviados via HTTP • • Reponse • Informações que são enviados para o cliente a partir do servidor Conteúdos :: Text(html/plain) ou binários(imagem) :: [Content Type] • HTTP headers, cookies, etc • 41 WebApplications :: Ciclo de vida • • • • • • 1 :: Cliente solicita requisição via web browser (HTTP) 2 :: Container web recebe requisição e envia para um controlador (Servlet) 3 :: (Opcional) Servlet encaminha requisição via JNDI para um outro servidor (EJB) 4 :: Servlet delega requisição para a camada de negócio (Model) 5 :: Servlet obtem informações enviadas e prepara para retornar os dados para cliente 6 :: Web browser obtem informações processadas via HTTP e consequentemente são interpretadas via JSP/JSF e renderizadas na tela para o cliente via DHTML 42 WebApplications :: Estrutura de diretórios em Java 43 Entendendo o modelo MVC (Visão caixa preta) • • • • • Um dos primeiros padrões identificados. Surgiu com a comunidade de Smaltalk. Objetivo principal era desacoplar implementações entre camadas (Código mais coeso) Model :: Comumente representado por “Beans” e serviços da aplicação (Negócio) View :: Representado por um JSP/JSF. Também pode ser escrito por um Servlet. Controller :: Geralmente implementado a partir de um Servlet, Actions(Struts), etc. 44 Outra visão do modelo MVC (caixa branca) 45 Outra visão do Modelo MVC (detalhada) 46 Servlet’s Visão Geral, API e Ciclo de Vida 47 Servlet’s :: Introdução Objetos Java no qual estendem a funcionalidade de um servidor web • São independentes de plataforma e servidor de aplicações web • • Melhor alternativa do que CGI(Common Gateway Interface), ISAPI, NSAPI • • • Para cada nova requisição um novo processo é criado (Até se for no mesmo cliente) Gerenciamento de sessão e são independentes de plataforma (Mais eficiente) Diferenças entre o modelo baseado Servlet’s e CGI 48 Servlet’s :: Onde estão localizados na arquitetura JEE ? • Servlet’s estão inseridos dentro do servidor de aplicações web • • Efetua o gerenciamento de requisições do usuário Podem ser escalonáveis com outras arquiteturas e com outros servidores 49 Servlet’s :: Principais características • São programas em Java • • Performace • • • • Multiplataforma e tem praticamente toda a plataforma Java disponível Máquina virtual está no lado do servidor e não no cliente (browser) São carregados na memória apenas na primeira vez (servidor:container) Podem executar pedidos concorrentemente Sumário funcional geral • • • • Recebem requisições do cliente (via HTML por requisição HTTP request) Extraem informações do ambiente (contexto) para o container Efetua geração de conteúdo ou processa/delega lógica de negócios Envia resposta para o cliente (via HTML por requisição HTTP response) ou envia requisição para outro Servlet ou JSP para que possa renderizar o conteúdo processado 50 Servlet’s :: Hierarquia estrutural de classes 51 Ciclo de vida de um Servlet Gerenciamento definido e controlado pelo container • Principais métodos • • init() • • service() • • • Chamado uma única vez quando o servlet é carregado Chamado para cada requisição (Recebe objetos de pedido e resposta ) Pode ser usado simultanealmente por vários Threads. destroy() • Chamado uma única vez quando o servlet é carregado 52 Servlet’s :: Como implementar um Servlet (primeiros passos) Estender a classe [ java.servlet.http.HttpServlet ] • Redefinir os métodos doGet e/ou doPost • Estes são os métodos básicos necessários para tratar requisições • Existem outros métodos extensíveis suportados pela especificação W3C • • • doOptions, doDelete, doTrace, doHead, Dentro dos métodos doGet/doPost Ler os parâmetros vindos do formulários HTML ou da URL • Processar os parâmetros, fazer validações, instanciar classes auxiliares e básicas, assim como chamar métodos de negócio • Gerar resposta final para o cliente • 53 Servlet’s :: Tratamento de exceções • Exceções relevantes para tratamento de exceções em Servlets • javax.servlet.ServletException • • Falha geral no Servlet javax.servlet.UnavaiableException Permanente :: Esperando ação do administrador do servidor de aplicação • Temporário :: Problemas como disco cheio, falhas no servidor • • java.io.IOException • • Exceção genérica que caracteriza problemas no fluxo dos dados via I/O Geralmente esta funcionalidade pode ser tratada de diversas formas • Declarar exceção e diretiva <error-page> no DD (web.xml) • • Também pode ser declarado uma diretiva dentro do próprio JSP Utilizar outros frameworks que estendem esta funcionalidade 54 Servlet’s :: Escopo de Objetos (Estado entre requisições) • Necessidade • • Problema • • Possibilita guardar algum tipo de informação durante requisições O protocolo HTTP não mantém estado (stateless) Alternativas Campos hidden(ocultos) entre formulários em HTML • Utilização de cookies no cliente • Reescrita de URL’s • Utilização de sessões (javax.servlet.http.HttpSession) • 55 Servlet’s :: Escopo de Objetos (Acessibilidade) • Application (Web Context) :: javax.servlet.ServletContext • • Obtém informações de ambiente Compartilhado por toda a aplicação • • Só existe uma instância na aplicação Também utilizado para Registrar logs necessários • Redirecionar para uma página • • Session :: javax.servlet.HttpSession • Acessado durante várias requisições • • • Utilizar somente o necessário! Request :: javax.servlet.HttpRequest • • • Exemplo do carrinho de compras Acessado durante uma única requisição Extensivamente utilizado Page :: javax.servlet.jsp.PageContext • • Acessível a partir de uma página JSP Visível somente dentro de um arquivo JSP. 56 Servlet’s :: Cookies • Necessidade • • Manter informações no cliente durante múltipla sessões no browser Problema • Vulnerabilidade no lado do cliente • • • Alternativas • Utilizar a técnica do URL Rewriting • • • Um hacker poderia obter informações pessoais do usuário Geralmente configura-se o browser para desabilitar o uso de cookies URL +”;jsessionid=1234567” Métodos :: encodeURL() ou encodeRedirectURL(“/TestPage.do”) Informações • Pode ser definido um timeout no cliente caso esteja habilitado • Pode ser setado a partir do método setMaxAge() 57 Servlet’s :: Listeners • Necessidade • • Problema • • Obter informações da aplicação durante determinados eventos Baixa performance, problemas internos, expiração de sessão, outros. Alternativas • • Depende de que tipo de informações é necessário resguardar para identificação Extensibilidade do padrão Observer 58 Servlet’s :: Listeners (Diferença entre diversos cenários) Atributos de listeners ServletRequestAttributeListener ServletContextAttributeListener HttpSessionAttributeListener Outros ciclo de vida de listeners (não possui “Attribute” na classe) ServletRequestListener ServletContextListener HttpSessionListener HttpSessionBindingListener HttpSessionActivationListener Métodos de atributos de listeners (exceto binding listeners) attributeAdded() attributeRemoved() attributeReplaced() Ciclo de eventos (Sessão) (exceto eventos de atributos) Quando o objeto Session é criada e quando é destruída sessionCreated() sessionDestroyed() Ciclo de eventos (Request) (exceto eventos de atributos) Quando o Request é inicializado ou destruído requestInitialized() RequestDestroyed() Ciclo de eventos (Contexto) (exceto eventos de atributos) Quando o Contexto da aplicação é inicializado ou destruído contextInitialized() contextDestroyed() 59 Servlet’s :: Características e configuração Provê notificações de mudanças de estado dentro da aplicação • Cada aplicação web possui suas particularidades • • • Desde o contexto da aplicação, bem como de um objeto na sessão Mudanças nestes estados podem ser notificados através do uso de listeners Podem ser utilizados para gerenciamento • Conexões de banco de dados quando a aplicação é publicada ou cai • Contadores específicos para alguma funcionalidade • Monitorar conexões HTTP e atributos de sessão ou outro escopo • Devem estar configurados dentro do DD(web.xml) • <listener> <listener> <listener-class>myApp.myContextListenerClass</listener-class> <listener-class>myApp.myContextListenerClass</listener-class> </listener> </listener> 60 Servlet’s :: Listeners (Implementando) • Exemplo de implementação de um Listener • Neste caso quando o contexto da aplicação é inicializado ele aciona o evento • • O método contextInitialized é chamado() Quando o contexto é destruído(undeployed), contextDestroyed() é executado import import javax.servlet.*; javax.servlet.*; import import javax.servlet.http.*; javax.servlet.http.*; public public class class AppListener AppListener extends extends HttpServlet HttpServlet implements implements ServletContextListener ServletContextListener {{ private private ServletContext ServletContext context context == null; null; public public void void contextInitialized(ServletContextEvent contextInitialized(ServletContextEvent event) event) {{ context context == event.getServletContext(); event.getServletContext(); context.setAttribute(“counter", context.setAttribute(“counter", “parametro.localizacao.ambiente” “parametro.localizacao.ambiente” ); ); }} public public void void contextDestroyed(ServletContextEvent contextDestroyed(ServletContextEvent event) event) {{ context context == event.getServletContext(); event.getServletContext(); context.log context.log ((String)context.getAttribute(“counter")); ((String)context.getAttribute(“counter")); context.removeAttribute("counter"); context.removeAttribute("counter"); }} }} 61 Java Server Pages (JSP) Visão Geral, Ciclo de vida, Expressões 62 JSP :: Introdução • Documentos baseados em textos capazes de retornar conteúdos ambos estáticos e dinâmicos para o cliente através de um browser • Conteúdo estático • • Conteúdo dinâmico • • HTML, XML e textos entre as tags do formulário Código java, disponibilização de dados através de TAG’s customizáveis Diferencas entre Servlets e JSP Servlets incluem código de apresentação (HTML) no código Java • JSP inclui um conjunto entrelaçado de código DHTML e/ou java • • • Constitui de uma página DHTML com conteúdo dinâmico(java ou TAG’s) Vantagens Introduz novos comandos que facilitam o desenvolvimento de páginas • Facilita manutenção para o designer, o sistema é composto de páginas • • Desvantagens • Falta uniformidade na programação. Pode afetar legibilidade e coesão. 63 JSP :: JSP2.0 (O que cobre a nova especificação?) • O que cobre a nova especificação JSP 2.0 • • • • • EL (Expression Language) Simple TAG extension TAG files Provê suporte para arquivos XML Outros recursos a partir da JSR 152 (JSP 2.0) 64 JSP :: Exemplo (Implementado dentro do NetBeans) 65 JSP :: Ciclo de Vida • • 1 :: Ao receber uma requisição, o container lê o DD(web.xml) para esta aplicação 2 :: O container tenta traduzir o arquivo JSP associado a esta requisição Como o JSP é lido em tempo de execução ele necessita do JAVA_HOME setado • Consequentemente será criado um arquivo “.java”, tendo um Servlet implementado • Caso exista um erro no JSP a exceção javax.servlet.jsp.JspException será lançada • • • • 3 :: O container tenta compilar o novo servlet gerando um arquivo “.class” 4 :: O container carrega o arquivo “.class” pela máquina virtual java 5 :: O container instância o servlet e delega a execução do método jspInit() • JSP é processado uma única vez, e este acabará sendo 1º passo na próxima requisição • • • Considerando isto para um mesmo arquivo JSP Caso o arquivo seja modificado, uma nova requisição efetuará todos os passos anteriores 6 :: O container cria uma novaThread para manipular a requisição do cliente Após a execução do método jspInit(), é então executado o método _jspService() • Eventualmente o servlet envia uma resposta(response) de volta para o cliente • • Observações O desenvolvedor não precisa conhecer o servlet gerado • Qualquer alteração necessária, será feita dentro do próprio JSP e não no Servlet gerado • 66 JSP :: Ciclo de Vida (Visão Geral) 67 JSP :: Ciclo de Vida (Fluxo de requisições) • • Para uma nova requisição é verificado se existe uma instância no container Caso não tenha sido carregado o container associa uma nova thread ao servlet 68 JSP :: Objetos implícitos • • • • • Páginas JSP possuem alguns objetos implícitos, estando sempre disponíveis, sem necessidade de declaração, como usado na diretiva [page:import] São criados e gerenciados pelo container da aplicação Correspondem aos mesmo objetos implícitos dos Servlets Alguns objetos sob determinadas condições :: (session e exception) Relação de objetos implícitos • request :: javax.servlet.http.HttpRequest • response :: javax.servlet.http.HttpResponse • out :: javax.servlet.http.JspWriter extends java.io.Writer • session :: javax.servlet.http.HttpSession • exception :: java.lang.Throwable • application :: javax.servlet.ServletContext • pageContext :: javax.servlet.jsp.PageContext • config :: javax.servlet.ServletConfig 69 JSP :: Elementos existentes (Parte 1) • Directive • • Fornecem Instruções ao container sobre como a página deverá funcionar e quais recursos ela necessita para que seja completamente carregada Declaration • Utilizado para definições de novos métodos e variáveis que consequentemente são inseridos dentro do corpo da classe do servlet gerado na compilação do JSP • • • Serão elementos da própria classe. Ficarão fora do corpo do método _jspService(). Usualmente são utilizados em conjunto com Expressions e/ou Scriptlets Scriptlet • Utilizados para visualizar arbitrariamente pequenas informações • Geralmente a inserção deste trecho de código ficará residido dentro do método _jspService() após compilado o arquivo JSP. 70 JSP :: Elementos existentes (Parte 2) • Expression • • São pequenas expressões de código Java que consequentemente serão atribuídas e repassadas a partir de uma String dentro do corpo da página de um JSP EL Expression • Recurso importante introduzido a partir da JSTL (veremos mais adiante) • • • Propriedades poderão ser acessadas desde que esteja dentro do padrão JavaBean JSP Standard Action • • • • Forma simples de acessar objetos declarados em qualquer escopo da aplicação TAG’s customizadas a fim de facilitar o desenvolvimento de aplicações web Permitem a inserção de menos código Java dentro de um JSP São executadas em tempo de requisição Observações • Qualquer objeto implícito pode ser acessado por qualquer elemente descrito • • Veremos objetos implícitos mais adiante O projetista pode desabilitar o uso de scripting no DD(web.xml) 71 JSP :: Diretivas Instruções genéricas e independente de requisições (Meta-construções) • Comumente empregados na fase de tradução e compilação • Sintaxe • • • <%@ directive {opcao=valor} %> Existem três tipo de diretivas • Page :: <%@ page {opcao=valor} %> Controla a estrutura do Servlet através da importação de classes • Estabelece informações quanto ao tipo de conteúdo que será utilizado dentro do JSP • • Include :: <%@ include {opcao=valor} %> Instrui o container a inserir o conteúdo do recurso identificado pela diretiva • O recurso é incluído na página JSP antes da transformação/renderização total • Geralmente utilizado por menus e barras de informações específicas • • Taglib :: <%@ taglib {opcao=valor} %> Indica ao JSP qual identificador poderá ser utilizado mediante alguma TAG • Geralmente utilizado como “ALIAS” de uma TAG em específico que foi construída • 72 JSP :: Diretiva :: Page (Parte 1) É recomendável declarar no ínicio dos arquivos JSP • Podem ser declarado várias vezes, mas cada opção só aparecerá uma vez • • • Exceto a opção import que poderá aparecer várias vezes Opções disponíveis para a diretiva page • autoflush :: <%@ page autoflush=“true” %> • • buffer :: <%@ page buffer=“32kb” %> • • Identifica cabeçalho de resposta, indicando o tipo MIME enviado isErrorPage :: <%@ page isErrorPage=“false” %> • • Define o tamanho de buffer utilizado no JspWriter para o cliente em Kb contentType :: <%@ page contentType=“text/html” %> • • Controla se o buffer de saída será flushed quando estiver cheio Define se a página corrente pode atuar como página de erro errorPage :: <%@ page errorPage=“url_pagina_erro” %> :: URL relativo • Define qual página será invocada caso alguma exceção ocorra 73 JSP :: Diretiva :: Page (Parte 2) • Continuando resumo de opções disponíveis para a diretiva page • extends :: <%@ page extends=“packageA.packageB.Class” %> • • Info :: <%@ page info=“Mensagem qualquer” %> • • Utilizado para especificar a linguagem de programação base no JSP import :: <%@ page import=“java.util.Locale” %> • • Define se o servlet irá implementar a interface SingleThreadModel language :: <%@ page language=“smaltalk” %> • • Define se a página utilizará algum recurso de sessão HTTP ou não isThreadSafe :: <%@ page isThreadSafe=“true” %> • • Define uma string que será recuperada do servlet através do método session :: <%@ page session=“true” %> • • Indica a superclasse do servlet que será gerada a partir da página JSP Também utilizado em mesma conformidade para declarar imports Observações • Os exemplos de declarações das diretivas pages encontram-se em sua forma padrão ou comumente utilizados em sua normalidade funcional 74 JSP :: Diretiva :: Include • O conteúdo é inserido antes da renderização da página. Exemplo de uso :: • ------ <html> <head> <title>Curso Java Web Rafa</title> </head> <body> <form action=“loginPage.do” method=“GET” id=“form” > <%@ include file=“menu.html” %> </form> </body> </head> </html> • ------ <html> <head> <body> Hello World!!! </body> </head> </html> • ------ 75 JSP :: Diretiva :: Taglib Define a TAG disponibilizada para o JSP corrente que irá interpretar • Segue abaixo um pequeno exemplo de uso :: • -----• <%@ taglib prefix=“myCustomTAGs” uri=“rafa” %> <html> <head> <title>Exemplo de uso de custom tags</title> </head> <body> <form action=“loginPage.do” method=“GET” id=“form” > <rafa:tabelaDinamica /> </form> </body> </head> </html> • • ------ Posteriormente será abordado exemplos de uso de TAG’s customizáveis 76 JSP :: Declarações Dentro de uma declaração também pode ser sobrescrito(override) métodos como jspInit() e jspDestroy(), modificando o estado de execução do JSP • Código análogo ao action :: <jsp:declaration> METODO </jsp:declaration> • -----• <html> <body> <h1>Using jspInit and jspDestroy</h1> <%! int number; public void jspInit() { number = 5; } public void jspDestroy() { number = 0; } %> <% out.println("The number is " + number + "<BR>"); %> </body> </html> • ------ 77 JSP :: Scriplets • Podem realizar operações que os [ Expressions ] não são capazes como: • • • • • Nehuma destes itens acima é considerado uma boa prática • • Setar informações para o header do formulário, assim como código do status Escrever um log para o servidor Atualizar uma base de dados Executar códigos mais sofisticados como laços condicionais Ao invés disto é recomendável o uso de JSTL, Actions e TAG’s customizáveis -----<html> <body> <h1>Using Scriplets</h1> <body> <% int number; out.println("The number is " + number + "<br>"); %> </body> </html> • -----78 JSP :: Expression • Geralmente são utilizados para visualizar informações breves como • Data atual <%= new java.util.Date() %> • Número randônico <%= java.lang.Math.random() %> • Informações do usuário logado <%= ((myApp.model.User)request.getAttribute(“user”)).getName() %> • Recomendado utilizar EL Expression, Custom TAG’s e JSTL 79 JSP :: EL Expression • Disponibilizado em 2003 a partir da evolução do JSP 2.0 com JSTL • • Objetivo era trazer alternativa ao uso de scripting dentro de páginas JSP Primeiramente introduzido na versão JSTL 1.0 EL Expression facilita a integração do estado do servidor • Podem ser usado dentro de declaração de TAG’s customizáveis • Exemplo de expressão com EL Expression • ${applicationScope.mail} ${person.dog.name} • Expressão equivalente com Java Expression <%= application.getAttribute(“mail”) %> <%= ((foo.Person) request.getAttribute(“person”)).getDog().getName() %> 80 JSP :: EL Expression (Relação de Objetos implícitos) • Possibilidades de objetos implícitos dentro do escopo de EL Todos são objetos implícitos :: Map • • • • • • • • • • • pageScope requestScope sessionScope applicationScope param paramValues header headerValues cookie initParam pageContext Caso não seja explicitado o valor ele irá buscar dentro dos 4 escopos, uma referência com o name especificado. Foi o caso do exemplo utilizando person! 1. 1. 2. 2. 3. 3. Java Java Language Language Naming Naming Rules Rules Pode Pode iniciar iniciar com com letra, letra, underline underline ee dolar dolar “$” “$” Números Números poderão poderão aparecer aparecer após após letras letras Palavras Palavras reservadas reservadas não não são são permitidas permitidas ------------------Qualquer Qualquer violação violação destas destas regras regras uma uma exceção exceção será será levantada! levantada! De todos os objetos implícitos citados acima, somente pageContext não é do tipo Map. Ele é uma atual referência do objeto pageContext, e pageContext é um javaBean! 81 JSP :: JSP Standard Action São compostas de TAG’s padrões usadas para realizar operações que normalmente só eram possíveis através do uso de scripting • Com versão do JSP 2.0 temos disponível as seguintes actions • • • • • • <jsp:useBean ... /> • Tenta recuperar um bean declarado em um determinado escopo <jsp:setProperty ... /> • Atribui valores a uma propriedade de um determinado bean especificado <jsp:getProperty ... /> • Efetua a invocação para um método de acesso de um bean • Consequentemente faz conversão implícita para um tipo String de retorno <jsp:include ... /> • Análogo à diretava <%@ include file=“menu.html”/> • A vantagem é que este action trata conteúdo em tempo de execução <jsp: forward ... /> • Também redireciona a chamada para outro JSP, além de poder escrever nele 82 JSP :: Complexidade x Robustez • Necessidade de estender componentes para reuso • Equipe necessita se beneficiar de TAG’s padrões customizáveis afim de suprir as funcionalidade bem como atender a demanda solicitada 83 Custom Tag’s Custom TAG Library Description (TLD) 84 Custom Tags :: Introdução Assim como os JSP Standard Action, podemos definir nossas TAG’s • Principais objetivos/benefícios • Reusar componentes dentro do JSP • Diminuir quantidade de código Java nas páginas • Deixar o arquivo JSP mais legível, facilitando para o designer • • Alguns exemplos de TAG’s que poderiam ser customizadas • • • • • Montagem de uma tabela dinâmica a partir de uma coleção no request Manipulação de arquivos Páginação de buscas Combo genérico, como uma listagem de Cidades por Estado Diversos outros a partir de componentes DHTML, ActiveX, Flash, etc. 85 Custom Tags :: Introdução • Existem diversas TAG’s disponíveis, inclusive com recursos AJAX • • • • • • Struts Framework e TAG’s do Struts-Layout TagLib Apache Jakarta Project TAG’s disponíveis pelo JSTL JSF :: Java Server Faces (inúmeros baseados JSF: Richfaces, Icefaces, etc.) Diversas outras poderão ser encontradas facilmente na internet Existem dois tipos de implementação de Custom TAG’s Simple TAG handler • Classic TAG handler • 86 Custom Tags :: Forma estrutural e Comunicação • Entendendo a estrutura de diretórios e a comunicação entre os artefatos 87 Custom Tags :: API (Sumário) • Classic TAG extensions (JSP 1.2 e 2.0) Controle e manipulação de TAG’s complexas • Escrito somente dentro da linguagem java e criado por desenvolvedores de bibliotecas TAG • • SimpleTag extension e TAG files (Disponível apenas no JSP 2.0) TAG’s mais facilitadas, possibilitando a extensibilidade por meio de sintaxe JSP • Pode ser criado por autores de página JSP ou desenvolvedores de bibliotecas de TAG’s • 88 Custom Tags :: API (Visão extendida) • Diagrama de classes :: API • Foi necessário a criação da interface JspTag para relacionar as duas formas • Neste aspecto ela foi projetada apenas para fins organizacionais entre os dois tipos 89 Custom Tags :: Classic Tag (Especificação JSP 1.2) • Existem duas possibilidades para implementação de TAG’s Classic • TagSupport • Define uma TAG sem corpo (configurado por padrão) • • • Dentro da implementação do método doAfterBody(), é possível acessar o corpo da TAG Apenas uma iteração será efetuada dentro do corpo BodyTagSupport Define uma TAG com corpo. Possibilidade de efetuar iterações dentro do corpo • Métodos constantemente utilizados • • • • setBodyContent() • Chamado pelo JSP quando setado para processar corpo da TAG • Seta propriedades de conteúdo para carregamento do corpo pelo formulário doInitBody() • Executado logo após método setBodyContent(). Não é chamado para TAG’s vazias. • Onde efetua o processamento do corpo. Métodos equivalentes para duas formas. doStartTag() :: Carregado durante inicialização da TAG • doAfterBody() :: Processado após o carregamento do corpo da TAG • doEndTag() :: Chamado durante finalização da TAG • 90 Custom Tags :: Classic Tag :: TagSupport (Ciclo de Vida) 91 Custom Tags :: Classic Tag :: Tag Support (Implementando) • Passos necessários 1 :: Escrever uma classe que estenda javax.servlet.jsp.tagext.TagSupport • 2 :: Implementar os métodos que tratarão o comportamento da TAG • • Podem ser implementados os métodos (não são obrigatórios) doStartTag() • doAfterBody() • doEndTag() • 3 :: Criar um arquivo TLD para a TAG • 4 :: Declarar o arquivo TLD dentro do DD (web.xml) • 5 :: Escrever o arquivo JSP que utiliza esta TAG • 92 Custom Tags :: Classic Tag :: Tag Support (Artefatos) Arquivo TLD <taglib <taglib ....> ....> <tag> <tag> <name>curso</name> <name>curso</name> <tag-class>teste.Curso</tag-class> <tag-class>teste.Curso</tag-class> <body-content>empty</body-content> <body-content>empty</body-content> </tag> </tag> </taglib> </taglib> Referência do TLD no DD(web.xml) <web-app <web-app ...> ...> <jsp-config> <jsp-config> <taglib> <taglib> <taglib-uri>curso</taglib-uri> <taglib-uri>curso</taglib-uri> <taglib-location> <taglib-location> /WEB-INF/tld/sample.tld /WEB-INF/tld/sample.tld </taglib-location> </taglib-location> </taglib> </taglib> </jsp-config> </jsp-config> <web-app> <web-app> Classe estendida de TagSupport public public class class Curso Curso extends extends TagSupport TagSupport {{ private private PageContext PageContext pageContext; pageContext; public public int int doStartTag() doStartTag() throws throws JspException JspException {{ try { try { pageContext.getOut().print(“Hello”); pageContext.getOut().print(“Hello”); }} catch catch (IOException (IOException e) e) {{ throw new JspException(“erro"); throw new JspException(“erro"); }} return return SKIP_BODY; SKIP_BODY; }} public public int int doEndTag() doEndTag() throws throws JspException JspException {{ return return EVAL_PAGE; EVAL_PAGE; }} }} Arquivo JSP <%@taglib <%@taglib prefix="rafa“ prefix="rafa“ uri="curso"%> uri="curso"%> <html> <html> <head> <head> <title>TagSupport</title> <title>TagSupport</title> </head> </head> <body> <body> <br/> <br/> <center> <center> <rafa:curso/> <rafa:curso/> </center> </center> </body> </body> </html> </html> 93 Custom Tags :: Classic Tag :: BodyTagSupport (Ciclo de Vida) 94 Custom Tags :: Classic Tag :: BodyTagSupport (Ciclo de Vida) • Passos necessários 1 :: Escrever uma classe que estenda javax.servlet.jsp.tagext.BodyTagSupport • 2 :: Implementar os métodos que tratarão o comportamento da TAG • • Podem ser implementados os métodos (não são obrigatórios) • • • • • doStartTag() doInitBody() setBodyContent( BodyContent ) doAfterBody() doEndTag() 3 :: Criar um arquivo TLD para a TAG • 4 :: Declarar o arquivo TLD dentro do DD (web.xml) • 5 :: Escrever o arquivo JSP que utiliza esta TAG • 95 Custom Tags :: SimpleTag (Especificação JSP2.0 - Implementando) • Passos para implementação • • • • • 1 :: Escrever uma classe que estenda [ javax.servlet.jsp.tagext.SimpleTagSupport ] 2 :: Implementar o método doTag() 3 :: Criar um arquivo TLD para a TAG 4 :: Declarar o arquivo TLD dentro do DD (web.xml) 5 :: Escrever o arquivo JSP que utiliza esta TAG 96 JSTL Java Server Pages Standard TAG Library 97 JSTL :: Introdução Conjunto de bilbiotecas pré-definidas pela SUN Microsystems • Engloba biblioteca diversas funcionalidades comuns para diversos JSP • • • • • • Iterações e condicionais Processamento XML Acesso a base de dados Formatação e Internacionalização Outras vantagens • • • • Você não tem que escrever suas próprias Tag’s Apenas deverá entender e utilizar todas as Tag’s disponíveis providas pela J2EE Código se torna mais conciso com a presença de Tag’s JSP Portabilidade garantida 98 JSTL :: Tags libraries disponíveis • Seguem abaixo tipos de implementações de TAG’s JSTL disponíveis • Core • Define Tag’s para os processamentos mais comuns como • • Database • • • Garante formatação de números, datas, entre outros campos customizáveis XML e XPath • • • Acesso e manipulação de dados dentro de um JSP Cuidado com a arquitetura em camadas. Este não é o papel do JSP. Formatting • • Condições, Loop’s, switch, redirecionamentos, impressões e outros Biblioteca para manipulação e navegação de estrutura de arquivos XML Também é possível efetuar parser entre outras transformações I18N (Internacionalização) • Centraliza através de páginas JSP um ponto comum para 99 JSTL :: Core Tag Library • Exemplos • Código implementado utilizando scriptlet <% <% java.util.Iterator java.util.Iterator ii == cartelas.iterator(); cartelas.iterator(); Cartela cartela = null; Cartela cartela = null; while( while( i.hasNext() i.hasNext() )) {{ cartela cartela == (Cartela) (Cartela) i.hasNext(); i.hasNext(); %> %> <% <% • <%= <%= cartela.numero cartela.numero %> %> }} %> %> Código utilizando TAG’s JSTL <c:out> <c:out> <c:set> <c:set> <c:remove> <c:remove> <c:if> <c:if> <c:choose> <c:choose> <c:when> <c:when> <c:otherwise> <c:otherwise> <c:forEach> <c:forEach> <c:import> <c:import> <c:url> <c:url> <c:redirect> <c:redirect> <c:forEach <c:forEach items=“${cartela}” items=“${cartela}” var=“bingo”> var=“bingo”> <c:out <c:out value=“${bingo.numero}”/> value=“${bingo.numero}”/> </c:forEach> </c:forEach> • Exemplo de declaração de referência para a TAg dentro do JSP <%@ <%@ taglib taglib prefix=“c” prefix=“c” uri=“http://java.sun.com/jstl/core” uri=“http://java.sun.com/jstl/core” %> %> 100 JSTL :: Database Tag Library • Disponíveis nas situações para Consultas • Atualizações • Transações • • <sql:setDataSource> <sql:setDataSource> <sql:query> <sql:query> <sql:update> <sql:update> <sql:param> <sql:param> <sql:dataParam> <sql:dataParam> <sql:transaction <sql:transaction Observações O objetvo é demonstrar as funcionalidades • Porém não é considerado uma boa prática • Exemplo de declaração de referência para a TAG • <%@ <%@ taglib taglib prefix=“sql” prefix=“sql” uri=“http://java.sun.com/jstl/sql” uri=“http://java.sun.com/jstl/sql” %> %> 101 Struts framework Apache Software Foundation 102 Struts :: Visão Geral Framework open-source criado e mantido pela Jakarta Project • Mantém estruturação de uma aplicação web • • • Disponibiliza desenvolvimento através da separação do modelo MVC Utilizado para construção de páginas utilizando Servlet’s e JSP • • Também inclui um conjunto de Custom TAG’s com a biblioteca Orientado a padrões Singleton, Composite View, Front Controller, Business Delegate • Filter Intercepting, Command, inclusive o pattern MVC • • • Possui diversos recursos como validação, internacionalização, etc. Facilita mapeamento de requisições através de arquivos em XML 103 Struts :: Arquitetura (Overview) 104 Struts :: Arquitetura (Particularidades) • Struts é focado no controle de requisições na camada de visão • Fluxo de requisição é mediado pelo controlador chamado Action • • • • Após excutado a regra, o Action controla esta delega a um JSP • • • Os Actions também podem ser usados na camada de modelo A camada de modelo encapsula a lógica de negócios e estado Por este motivo não é recomendado este tipo de lógica nos Actions Este mapeamento é feito a partir de um arquivo de configuração Maior benefício disto é o baixo acoplamento entre a visão e modelo Informações de acesso, mapeamento e fluxo de processo contém: • • Actions(controladores) mapeam a requisição HTTP via XML Possibilita estabelecer a navegação entre diversos Actions 105 Struts :: Arquitetura (Fluxos x Artefatos) 106 Struts :: Classe Action Servlet (Controlador) • Faz parte do Struts e estende a funcionalidade da classe HttpServlet • • • Foi projetado para interceptar requisições a fim de mediar o responsável Toda requisição passa pelo ActionServlet e redireciona para o Action Lê arquivo de configuração para determinar o fluxo de controle Mapeamento do ActionServlet é feito dentro do DD(web.xml) • Exemplo de mapemento. Toda requisição “*.do” é interceptada • <servlet> <servlet> <servlet-name>action</servlet-name> <servlet-name>action</servlet-name> <servlet-class>org.apache.struts.action.ActionServlet</servlet-class> <servlet-class>org.apache.struts.action.ActionServlet</servlet-class> <init-param> <init-param> <param-name>config</param-name> <param-name>config</param-name> <param-value>/WEB-INF/struts-config.xml</param-value> <param-value>/WEB-INF/struts-config.xml</param-value> </init-param> </init-param> <load-on-startup>1</load-on-startup> <load-on-startup>1</load-on-startup> </servlet> </servlet> <servlet-mapping> <servlet-mapping> <servlet-name>action</servlet-name> <servlet-name>action</servlet-name> <url-pattern>*.do</url-pattern> <url-pattern>*.do</url-pattern> </servlet-mapping> </servlet-mapping> 107 Struts :: Classe Action Servlet (Diagrama de Sequência) • Fluxo de controle dentro de um ActionServlet 108 Struts :: Classe RequestProcessor (Gerenciador Interno) Provida pelo framework a fim de processar configurações estabelecidas • Contém o fluxo lógico de processamento do ActionServlet • Algumas implementações estabelecidas por esta classe • • processPath :: Determina a pasta que foi invocada a requisição • processLocale :: Seleciona um Locale específico para esta requisição • processContent :: Seta o content type padrão para todas as requisições • processMapping :: Determina quais os mapeamentos necessários a este • processActionForm :: Instância e o coloca dentro de um escopo • processPopulate :: Popula um ActionForm associado ao formulário • processValidate :: Efetua pré-validação conforme ActionForm associado • processForward :: Efetua o mapemento entre Actions e JSP de saídas • processActionPerform :: Determina se o método que será chamado 109 Struts :: Classe Action (Controlador da aplicação) ActionServlet recebe requisição e envia para o Action associado • Struts associa o controle de requisições através do struts-config.xml • Para que o desenvolvedor implemente um Action, deve-se: • • • Estender a classe :: org.apache.struts.action.Action Sobrescrever(override) o método execute( .... ) Dentro deste método pode ser implementado toda a regra necessária • Geralmente não é recomendável. Isto é responsabilidade da camada Model • Consequentemente o envio(forward) para o JSP que resultará os dados • Também poderá enviar para outro Action responsável • • Efetuar o mapeamento da requisição no arquivo struts-config.xml • Geralmente este arquivo está localizado abaixo da pasta WEB-INF 110 Struts :: Classe Action (Exemplo de Implementação) A implementação de um Action é comparado a um servlet • Exemplo de implementação de um Action • package package submit; submit; import import import import javax.servlet.http.*; javax.servlet.http.*; org.apache.struts.action.*; org.apache.struts.action.*; public public class class SubmitAction SubmitAction extends extends Action Action {{ public public ActionForward ActionForward execute(ActionMapping execute(ActionMapping mapping, mapping, ActionForm ActionForm form, form, HttpServletRequest request, HttpServletResponse response) HttpServletRequest request, HttpServletResponse response) {{ SubmitForm SubmitForm ff == (SubmitForm) (SubmitForm) form; form; // // obtem obtem oo form form bean bean // // obtendo obtendo oo ultimo ultimo nome nome ee // // setando setando para para oo escopo escopo de de request request String lastName = f.getLastName(); String lastName = f.getLastName(); request.setAttribute("lastName", request.setAttribute("lastName", lastName.toUpperCase()); lastName.toUpperCase()); // // enviando enviando controle controle para para um um JSP JSP específico específico return return (mapping.findForward("success")); (mapping.findForward("success")); }} }} 111 Struts :: Configuração : struts-config.xml • A implementação de um Action requer um mapeamento 11 <struts-config> <struts-config> 22 <!-<!-- ========== ========== Definições Definições de de Action’s Action’s Mapping Mapping ============ ============ --> --> 33 <action-mappings> <action-mappings> 44 55 <action <action path="/submit" path="/submit" 66 type="submit.SubmitAction" type="submit.SubmitAction" 77 name="submitForm" name="submitForm" 88 input="/submit.jsp" input="/submit.jsp" 99 scope="request" scope="request" 10 validate="true"> 10 validate="true"> 11 <forward 11 <forward name="success" name="success" path="/submitSuccess.jsp"/> path="/submitSuccess.jsp"/> 12 <forward 12 <forward name="failure" name="failure" path="/submitFailure.jsp"/> path="/submitFailure.jsp"/> 13 </action> 13 </action> 14 14 15 </action-mappings> 15 </action-mappings> 16 16 17 17 </struts-config> </struts-config> • Para chamar um action com este mapeamento deverá utilizar a URL • [ http://host-server:porta\path ] :: http://127.0.0.1:8080/submit.do 112 Struts :: Classe ActionForm ActionForm’s são classes estensíveis utilizadas por desenvolvedores • Objetivo de acessar os parâmetros informados pela requisição • • • Intermedia para o Action informações do formulário Eles podem atuar nos escopos de “Request” e “Session” Também devem ser configurados no struts-config.xml • • • Primeiro deve-se declarar com uma tag <form-bean> Posteriormente atribui a propriedade name da tag de Action. public public class class LoginPageForm LoginPageForm extends extends ActionForm ActionForm {{ private private String String user; user; private private String String password; password; public public public public String String getName() getName() {{ return return void setName(String void setName(String name) name) this.Name this.Name }} {{ this.name this.name == name name }} public public String String getPassword() getPassword() {{ return return this.Name this.Name }} public public void void setPassword(String setPassword(String password) password) {{ this.password this.password == password password }} }} 113 Struts :: Classe ActionForm (Uma visão de multi-formulários) 114 Struts :: DynaActionForm (Uma alternativa) • DynaActionForm foram criados a partir de ActionsForm’s • Incorporados a versão 1.1 do Struts A diferenciação é justamente por manter esta configuração no XML • O objetivo é o mesmo do ActionForm’s mantendo no struts-config • • Devem estar declarados todos os parâmetros que esta requisição recebe 115 Struts :: Classe DispatchAction (Introdução) Bastante utilizado para resolver várias requisições em única classe • Diminui quantidade de código e Actions existentes na aplicação • • • • Geralmente utilizado em um CRUD (Create, Read, Update e Delete) Uma grande quantidade de métodos existentes indica alto acomplamento Configurações de uso • Na chamada de uma Action é necessário especificar o request parameter Pode ser especificado diretamente ou via javaScript no formulário HTML • No struts-config, cada action, receberá o valor carregado em “parameter” • • • O valor será o nome do método a ser carregado a requisição Não é mais necessário implementar o método execute() 116 Struts :: Classe Action (Exemplo de implementação) Exemplo de implementação da classe DispatchAction • public public class class CRUDItemCompraAction CRUDItemCompraAction extends extends DispatchAction DispatchAction {{ public public ActionForward ActionForward addItem(ActionMapping addItem(ActionMapping mapping, mapping, ActionForm ActionForm form, form, HttpServletRequest HttpServletRequest request, request, HttpServletResponse HttpServletResponse response) response) throws throws Exception Exception {{ try try {{ // // implementacao implementacao de de codigo codigo para para insercao insercao }} catch(Exception catch(Exception ex) ex) {{ //exception //exception }} }} public public ActionForward ActionForward deleteItem(ActionMapping deleteItem(ActionMapping mapping, mapping, ActionForm ActionForm form, form, HttpServletRequest HttpServletRequest request, request, HttpServletResponse HttpServletResponse response) response) throws throws Exception Exception {{ try try {{ // // implementacao implementacao de de codigo codigo para para delecao delecao }} catch(Exception catch(Exception ex){ ex){ //exception //exception }} }} }} 117 Struts :: Tag Library (Principais Tags disponíveis a partir da API do Struts) API do Struts povêm um conjunto bibliotecas de TAG’s para uso • O uso destas TAG’s não é obrigatório mas foi bastante encorajado • Principais tag-libs do Struts • • struts-html • • struts-logic • • Tag responsável para acessar beans bem como suas propriedades struts-template • • Disponibiliza tags lógicas dentro do JSP a fim de eliminar scriptlets struts-bean • • Suporte para renderização entre camada de visão e componentes DHTML Template para formulários em JSP, incluindo parametrização de conteúdo struts-nested Possibilidade para acessar hierarquia de objetos • Facilita para renderização de listas a partir de outras listas • 118 Struts :: Tag Library (Configuração a partir do DD) Para utilizar um Tag library, é necessário mapear o seu arquivo TLD • Todas as tag libraries são definidas dentro do web.xml usando <taglib> • <!-<!-- Struts Struts Tag Tag Library Library Descriptors Descriptors --> --> <taglib> <taglib> <taglib-uri>/WEB-INF/struts-bean.tld</taglib-uri> <taglib-uri>/WEB-INF/struts-bean.tld</taglib-uri> <taglib-location>/WEB-INF/struts-bean.tld</taglib-location> <taglib-location>/WEB-INF/struts-bean.tld</taglib-location> </taglib> </taglib> <taglib> <taglib> <taglib-uri>/WEB-INF/struts-html.tld</taglib-uri> <taglib-uri>/WEB-INF/struts-html.tld</taglib-uri> <taglib-location>/WEB-INF/struts-html.tld</taglib-location> <taglib-location>/WEB-INF/struts-html.tld</taglib-location> </taglib> </taglib> 119 Struts :: Tag Library (Exemplo de uso em um JSP) • Para utilizar um Tag library, é necessário mapear o seu arquivo TLD 11 22 33 44 55 66 77 88 99 10 10 11 11 12 12 13 13 14 14 15 15 16 16 17 17 18 18 19 19 20 20 21 21 <bean:define <bean:define id="favs" id="favs" name="FavoritesForm"/> name="FavoritesForm"/> <script <script language="JavaScript"> language="JavaScript"> function function showMessage() showMessage() {{ alert( alert( “Oi, “Oi, <bean:write <bean:write name='favs' name='favs' property='name'/>!" property='name'/>!" ); ); }} </script> </script> <p> <p> Obrigado Obrigado por por responder, responder, <bean:write <bean:write name="favs" name="favs" property="name"/>! property="name"/>! <br/> <br/> <a <a href="javascript:showMessage()">Clique href="javascript:showMessage()">Clique aqui</a> aqui</a> </p> </p> <p>Suas <p>Suas cores cores favoritas favoritas indicadas indicadas são: são: <ul> <ul> <li><bean:write <li><bean:write name="favs" name="favs" property="color[0]"/></li> property="color[0]"/></li> <li><bean:write <li><bean:write name="favs" name="favs" property="color[1]"/></li> property="color[1]"/></li> <li><bean:write <li><bean:write name="favs" name="favs" property="color[2]"/></li> property="color[2]"/></li> </ul> </ul> <ul> <ul> <c:forEach <c:forEach var="color" var="color" items="${favs.color}"> items="${favs.color}"> <li><c:out <li><c:out value="${color}"/></li> value="${color}"/></li> </c:forEach> </c:forEach> 120 Struts :: Plugins disponíveis (Extensivamente utilizados) • Tiles framework • • Permite construção de páginas web através da montagem de tiles reutilizáveis Facilidade de modificar o layout e conteúdo sem que um afete o outro Geralmente o site está dividido entre Header, Body, Menu e Footer • Template tanto para conteúdo estático como dinâmico, internationalização e outros. • • Validator Framework • • • • Incluido no Struts 1.1 por padrão Originado a partir do framework Validator do Apache Jakarta Evita uso de escrita no método validate() dentro do ActionForm (redundância) Toda a regra de validação está inclusa dentro um arquivo de configuração XML • • Pode estar incluso chamada a uma função javascript para fazer o tratamento necessário Ambos devem ser configurado no [struts-config.xml] da aplicação 121 Struts :: Revisão Geral Arquitetura (Java EE x Struts 1.1) 122 Struts :: Boas práticas de programação (Parte 1) 01. Estruture os arquivos de configuração de acordo com a aplicação # Utilize um arquivo tipo [struts-global.xml] para centralizar contexto genérico # Neste caso crie um arquivo para cada entidade (struts-action-compras.xml) + Utilize um subdiretórios [compras] ou [struts-action] para centralizar o conteúdo # Isto também vale para o uso dos validators caso esteja sendo utilizado 02. Utilize JSTL e o EL do JSP 2.0 em vez das talglibs logic e bean # A própria comunidade do Struts recomenda, inclusive sub-projetos Struts-EL 03. Esqueça os arquivos TLD, eles já estão dentro dos JAR’s do struts <%@ taglib prefix=“html” uri=“http://java.sun.com/jsp/jstl/core”/> # Procurar TLD’s dentro de JAR’s é obrigatório desde especificação JSP 1.1 04. Evite <html:errors>. Geralmente utilizam como 1ª tag de aprendizado Solução padrão é usar arquivo de mensagens [ApplicationResources.properties] Consequentemente utilizando a tag <html:messagens> para mostrar o erro <html:messages id=“error” property=“nome”> <li>${error.usuario.naoEncontrado} </html:messages> 123 Struts :: Boas práticas de programação (Parte 2) 05. Utilize Plug-in Validator(Integra código via javascript e ActionForm) # O idéal é evitar regras individuais dentro do ActionForm, mas pode acontecer # Geralmente utilizado para validações genéricas dentro do contexto da aplicação 06. Prefira DynaActionForm com todos os campos do tipo String # Alternativa para muitas classes ActionForm’s dentro da aplicação # Configurado dentro do struts-config.xml. Podem ser acessados via JSTL/EL JSP2 ${nomeFormularioDinamico.map.propriedade} :: Referência explícita ao atributo “map” 07. Aproveite a presença da API Commons BeanUtils da Jakarta # API utilizada pelo struts e encontra-se dentro do arquivo commons-beanUtils.jar # Utilização do método estático BeanUtils.copyProperties() 08. Utilize extensivamente a classe DispatchAction # Tenha vários métodos dentro de um Action ao invés do tradicional execute() # Lembrar de acrescentar o atributo parameter dentro do action-mapping # Valor do parâmetro pode estar dentro da URL ou HEADER do formulário 124 Struts :: Boas práticas de programação (Parte 3) 09. Use o Struts para capturar todas as exceções necessárias da aplicação # Recomendado utilizar excecções de runtime para erros de infra-esrtutura # Para capturar utiliza-se [global-exceptions] dentro do [struts-config.xml] 10. Use logging sempre puder (Organize a estrutura da saída de mensagem) # JSE 5.0 incorporou a API de Commons Logging da Jakarta (java.util.Logging) # Estruture níveis de detalhação para debug, info, error, e outros da aplicação # Bastante importante para verificação em ambientes de produção 11. Não inclua lógica de negócio nos Actions (Controller, lembra ?) # Visualize o desenvolvimento dentro do modelo MVC # Objetivo é obter os dados e despachar para a camada de negócios (Model) 12. Utilize os recursos de segurança declarativa do Java EE (web.xml) # Os roles ficam definidos dentro do web.xml pelo security-constraint # Dentro do action-mapping é possível verificar quais os roles com acesso # Também pode ser verificado acesso dentro do JSP pela tag logic-present # Vários tags do tiles suportam o atributo role 125 Struts :: Boas práticas de programação (Parte 4) 13. Não utilize o pool de conexões interno do Struts # Na documentação é indicado como depracated a partir da versão 1.2.x # Utilize o pool de conexões na arquitetura de sua aplicação # Caso sua aplicação não possua uma sugestão seria o Jakarta Commons DBCP 14. Use o CSS nível 2(conhecido como layers) ou Tiles # CSS (Cascading Style Sheets) resolve o problema de conteúdo e formatação # Para o desenvolvedor a melhor alternativa é o Tiles, já o webdesigner CSS 2 15. Procure utilizar um projeto padão para testar novas funcionalidades # O framework dispõe muitas funcionalidades e configurações # Melhor testar e implementar em um projeto modelo de funcionalidades 16. Última dica para aproveitar o fim da página é usar práticas do TDD # TDD (Test Driven Development) é uma das grandes práticas do XP # Utilizando o conceito de integração contínua: 126 Struts 2.0 framework (Struts +Webwork) Apache Software Foundation 127 Struts 2 :: Introdução Apache Struts 2 foi originalmente desenvolvido a partir do webwork 2 • Struts 2 requer pelo menos a API Servlet 2.4, JSP 2.0 e Java 5 • Actions agora são POJO’s e não estendem a API de servlet • • Actions são configurados por pacote Podem utilizar anotações ou arquivos de configuração em XML • Suporte a temas e validações detalhadas e customizáveis • Baseado no OGNL (Object Graph Navigation Language) :: EL Avançado • • • Fácil leitura, compilação incremental bastante rápida Já vem embutido suporte com Freemarker, Velocity e JSP • Arquitetura foi projetada com suporte a plugins: • Tiles, JasperReports, JFreeChart, JSF, SiteMesh entre outros em andamento Suporte nativo para AJAX com os toolkit’s DOJO e DWR • Integração nativa com spring • 128 Struts 2 :: Arquitetura Geral (Visão Genérica) 129 Struts 2 :: Comparativo Genérico (Diferenças quanto ao Struts1) Implementações em Struts 1 continuarão funcionando • Migração não é complexa, porém é trivial • É notavel que antes o ActionServlet(Front Controller) agora é um Filter • Freemarker é adotado como padrão, podendo ainda usar JSP ou velocity • Exibe erros de maneira melhorada • Sintaxe similar ao Velocity • Support a JSP taglibs • 130 Struts 2 :: Injeção de Dependência (Um conceito básico) Utilizado manter baixo acoplamento entre componentes de sistema • Dependências de módulos são definidas na configuração do sistema • • • • Configuração a partir de uma infra-estrutura (container) Estas dependências serão injetadas durante a instância da classe Injeção de dependência é um tipo de inversão de controle • Existem duas formas de inversão de controle: Dependency Lookup • Injection Dependendy • Inversão de Controle Procura por Dependência Contextualized Dependency Lookup Dependency Pull Injeção de Dependência Interface Setter Construtor 131 Struts 2 :: Classe Action (Introdução) Os Actions agora são POJO’s. Devem obedecem o padrão Javabean • Struts2 pode utilizar injeção de dependência para instanciar os Actions • Dependências dos Actions sejam resolvidos no momento da instância • Possibilidade de integração com frameworks Spring + Hibernate • Existe também a utilização da técnica de binding (ValueStack) • Possibilita uso de expressões a fim de buscar propriedades de objetos • Os dados do request contrõem o POJO que é injetado no Action • Exemplo de configuração de um action (struts.xml) • <struts> <struts> <include <include file="struts-default.xml"/> file="struts-default.xml"/> <package <package name="default“ name="default“ extends="struts-default"> extends="struts-default"> <action <action name="Hello" name="Hello" class="Hello"> class="Hello"> <result>/pages/Hello.jsp</result> <result>/pages/Hello.jsp</result> </action> </action> <!– <!– adicione adicione outros outros actions actions aqui aqui --> --> </package> </package> </struts> </struts> 132 Struts 2 :: Classe Action (Exemplo de Implementação) • ActionsForm (FormBeans) não são mais utilizados • • • Os testes tornaram-se mais fáceis. Implementação não depende mais do container. Exemplo de implementação de um Action public public class class ListaUsuariosAction ListaUsuariosAction {{ public public Collection<Usuario> Collection<Usuario> usuarios; usuarios; public public String String listaUsuarios() listaUsuarios() {{ usuarios usuarios == DAOService.getUsuarios(); DAOService.getUsuarios(); return return “listaUsuarios”; “listaUsuarios”; }} public public Collection<Usuario> Collection<Usuario> getUsuarios() getUsuarios() {{ return return usuarios; usuarios; }} public public void void setUsuarios(Collection<Usuario> setUsuarios(Collection<Usuario> usuarios) usuarios) {{ this.usuarios this.usuarios == usuarios; usuarios; }} }} 133 Struts 2 :: Interceptors Objetos java utilizados para execução antes ou depois dos Actions • Alguns Interceptors interessantes • Alias • • • Execute and Wait • • Criará dentro da Action uma referência ao arquivo que existe no request Token • • Rodar serviços em segundo plano, enquanto é mostrado uma mensagem File upload • • Actions de atributos diferentes de nomes dos enviados Permite que você mapeie uma exceção java para um result específico Você pode implementar seus próprios interceptors a partir da interface: • com.opensymphony.xwork.interceptor.Interceptor 134 Struts 2 :: Relação de Tags (Modelo Estrutural) • Struts Tags • • Generic Tags :: UI Tags :: Themes e templates AJAX Tags • • Podem ser implementadas via JSP, Freemarker e Velocity • • AJAX Tags :: Integração com DOJO e DWR Em ambos os casos podem ser utilizados em conjunto com OGNL Segue abaixo arquitetura básica de interface com usuário 135 Struts 2 :: Comparativo Relacional (Struts1 x Struts2 :: Parte 1) Feature Struts 1 Struts 2 Action classes Classe Action impossibilitava estender outra classe A classe Action é um POJO Threading Model Actions são classe singletons e devem ser thread-safe desde que uma única instância da classe manipule todas as requisições para o Action Actions são instânciados para cada requisição. Servlet Dependency Actions possuem dependências da classe HttpServlet, inclusive objetos Request e Response que são passados no argumento do método execute. Não possuem acoplamento da API de Servlets. Testability Dependem da API do Servlet pelo método execute() Actions podem ser testados no momento da instância, acessando suas propriedades, invocando métodos via IoC. Harvesting Input No Struts 1 é utilizado ActionForm ou DynaBean para capturar entrada de dados do formulário, consequentemente criando redudâncias. Struts 2 utilizam propriedades do Action para acessar entradas de formulário. Essas propriedades podem ser acessadas via taglib. Também é suportado o uso dos ActionForm, em conjunto com objetos Action POJO. Expression Language Possibilita integração com JSTL, sendo que é utilizado apenas JSTL EL. JSTL pode ser utilizado, mas atualmente dispõe por padrão tanto com JSP, FreeMarker e Velocity o uso implítico de OGNL. 136 Struts 2 :: Comparativo Relacional (Struts1 x Struts2 :: Parte 2) Feature Struts 1 Struts 2 Binding values into views Utiliza o mecanismo de JSP Standard dentro do contexto de páginas para acessar objetos. Utiliza tecnologia “ValueStack” que possibilita as tags acessarem valores de objetos sem estar diretamente acoplados com a visão do tipo de objeto que está sendo renderizado. ValueStack estrategicamente possibilita reuso de visões acessando propriedades pelo mesmo nome mesmo de tipos diferentes. Type Conversion Propriedades utilizadas em ActionForm usualmente são todas do tipo String. Struts 1 utiliza a API commons-beanUtils para efetuar a conversão para um tipo de objeto em específico. Struts 2 utiliza OGNL para tipos de conversões. O framework inclui conversores básico para tipo de objetos comuns e primitivos. Validation Suporte manualmente via método validate do ActionForm ou através Commons Validator. Foi estendido o uso do XWork Validator que possibilita validações através de sub-objetos usando validações definidas para diversos tipos de propriedades e contextos. Control of Action Execution Suporta separação do RequestProcessor (lifecycle) para cada módulo, mas todos os actions dentro do módulo devem compartilhar o mesmo ciclo de vida definido. Os Actions suportam diferentes ciclos de vida a partir de Interceptors, inclusive podem ser customizados. 137 Struts 2 :: Comparativo (Struts2 x WebWork2) Webwork 2.2 propõe as mesmas funcionalidades do Struts 2.0 • Comparativo de organização estrutural entre o Struts2 e Webwork 2 • 138 AJAX Asynchronous Javascript and XML 139 AJAX :: Aplicações web tradicionais • • • • • Web originalmente projetada para navegação de documentos HTML Modelo “Clique, aguarde e recarregue” durante requisições Página é recarregada a cada evento, envio de dados ou navegação Existe a perda de contexto (informações mostradas anteriormente) Modelo de comunicação síncrono 140 AJAX :: Rich Internet Application (RIA) Conceito de aplicações web com características de uma desktop • Programa responde de forma intuitiva e rápida • Tudo acontece naturalmente (sem necessidade de um evento) • Termo utilizado inicialmente pela Adobe(Macromedia) em 2001 • Alternativas de uso em busca do RIA • Java Applet e/ou Java Web Start via JNPL • DHTML = HTML + JavaScript + CSS + DOM • Macromedia Flash • DHTML com IFrame Oculto • Laszlo ou Flex (Flash + comunicação assíncrona) • AJAX (DHTML + XMLHttpRequest via comunicação assíncrona) • Outros frameworks que se beneficiam do AJAX • • • (DWR, Dojo, jMaki, JSON, GWT, RichFaces, Dynafaces, Icefaces, ..... ) Hoje temos grandes inovações com o JavaFX e o Silverlight(Microsoft) 141 AJAX :: Rich Internet Application (RIA) • Exemplo de execução de modelo uma comunicação assíncrona • Não existe a interrupção do usuário enquanto os dados estão sendo carregados. A renderização do conteúdo ocorre dinamicamente. 142 AJAX :: Introdução Termo utilizado por Jesse James Garret em Fevereiro de 2005 • Principais características • Modelo Assíncrono • Interface mais natural e intuitiva (Melhor usabilidade) • Atualização parcial da tela (Não existe a perda do contexto) • Tecnologias utilizadas • Protocolo HTTP • DHTML = HTML + JavaScript + CSS + DOM • Programação pelo lado do servidor • • • • É necessário ativar/reativar uma chamada assíncrona para o servidor Podem se utilizar Servlet’s, JSP, JSF, bem como frameworks como Struts Utilização do objeto XMLHttpRequest • Atualmente fornece um melhor suporte por parte dos browser’s 143 AJAX :: Arquitetura e processo de comunicação 144 AJAX :: Comunicação HTTP via XMLHttpRequest • Diferenças entre aplicações web tradicionais das que usam AJAX 145 AJAX :: Comunicação HTTP via XMLHttpRequest • Diagrama de sequência a partir de uma requisição utilizando AJAX 146 AJAX :: Objeto XMLHttpRequest Inicialmente implementado pela Microsoft dentro do IE5 (ActiveX) • Engenheiros do Mozilla e Apple efetuaram uma versão nativa • Consequentemente a W3C convergiu dentro de uma proposta • • Document Object Model (DOM) Level 3 Load and Save Specification Comunica-se GET/POST • Content Type pode ser • • • • • • text/xml text/plain text/json Text/javascript Pode ser utilizado em outras tecnologias como • ASP, PHP, Ruby, .NET 147 AJAX :: Fluxo de implementação (passo-a-passo) • Passos necessários para implementar uma aplicação com AJAX 148 AJAX :: Popularidade entre frameworks • Fonte Ajaxian em 23 de Setembro de 2006 • Artigo do SEJug (Grupo de Usuários Java de Sergipe) sobre AJAX com DWR • 149 Web 2.0 ? 150 Web 2.0 :: O que danado é isso ? Termo idealizado por Tim O’Reilly em outubro de 2004 • A partir de uma série de conferências sobre desenvolvimento web • O que faz de um site ou tecnologias ser web 2.0? • Na verdade seguem algumas características • Envolvimento com o usuário • Conteúdo que importa • Melhor organização de conteúdo • Acessibilidade • Velocidade • Outros pontos • • Resumidamente é um novo jeito de desenvolver para web! 151 Web 2.0 :: O emergencial controle de massa de mídia social 152 Web 2.0 :: Potenciais benefícios da colaboração de negócios social 153 Web 2.0 :: Afinal o eles chamam de Enterprise 2.0 ? 154 Web 2.0 :: Novo ecossitema Web formalizado 155 Web 2.0 :: Efeitos entre sites 156 Web 2.0 :: Qual tendência nos próximos anos 157 Web 2.0 :: Alguns termos utilizados e envolvidos 158 Projeto :: Estudo de caso Desenvolvendo conceitos práticos 159 Referências Bibliográficas 160
Documentos relacionados
Introdução a Java Server Pages
servlet no servidor, através de
Java 2 Enterprise Edition
servlet no servidor, através de