Páginas JSP
Parte I
Sistemas de Informação
Prof. Vinicius Cardoso Garcia
vcg@cin.ufpe.br
Licença do Material
Este Trabalho foi licenciado com uma
Licença
CreaFve Commons -‐
Atribuição-‐NãoComercial-‐
ComparFlhaIgual 3.0 Não Adaptada
.
Referências
• Notas de aula baseadas no material do curso:
– Programação Web, Módulo 6, versão 1.0 – Novembro/
2007
– JEDI: Java Educa>on & Development Ini>a>ve (DFJUG-‐ BRASIL)
• HALL, Marty. Core Servlets and Java Server Pages, Pren>ce Hall, 2000
• GOODWILL, James. Mastering Jakarta Struts, Wiley, 2002
• Paul Deitel e Harvey Deitel. Java -‐ Como Programar -‐ 8ª Edição. Pren>ce Hall -‐ Br, 2010.
LogísFca
• Apresentação do professor
• Material
• Dúvidas? Interrompam a
vontade...
• Celulares silenciosos
• Exercício
ObjeFvos Parte I
•
Ao final desta parte, o estudante será
capaz de:
–
Ter uma visão geral sobre páginas JSP
–
Conhecer o ciclo de vida de páginas JSP
–
Compreender a sintaxe e a semân>ca das
ObjeFvos Parte II
• Esta parte dirige-‐se aos responsáveis pela camada de apresentação que, não necessariamente, precisam ter experiência em Java ou em qualquer outra
linguagem
• Ao final desta parte, o estudante será capaz de:
– Compreender a linguagem de expressão das páginas JSP – U>lizar a biblioteca JSTL
O Que veremos na Parte I?
•
Definição de JSP
•
Ciclo de Vida das páginas JSP
•
Comparação JSP e Servlet
•
Sintaxe e semân>ca JSP
–
Scriptlets
–
Expressões
O Que veremos na Parte II?
•
Linguagem de Expressão JSP
•
Sintaxe EL
•
Acessando Variáveis de Escopo e Propriedades
•
Objetos Implícitos EL
O que é JSP?
•
JavaServer Pages
•
Tecnologia baseada em Servlet u>lizada na
camada WEB
•
Apresenta conteúdos está>cos e dinâmicos
•
Baseada em texto
•
Contêm em sua maior parte template texto
HTML misturado com tags especificando
Por que JSP?
• São documentos textuais muito parecidas com HTML • Código mais fácil de manter
• Familiares para desenvolvedores com conhecimentos em HTML
• Dedicação dos desenvolvedores para a criação de
templates HTML
• Possui suporte built-‐in para o uso de componentes de sorware reu>lizáveis (JavaBeans)
• Parte da solução Java para o desenvolvimento de aplicações WEB
• Não necessita de uma compilação explícita pelo desenvolvedor
Ciclo de Vida JSP
• WEB Server gerencia as JSP de uma maneira similar as Servlets: pelo uso de um ciclo de vida bem
definido
• As JSP têm um ciclo de vida de três fases:
– Inicialização – Serviço
JSP e Servlet Equivalente
•
As JSP são compiladas em uma classe
equivalente Servlet pelo WEB Server
•
Para conhecer a classe Servlet gerada, o
Applica7on Server u>liza o seguinte
diretório:
${SERVER_HOME}/domains/domain1/generated/jsp/j2ee-modules/ ${WEB_APP_NAME}/org/apache/jsp
JSP e Servlet Equivalente
•
É importante perceber que as JSP
são vistas como Servlets, mesmo que
não seja imediatamente óbvio
•
JSPs vs Servlets:
–
JSP são mais orientadas a texto
–
Servlets permitem ao desenvolvedor
maior liberdade com código Java
Elementos e Modelo de Dados
•
Componentes de todas JSP podem ser
qualificados em duas categorias gerais:
– Elementos
• Informação produzida dinamicamente
– Modelo de dados
Elementos e Modelo de Dados
<html> <head> <title>Hello World!</title> </head> <body> <center><h1>Hello World! It's <%= new java.util.Date()%></h1> </center>
</body> </html>
Sintaxe e SemânFca JSP
•
Componentes de todas JavaServer Pages
podem ser divididos em duas categorias:
– Elementos: informação produzida dinamicamente – Dados de modelo: informação está>ca que cuida
da apresentação
•
E em dois >pos de es>los:
– Es>lo JSP
• Fácil criação
– Es>lo XML
Sintaxe e SemânFca JSP
• JSP podem ser vistas como documentos HTML ou XML com scripts JSP encaixados
• Elementos de script JSP permitem inserir código Java na Servlet gerada
• A maneira mais simples de tornar a JSP dinâmica é pelo encaixe direto de elementos script no modelo de dados
• Elementos script JSP:
– Scriptlets – Expressões – Declarações
Scriptlets
•
Inserir diretamente código Java:
–
Qualquer código Java que poderia ser
u>lizado dentro de um método
•
Ú>l para encaixar códigos simples
•
Nenhum limite específico a respeito da
complexidade de códigos
PrintlnScriplet
•
Crie um JSP com…
–
Uma variável do >po String chamada
username
–
Esta variável recebe um valor de um
nome
•
Ex.: Jack Bauer
–
O valor é impresso através do método
LoopScriplet
•
Crie um Scriptlet com um for que
imprima uma mensagem 10 vezes
LoopScriplet
• Note que o scriptlet não é enviado para o cliente, apenas sua saída.
• Tente ver o código da saída do JSP que foi produzida no browser para entender esse ponto.
• Tudo o que vemos são tags HTML mais a saída do
scriptlet mas não vemos o scriptlet.
• O es>lo XML para escrever scriptlets é: <jsp:declaration>
Código Java;
Expressões
• Fornece um meio de inserir valores Java diretamente na saída:
• Note que o ponto-‐e-‐vírgula ( ; ) não aparece no final do código dentro da tag
• Desde que elas são avaliadas em tempo de execução, as expressões têm acesso completo a informação sobre a requisição
• É mais simples que escrever:
<%= Java Expression %>
Expressões
• Objetos pré-‐definidos, chamados objetos implícitos, se
tornam disponíveis para os desenvolvedores JSP de modo a simplificar as expressões
• Exemplos:
– request: objeto da classe H:pServletRequest;
– response: objeto da classe H:pServletResponse;
– session: objeto da classe H:pSession associada ao request (se houver)
– out: objeto da classe PrintWriter, u>lizada para enviar a saída para o
cliente. Exemplo:
Hostname: <%= request.getRemoteHost() %>
Declarações
• Permite a definição de métodos ou variáveis
• U>lizada para encaixar código como as scriptlets • São inseridas no corpo principal da classe Servlet,
fora do método _jspService() processando o request
– Vantagem: O código em uma declaração pode ser usado para declarar novos métodos e variáveis globais de
classe
– Desvantagem: O código em declarações não é protegido <%! Java Code %>
Declarações
•
Lembretes ao u>lizar a tag de declaração:
–
Iniciado por <%! e finalizado por %>
–
As instruções devem seguir a sintaxe Java
padrão
–
Declarações não geram saída
•
Desde que as declarações não geram
nenhuma saída, elas normalmente são
u>lizadas em conjunto com expressões JSP
ou scriptlets
AccessCountDeclaraFon
Revisão Parte I
•
Definição de JSP
•
Ciclo de Vida das páginas JSP
•
Comparação JSP e Servlet
•
Sintaxe e semân>ca JSP
–
Scriptlets
–
Expressões
–
Declarações
Linguagem de Expressão JSP
•
Foi introduzida com a especificação JSP 2.0
•
Fornece sintaxe simples e clara para escrever
expressões
•
Executam lógica simples ou acesso a variáveis
de escopo
•
Para acessar a propriedade de um JavaBean:
<% String name = user.getLastName(); %>
Linguagem de Expressão JSP
• Usando o primeiro modo
– Expostos a programação Java
– Usar os métodos get() dos beans
– O desenvolvedor precisa estar consciente do >po da propriedade Java
• Usando o segundo modo
– Este método é mais neutro de programação
– A propriedade de um JavaBean é longa e pesada – O método apresenta a sua saída diretamente ao
navegador cliente
– Manipulações não podem ser feitas através do valor recuperado
Linguagem de Expressão JSP
•
Usando o modelo EL, a propriedade JavaBean
pode ser acessada como:
${user.lastName}
•
Programação neutra
•
Curta e ao ponto
•
Pode ser usada para exibir a saída diretamente
ao usuário
•
Pode ser usada para apresentar o valor de tags
personalizadas para serem processadas
Sintaxe EL
•
Construtor EL pode ser um literal ou uma
expressão fechada entre um ${ e }
•
Literais
– Literais suportados e tratadas como em Java: Boolean, Long, Float, String e null
•
Define operadores padrão que podem ser
aplicados em literais
– Operadores aritmé>cos básicos (+, -‐, *, /,%) – Operadores lógicos (& &, | |,!)
Sintaxe EL
• As palavras reservadas de EL são:
– and (&&), eq (==), gt (>), ge (>=), or (||), ne (!=), le (<=), lt (<), div (/), mod (%)
– true e false – instanceof – null
– Empty
• Exemplos de expressões EL
– ${'JEDI'} – formato com o valor da String "JEDI" – ${5 + 37} -‐ formato com o valor 42
– $ ((10% 5) == 2) -‐ formato com o valor true – ${empty ''} -‐ formato com o valor true
Acessando Variáveis de Escopo e
Propriedades
• Embora seja capaz de formatar expressões simples de literais EL mostra a sua u>lidade quando acessa e processa variáveis em diferentes escopos
• Acessar variáveis é simples com EL:
– As variáveis são simplesmente referenciadas pelo nome – Propriedades de um JavaBean, métodos, e coleções
podem ser acessados a par>r de um nome de variável usando a notação "."
– Métodos e propriedades são acessadas da mesma forma
Acessando Variáveis de Escopo e
Propriedades
•
Exemplo:
${user.lastName}
•
Acessa um JavaBean que pode ser referenciado
pelo nome user e recupera o valor de sua
propriedade lastName
•
O escopo do JavaBean não importa
– EL executa busca de escopo
– Se foi especificado com o nome de um JavaBean que não existe em nenhum escopo, null será
Objetos Implícitos EL
• Embora o âmbito automá>co procure tornar mais fácil para os desenvolvedores a escrita de código, especificando uma variável do escopo
• Explicitamente facilita a manutenção do nosso construtor por futuros desenvolvedores
• EL nos fornece vários objetos implícitos que representam um Map de objetos dentro dos diferentes escopos:
– pageScope – requestScope – sessionScope
Objetos Implícitos EL
• Além disso, EL também define as seguintes objetos implícitos:
– param: um Map que representa uma requisição a
parâmetros de nomes e seus valores
– paramValues: um Map que representa o nomes dos
parâmetros para arrays de String e seus valores
– header: um Map que representa os cabeçalhos
disponíveis em uma dada requisição
– headerValues: um Map que representa os cabeçalhos
disponíveis em uma dada requisição
Notação []
•
Além da Notação “.”, EL prevê também
o “[]”
•
Notação de acesso a variáveis, métodos
e arrays
•
Em muitos aspectos, as duas notações
são semelhantes:
${user.lastName} ${user[lastName]}
JSLT
•
Afasta do uso de scriptlets dentro das páginas
JSP
•
Tags personalizadas:
– Permite graus de personalização e extensibilidade através do uso de tags personalizadas
– Preveem um caminho de apresentar
funcionalidades reusáveis dentro da página JSP – Série de bibliotecas disponíveis
•
É fornecido um padrão de biblioteca de tags,
chamado Java Standard Tag Library ou JSTL
Installing JSTL
1. Only when your servletcontainer doesn't ship with JSTL (e.g. Tomcat), place the JAR file(s) in Webapp/WEB-‐INF/lib (which is covered by the default webapp's classpath, so in a bit smart IDE you don't need to do anything else).
2. Declare the taglib in JSP file with the right TLD URI. You can find here (h:p://docs.oracle.com/javaee/5/jstl/1.1/docs/tlddocs/) the TLD documenta>on that applies to both JSTL 1.1 and JSTL 1.2. Click the taglib of interest to get the declara>on examples. For example the JSTL core taglib
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
More informa>on:
Incluindo JSTL na nossa Aplicação
•
Para incluir a biblioteca JSTL em nossa
aplicação, no NetBeans acesse Proper7es
do Projeto, em seguida selecione a opção
Libraries e pressione o botão Add Library...,
selecione a opção JSTL 1.1 ou 2.1, pressione
o botão Add Library e por fim pressione o
botão OK.
•
Existem vários pacotes de bibliotecas JSTL.
Somente a biblioteca core será discu>da
Biblioteca Core
• Fornece funcionalidade básica para o projeto WEB • Pode ser dividida em subcategorias:
– Tags de uso geral – Repe>ção
– Condicionais
– Manipulação de URL
• Em cada página JSP que fizer uso da funcionalidade da biblioteca Core
• A seguinte dire>va deve ser acrescentada:
<%@taglib uri="http:java.sun.com/jsp/jstl/core" prefix="c" %>
Tags de Uso Geral
•
Executa tarefas simples e comuns, embora
um deles tenha se tornado irrelevante com
a liberação da especificação JSP 2.0
•
As tags incluídas no conjunto de uso geral
são:
–
out
–
set
–
remove
–
catch
<c:out>
•
Avalia o resultado de uma expressão
•
Envia o resultado diretamente a saída da página
•
Funciona da mesma maneira da ação padrão
<jsp:getProperty>, não sendo necessário um
JavaBean para acessar à funcionalidade
•
Obsoleta com a liberação da especificação JSP
2.0:
– expressões EL podem ser avaliadas no stream de saída em qualquer parte da página JSP sem u>lizar qualquer tags JSP 2.0
<c:set>
•
Executa quase a mesma funcionalidade
da ação <jsp:setProperty>
•
Capaz de definir valores diretamente
em um JavaBean
•
Capaz de definir uma variável em um
determinado escopo
•
Pode ser usada posteriormente pelo JSP
ou em outra parte da aplicação
<c:remove>
•
Fornece uma maneira de remover variáveis de
um escopo definido
•
Tem dois atributos:
•
scope – O escopo da variável a ser removida.
•
var – O nome da variável a ser removida do
escopo definido
<c:remove var="myString" scope="session"/>
•
Assim como para a tag <c:set>, o uso dessa tag
<c:catch>
• Fornece capacidade de manipulação de erros em áreas específicas de uma JSP
• É simples de usar:
– Coloque o conteúdo JSP que poderia potencialmente gerar erros no corpo da tag <c:catch>
• Tem apenas um atributo:
– var: Define o nome que será u>lizado para expor a exceção gerada
– A variável assim criada terá escopo page
– Pode ser acessada mesmo depois que o bloco de captura encerrou
Tags de Uso Geral
<c:catch var="exception">
<%-- Forçamos um erro aqui para a funcionalidade desta Tag --%> <%
if (true) {
throw new Exception("Eu sou um erro inesperado"); }
%>
</c:catch>
<%-- A tag seguinte é discutida com mais ênfase na seção condicional --%>
<c:if test="${! empty exception}">
Ocorreu um erro na aplicação : ${exception.message} </c:if>
Tags de RepeFção
•
Proporciona alterna>vas para
embu>r laços de repe>ção em uma
página JSP como scriptlets
•
Seguintes tags:
–
forEach
–
forToken
<c:forEach>
• tag de repe>ção mais comumente usada • Permite iteração em:
– arrays primi>vos – instancias de: • java.u>l.Collec>on • java.u>l.Iterator • java.u>l.Map • java.u>l.Enumera>on
• Executa a repe>ção através de cada elemento do alvo • Expõe o valor atual da repe>ção para o código JSP
Tags de RepeFção
•
Um uso comum para esta tag é
interar
sobre os
resultados de um processamento realizado pela
aplicação (provavelmente uma Servlet).
•
Peguemos como exemplo o seguinte cenário:
temos um módulo da aplicação que
recupera
de um banco de dados
os detalhes do usuário
que resulta em uma categoria específica de
procura. Naturalmente, queremos realizar o
acesso lógico ao banco de dados através de
uma Servlet e passar os dados para
Tags de RepeFção
...// carrega os parâmetros de usuário em um Map Map parameters = loadUserParameters();
UserDataService service = new UserDataService();
// realiza uma pesquisa em banco e armazena os resultados em uma Collection.
Collection results = service.searchUsers(parameters); // armazena os resultados para pesquisa futura
request.setAttribute("searchResults", results); // repassa a requisição para a JSP exibir
request.getRequestDispatcher("/results.jsp").forward (request, response);
Tags de RepeFção
• Na página JSP, u>lizamos a tag forEach para iterar sobre os resultados da procura. Isso é possível ao apontar a tag
forEach para a instância da coleção armazenada no escopo da
requisição usando EL. Então, será exposto cada elemento da coleção u>liza definida pelo atributo var e usando EL para exibir os valores
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <H1>Os seguintes usuários estão de acordo com seu critério de pesquisa : </H1>
<br/>
<c:forEach var="user" items="${requestScope.searchResults}"> <li> ${user.name} - ${user.address}
Tags de RepeFção
<H1>Os usuários abaixo coincidem com seu critério de pesquisa : </H1> <br/>
<%
Collection results = (Collection) request.getAttribute ("searchResults");
Iterator iter = results.iterator(); while (iter.hasNext()) {
User user = (User) iter.next(); %>
<li> <%= user.getName() %> - <%= user.getAddress() %> <%
<c:forTokens>
• As outras interações tag são fornecidas por JSTL • Tag capta uma String e analisa em tokens com base
em um delimitador
• Todos os atributos da tag forEach são
compar>lhados por esta tag, com um acréscimo:
– delims: Define o delimitador a ser usado quando
analisar o alvo na String em tokens
• Os itens dos atributo tem agora um novo obje>vo para esta tag
<c:forTokens>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> ...<c:forTokens items="item1,item2,item3,item4" delims="," var="item"> <li> ${item}
Condicionais
•
Realizam a função fornecida pela regra if,
else-‐if, ...
•
Afirmações que podem ser encontradas no
padrão Java
•
O uso destas tags no padrão de declaração
Java conduzem a limpeza do código
•
Dois conjuntos de condicionais principais:
–
<c:if>
<c:if>
•
Permite a execução do conteúdo de sua
descrição com base na resposta do
valor
•
Se a expressão avaliada for verdadeiro o
código interno será executado
•
Se a expressão avaliada for falso, o
código interno não será executado
<c:choose>, <c:when>,
<c:otherwise>
•
As tags trabalham em conjunto para fornecer
funcionalidades de alterar o fluxo de código
dentro da aplicação
•
Uma ou mais tags são colocadas para a escolha
de uma delas
– A escolha da tag para avaliar o teste dos atributos acontece quando a tag executa o corpo dela para verificar se é verdadeiro
– Se não houver sucesso na tag correspondente, outra tag é escolhida, se esta es>ver incluída
Manipulando URL
•
JSTL fornece algumas tags
personalizadas que possuem
capacidades para manipulação de URL
•
Estas tags constroem e melhoram ações
que estão disponíveis nas páginas JSPs:
–
import
–
param
– url
<c:import>
•
Funciona da mesma maneira que o
include JSP
•
A ação no JSP inclui apenas as páginas
no interior da aplicação WEB incluído
no conteúdo atual da página
•
A tag <c:import> permite a
especificação de URLs absolutas
apontar para recursos externos
<c:import>
•
O atributo que usa esta tag é:
–
url
: O valor da URL de importação, pode ser:
• RelaFva, aponta para um recurso da aplicação
WEB
• Absoluta, capaz de apontar para recursos
externos
•
Contém uma série de outros atributos
•
São u>lizados para modificações em modo
de programação do conteúdo do recurso
<c:param>
•
U>lizada em conjunto com uma série de
outras tags dentro da
•
URL para manipulação de todo grupo
•
Não pode ser u>lizada sozinha, apenas
como uma tag de outras tags
disponíveis em JSTL
•
Usada para fornecer a forma de incluir
parâmetros e valores dentro de uma
URL
<c:url>
•
Usado para fornecer de forma automá>ca uma
URL com as informações necessárias para
gerenciar as sessões
•
Atributos relevantes:
– value: O URL para ser processada