Java Avançado JavaServer Pages Guilherme Kely de Melo Oliveira gkmo@cin.ufpe.br Jobson Ronan...

Post on 19-Apr-2015

118 views 8 download

Transcript of Java Avançado JavaServer Pages Guilherme Kely de Melo Oliveira gkmo@cin.ufpe.br Jobson Ronan...

Java Avançado

JavaServer Pages

Guilherme Kely de Melo Oliveiragkmo@cin.ufpe.br

Jobson Ronan Jeronimo da Silvajrjs@cin.ufpe.br

Material cedido por: Daniel Arraes Pereiradap@cin.ufpe.br

2

Java Server Pages - JSP

Separação do conteúdo estático e dinâmico. Independência de plataforma. Reuso de componentes. Funcionalmente equivalente aos Servlets. Embarca instruções de processamento no

resultado a ser apresentado. Facilidade de uso Maturidade da linguagem Java Facilidade de desenvolvimento

3

Funcionamento do JSP (JSPEngine)

4

Funcionamento do JSP (JSPEngine)

O navegador envia uma requisição para a página JSP. Se esta requisição é a primeira a este JSP então:

O container analisa o conteúdo do arquivo JSP. O contêiner gera o código fonte de um servlet baseado

no conteúdo do JSP. O compilador Java gera uma classe (.class) a partir do

código fonte do Servlet gerado no passo anterior. O Servlet correspondente ao JSP é instanciado e

iniciado (se necessário) O Servlet correspondente ao JSP atende a requisição

(método service(...)) .

5

JSPEngine

Responsável por: Atender requisições de páginas JSP. Transformar uma página JSP requisitada em

um servlet. Executar o servlet para atender às requisições

JSP correspondentes.

6

Componentes e Sintaxe JSP

Diretivas Declarações Scriptlets Comentários Expressões

7

Diretivas

Instruções fornecidas ao JSPEngine para configuração do componente.

Se mantém válida para qualquer requisição enviada.

Empregadas nas fases de tradução e compilação Diretivas possíveis:

page include taglib

Sintaxe: <%@ diretiva nome_atrib_diretiva=“valor” %>

8

Diretiva page

Controla a estrutura do Servlet correspondente ao JSP.

Pode ser declarada várias vezes, mas cada opção só pode aparecer apenas uma vez na página Exceto a opção import (livre).

9

Diretiva page - Opções

import<%@ page import="java.util.Vector" %><%@ page import="java.util.*" %> <%@ page import="java.util.Vector,

ava.util.ArrayList" %> Similar ao import de Java.

session<%@ page session=“true” %> - Default<%@ page session=“false” %>

Controla quando um JSP participa ou não de Sessões. O valor false não é similar a getSession(false)

10

Diretiva page - Opções

buffer<%@ page buffer=“sizekb” %><%@ page buffer=“none” %>

Especifica o tamanho do buffer usado pelo PrintWriter do JSP.

autoflush<%@ page autoflush=“true” %> - Default<%@ page autoflush=“false” %>

Controla se o buffer de saída será “esvaziado” automaticamente caso cheio.

11

Diretiva page - Opções

contentType<%@ page contentType=“text/html”%>

Seta o content-type response header indicando o mime da resposta.

language<%@ page language=“Java”%> - única

suportada Indica a linguagem que está sendo usada.

12

Diretiva page - Opções

errorPage<%@ page errorPage=“URL Relativa”%>

Indica que página deve ser processada caso uma exceção seja lançada. Tal página deve ter a opção isErrorPage setada para true.

isErrorPage<%@ page isErrorPage=“true”%> - <%@ page isErrorPage=“false”%> - Default

Habilita uma página a tratar exceções através do objeto implícito exception (visto mais adiante)

13

Diretiva page - Opções

info<%@ page info=“mensagem”%>

Similar a getServletInfo().

extend<%@ page extends=“package.class”%>

Ajusta que classe o servlet gerado deve extender.

14

Diretiva page - Opções

isThreadSafe<%@ page isThreadSafe=“true”%> - Default<%@ page isThreadSafe=“false”%>

Ajusta quando o servlet gerado implementará SingleThreadModel

15

Diretiva include

Permite a inclusão de textos em tempo de tradução.

É possível usar a diretiva para incluir um cabeçalho padrão para todas as páginas:

<%@ include file="copyright.html" %>

16

Diretiva taglib

Será abordada mais a frente.

17

Scripting

Código Java embutido em uma página JSP.

Existem scriptings para: Expressões Declarações Scriptlets Comentários

18

Expressões

Expressões válidas da sintaxe Java, avaliadas pelo Servlet e enviadas ao seu fluxo de saída.

Possui o mesmo efeito do método response.getWriter().println(expressão.toString()) .

Sintaxe:

<%= expressão %> Exemplo

<%= new java.util.Date()%>

19

Declarações

Define um bloco com declarações de atributos e/ou métodos que podem ser acessados em toda a página JSP.

As regras para uma declaração válida são as mesmas de Java.

Sintaxe:

<%! declaração %>

20

Declarações Exemplo:<%! private int id = 0; public String parseData(Date dt)

{ … }

%>

21

Scriptlets

Permite a inserção de fragmentos de código Java, os quais serão executados sequencialmente.

Mapeado diretamente no método service(...).

Sintaxe:

<% scriptlet %>

22

Scriptlets - Exemplo

<% if(Calendar.getInstance().get(Calendar.AM_PM) == Calendar.AM ) { %>

Está de manhã!<% } else { %> Que horas são?

<% } %>

23

Comentários

<%-- cometário jsp--%> Não é enviado ao browser cliente

24

Objetos Implícitos

Objetos que são acessíveis dentro de um bloco scriptlet ou de expressão.

Sem a necessidade de se declarar ou importar.

Objetos:

•out•request•response•session•exception

•application•pageContext•config•page (this)

25

O Objeto out

Classe: javax.servlet.jsp.JspWriter Descrição: Usado para enviar

respostas para o cliente. Exemplo:

<% out.println(“Exemplo”);%>

26

O Objeto request

Classe: javax.servlet.http.HttpServletRequest

Descrição: Referencia a requisição corrente, que causou a chamada ao serviço.

Exemplo:<% String numero =

request.getParameter(“numero”); out.println(“vc digitou o numero ” + numero);%>

27

O Objeto response

Classe: javax.servlet.http.HttpServletResponse Descrição: Usado para mandar uma resposta ao

cliente. Permite enviar mensagens de erro, alterar códigos de status HTTP e headers em uma página JSP

Exemplo:<% response.setHeader("Pragma", "no-cache"); if (request.getProtocol().equals("HTTP/1.1")) { response.setHeader("Cache-Control", "no-

cache"); }%>

28

O Objeto session

Classe: javax.servlet.http.HttpSession Descrição: Referencia a sessão do usuário.

Ausente quando <%@ page session="false" %>

Exemplo:<% Usuario user = (Usuario) session.getAttribute(“user”); if (user == null){ response.sendRedirect(“login.jsp”); }%>

29

O Objeto exception

Classe: java.lang.Throwable Descrição: Usado para situações de erro.

Possui escopo de página e só está acessível se dito anteriormente<%@ page isErrorPage="true" %>

Exemplo:<I><%= exception.getMessage() %></I>.<PRE><% exception.printStackTrace(new

java.io.PrintWriter(out));%></PRE>

30

O Objeto application

Classe: javax.servlet.servlet.ServletContext

Descrição: Referencia o contexto da aplicação Web.

Exemplo:<%

out.println(application.getRealPath(“/tmp”));%>

31

Outros Objetos implícitos

page Equivalente ao “this”.

config Permite acesso a informações de configuração

do JSP. É do tipo javax.servlet.ServletConfig

pageContext Se refere ao ambiente da classe. Guarda referências à objetos implícitos. Provê métodos de leitura e escrita para

atributos em diferentes escopos.

32

Prática 1

Escreva um JSP temperatura.jsp que imprima uma tabela HTML de conversão Celsius-Fahrenheit entre -40 e 100 graus Celsius com incrementos de 10 em 10 A fórmula é F = 9/5 C + 32

33

Prática 1 (Cont.)

Altere o exercício anterior para que a página também apresente um campo de texto para entrada de temperatura em um formulário que envie os dados com POST.

Faça com que a própria página JSP receba a mensagem a) Identifique, no início, o método com

request.getMethod() (retorna POST ou GET, em maiúsculas).

b) Se o método for POST, mostre, em vermelho, antes da exibição do formulário, o texto: "x graus F = y graus C" onde x é o valor digitado pelo usuário e y é a resposta.

34

Prática (extra)

Escreva uma página JSP novaMensagem.jsp que mostre um formulário na tela com dois campos: email e mensagem.

Escreva uma outra página gravarMensagem.jsp que receba dois parâmetros: email e mensagem e grave esses dois parâmetros na sessão do usuário.

Faça com que a primeira página aponte para a segunda.

Crie uma terceira página listarMensagens.jsp que mostre todas as mensagens gravadas na sessão até o momento.

Ações

36

Ações

Construídas em XML, possuem como objetivo controlar o comportamento do engenho JSP.

37

Jsp:include

<jsp:include page="relative URL" flush="true" />

Inclui o recurso em tempo de requisição

38

Jsp:forward

<jsp:forward page="relativeURL" />

Permite passar a requisição para outro recurso.

39

Jsp:useBean

<jsp:useBean id=“nome“ class="package.class"  type=“tipo da variável”/>

Combinada com as ações getProperty e setProperty, forma um meio limpo de trabalhar com classes de entidade em JSP´s.

40

Jsp:useBean

<jsp:useBean id="primeTable" class="hall.NumberedPrimes" />

<jsp:setProperty name="primeTable" property="numPrimes" value=“123”/>

Considerações sobre o setPropety:1. Colocando ‘*’ no atributo property, seta-

se o bean mapeando os nomes dos parâmetros da requisição aos atributos do bean.

2. A conversão das strings passadas no atributo value para os tipos primitivos correspondentes é automática.

41

Pratica 2

Use um JavaBean Mensagem, com propriedades email e mensagem para implementar o exercício extra anterior

Substitua todas as chamadas de new Mensagem() por <jsp:useBean> no escopo da sessão

Use <jsp:getProperty> para exibir os dados

Altere gravarMensagens para que use <jsp:forward> para despachar a requisição para uma página erro.jsp, caso o usuário deixe os campos do formulário em branco, e para listarMensagens.jsp se tudo funcionar corretamente

Bibliotecas de Tags

43

Bibliotecas de Tags

Podem ser personalizadas. Acesso a todos os objetos implícitos. Reuso de componentes no JSP. Podem se comunicar com outras tags. Diminuição de código Java nas páginas. Podem ser aninhadas em outras tags.

44

Bibliotecas de Tags

Utilidades. Ex.: Pecorrer uma coleção montando uma

tabela. Manipular arquivos. Paginação de buscas.

45

Componentes

Dois componentes em uma biblioteca de tags:

O descritor da biblioteca de tags (TLD).

Os manipuladores de tag.

46

O Arquivo TLD

Um arquivo descritor de bibliotecas (TLD) é um documento XML que descreve a biblioteca.

Um TLD contém informações sobre a biblioteca como um todo, sobre cada tag contida na biblioteca e é usado pelo container JSP para validar essas tags.

47

Manipuladores de tags

São objetos Java que executam a ação associada a uma tag personalizada.

Quando uma requisição é recebida pelo container JSP para uma página contendo tags personalizadas, a instância do manipulador da tag correspondente é obtida.

É necessário implementar uma interface apropriada dependendo do tipo de comportamento da tag

48

Utilizando Tags

<%@ taglib uri=“/WEB-INF/alo.tld" prefix=“exemplo" %>

<html><head><title>JSP Page</title></head><body>

<exemplo:helloworld msg=“hello world!!”></ exemplo:helloworld>

</body></html>

49

O Arquivo TLD: Exemplo

<xml version=“1.0” encoding=“ISSO-8859-1” ?><!DOCTYPE taglib PUBLIC “-//Sun Microsyste...” ... ><taglib>

<tlibversion>1.1</tlibversion><jspversion>2.0</jspversion><shortname>exemplo</shortname><tag>

<name>helloworld</name><tagclass>org.Exemplo</tagclass><bodycontent>JSP</bodycontent><attribute>

<name>msg</name><required>true</required><rtexprvalue>true</ rtexprvalue>

</attribute></tag>

</taglib>

50

JSTL

JSP Standard Tag Library Provê um conjunto padrão de tags. Funcionalidades encapsuladas JSTL 1.0

CORE Acesso a base de dados Processamento XML Formatação e I18N

51

JSTL: Core

Expressões Processamento condicional Iterações Acesso a recursos baseados em URL

cujos conteúdos podem ser incluídos ou processados pelo JSP. (não serão abordadas)

52

Expressions Tags

out – Avalia uma expressão e escreve seu resultado no JspWriter corrente.

<c:out value="${sessionScope.cart.numberOfItems}"/> Expression Language JSTL EL implicit objects

53

Expressions Tags

set – Seta o valor de um atributo em qualquer escopo do JSP (page, request, session, aplication).

<c:set var="foo" scope="session" value="..."/>

54

Expressions Tags

remove – Remove um objeto em qualquer escopo do JSP.

<c:remove var=“cart" scope="session"/>

55

Tags condicionais

if – Permite a execução condicional do corpo de acordo com a avaliação da expressão.

<c:if test=“${sessionScope.user != null}”>

... </c:if>

56

Tags condicionais

choose – Permite a execução condicional através das tags when embarcadas (similar ao case). Se nenhuma condição for avaliada como true o corpo da tag otherwise será avaliado.

57

Tags condicionais

<c:choose>  <c:when test="${sessionScope.customer.category ==

'trial'}>     ...    </c:when>   <c:when test="${sessionScope.customer.category ==

'member'}" >      ...   </c:when>  <c:otherwise>     ...    </c:otherwise>

</c:choose>

58

Tags condicionais

forEach – Permite a iteração em uma coleção de objetos.

<c:forEach var="item" items = "${sessionScope.cart.items}">

<tr> <td align="right" bgcolor="#ffffff">      <c:out value="${item.quantity}"/>    </td> </tr></c:forEach>

59

Paginação na Web

Não é uma tarefa fácil. As soluções podem aumentar

bastante o tráfego na rede, bem como consumir muito recursos do servidor de BD e aumentar o consumo de memória

60

Paginação na Web

Solução: Reusar componentes aprovados para

tais situações.• Pager taglib• Display Taglib

61

Pager taglib

Oferece todo o necessário para paginação de dados.

Poucos recursos de customização. Software Livre. Vem com vários exemplos. jsptags.com/tags/navigation/pager

62

Display taglib

Originalmente para Perl. Apresenta as listagens em um visual

profissional (tabelas HTML). Software Livre. Recursos para formatação, processamento

de dados de saída [ordenação, agrupamento e exportação (excel, XML)].

E, obviamente, paginação de dados. displaytag.sourceforge.net

JSTL Expression Language

64

JSTL Expression Language

Expression language em consocio com taglibs, torna possivel acessar e manipular dados da aplicação sem ter que usar scriptlets ou request-time expressions.

<x:aTag att="<%= aName.getFoo().getBar() %>">

<x:aTag att="${aName.foo.bar}">

65

JSTL Expression Language

Disponibiliza atributos de escopo como maneira padrão de comunicação entre lógica de negócio e páginas JSP.

Ex: escopo de sessão.

<c:if test="${sessionScope.cart.numberOfItems > 0}">

  ... </c:if>

66

JSTL Expression Language

Responsável em lidar com expressões e literais. Expressões são cercadas por ${ }.

Qualquer valor que não está cercado por ${ } é tratado como um literal.

Ex:

<c:if test="${bean1.a < 3}" /> - Expressão

<c:if test="true" /> - Literal

67

Atributos

Acessados por nome, com escopo opcional. Propriedades dos atributos são acessadas usando ..

Unifica o tratamento de . e [ ]. exp-a.exp-b equivale a exp-a[exp-b]. Considere a avaliação de exp-a e exp-b em value-a e value-b respectivamete

Se value-a for um Map, retorne value-a.get(value-b). Se value-a for uma Lista ou array, cast value-b em

inteiro e retorne value-a.get(value-b) ou Array.get(value-a, value-b).

Se value-a fou um JavaBean object, cast value-b para String, se value-b for uma propriedade “readable” de value-a, retorne a chamada ao getter.

68

Atributos

A EL avalia um identificador procurando seu valor como um atributo de acordo com o comportamento de PageContext.findAttribute(String).

Ex: ${produto} irá procurar pelo atributo nomeado produto nos contextos page, request, session, application e irá retornar seu valor. Caso não ache, null é retornado.

Identificadores que coincidem com os objetos implícitos da EL (vide próximo slide) irão retornar tais objetos ao invés de atributos.

69

Objetos implícitos.

pageScope – Um Map dos atributos do escopo da página com seus valores.

requestScope - Um Map dos atributos do escopo da requisição com seus valores.

sessionScope - Um Map dos atributos do escopo da sessão com seus valores.

applicationScope - Um Map dos atributos do escopo da aplicação com seus valores.

param – Um Map que mapeia nomes de parâmetros para uma String com o valor daquele parâmetro. (request.getParameter (String))

70

Objetos implícitos.

paramValues – Um Map que mapeia nomes de parâmetros para um array de String com todos os valores daquele parâmetro. (request.getParameterValues(String))

header – Um Map que mapeia nomes de header para uma String.(request.getHeader(String))

headerValues - Um Map que mapeia nomes de headers para um array de String com todos os valores daquele header. (request.getHeaders(String))

cookie - Um Map que mapeia nomes de cookies para um Cookie. (request.getCookie(String))

initParam - Um Map que mapeia nomes para um parâmetro de inicialização. (config.getInitParameter(String))

71

Objetos implícitos

Exemplos: <c:if test=“${param.id == 5}”> ... </c:if> <c:if test=“${sessionScope.user !=

null}”> ... </c:if>

72

Literais.

Boolean: true e false Long: como em Java. Float: como em Java. String: com aspas simples e dupla. Null: null

73

Operadores.

Aritiméticos: +, -, *, / e div, % e mod Lógicos: and, &&, or, ||, not, ! Relacionais: ==, eq, !=, ne, <, lt, >, gt, <=,

ge, >=, le. empty: Um operador prefixal que é usado para saber se algo é nulo ou vazio. Ex:

<c:if test=“${!empty sessionScope.user}”>

74

Prática 3

Instalar tags do JSTL Instale a biblioteca JSTL na sua aplicação,

copiando os JARs e TLDs para os locais exigidos Veja a documentação e os tags disponíveis

Use os tags de lógica <if> e <forEach> para remover as expressões condicionais e iterações das páginas da aplicação de mensagens

Criando TagLibs

76

Tag Files - Vantagens

Reuso – os tag files permitem uma melhor customização de conteúdo, assim como o uso de nested tags.

Compatibilidade com tag handlers

Páginas JSP sem Scriptlet

Desenvolvimento rápido – Recompilação dinâmica dos tag files é suportada por alguns containers como tomcat 5.X

77

Tag Files

<%@tag description=“Descrição da Tag" pageEncoding=“Padrão de codifficação“

bodycontent="empty | scriptless | tagdependent"

dynamic-attributes=“handlerDosAtributos" %> - similar a diretiva page das páginas JSP.

<%@attribute name=“NomeDoAtributo" required="true|flase“ type=“TipoDoDado” %> - descreve um atributo da tag, e se é obrigatório ou não.

<jsp:doBody/> - representa o que é definido entre a abertura e fechamento da tag.

78

Exemplo de um Tag File

<%@tag description="Display logo" pageEncoding="UTF-8"%><%@taglib prefix="c"

uri="http://java.sun.com/jsp/jstl/core"%>

<%@attribute name="size" required="true"%><c:choose><c:when test="${size == 'large'}"><img src='logos/LogoLarge.gif' align='Center'></c:when><c:otherwise><img src='logos/LogoSmall.gif' align='Center'></c:otherwise></c:choose><jsp:doBody/>

79

Usando um Tag File

<%@ taglib prefix="tags" tagdir="/WEB-INF/tags" %>

<html>

<head>

<title>Usando um Tag File</title>

</head>

<body>

<tags:logo size="large"/>

</body>

</html>

80

Prática 4

Escreva um custom tag simples <pcc:tabela> que receba um String como parâmetro (texto) e imprima o String dentro de uma tabela HTML:O tag <pcc:tabela texto="Texto Recebido"/> deve produzir<table border="1"><tr><td>Texto Recebido</td></tr></table>

Crie mais dois atributos que definam cor-de-fundo e cor-do-texto para a tabela e o texto.

Escreva uma segunda versão do tag acima que aceite o texto entre os tags <pcc:tabela>Texto Recebido</pcc:tabela>