Upload
internet
View
118
Download
8
Embed Size (px)
Citation preview
Java Avançado
JavaServer Pages
Guilherme Kely de Melo [email protected]
Jobson Ronan Jeronimo da [email protected]
Material cedido por: Daniel Arraes [email protected]
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>