JSP – JSTL
JSP – JSTL
JSP Standard Tag Library (JSTL)
Esforço de padronização do JCP: JSR-152
Baseado no Jakarta Taglibs (porém bem menor)
Oferece dois recursos
Conjunto padrão de tags básicos (Core, XML, banco de dados e
internacionalização)
Linguagem de expressões do JSP 1.3
Oferece mais controle ao autor de páginas sem necessariamente
aumentar a complexidade
Controle sobre dados sem precisar escrever scripts
Estimula a separação da apresentação e lógica
Estimula o investimento em soluções MVC
Como usar JSTL
Incluir em cada página que usa os tags: <%@ taglib uri="uri_da_taglib"
prefix="prefixo" %>
Usar os tags da biblioteca com o prefixo definido no passo anterior <prefixo:nomeTag atributo="..."> ...
</prefixo:nomeTag>
Cinco bibliotecas de tags
Core library: tags para condicionais, iterações, urls, ... <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
Exemplo: <c:if test="..." ... >...</c:if>
XML library: tags para processamento XML <%@ taglib prefix="x" uri="http://java.sun.com/jsp/jstl/xml" %>
Exemplo: <x:parse>...</x:parse>
Internationalization library <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
Exemplo: <fmt:message key="..." />
SQL library <%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %>
Exemplo: <sql:update>...</sql:update>
Function library <%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
Exemplo: ${fn:length(...)}
Linguagem de expressões (EL)
Permite embutir em atributos expressões dentro de delimitadores
${...}
Em vez de request.getAttribute("nome")
${nome}
Em vez de bean.getPessoa().getNome()
${bean.pessoa.nome}
Suporta operadores aritméticos, relacionais e binários
Converte tipos automaticamente
<tag item="${request.valorNumerico}" />
Valores default
<tag value="${abc.def}" default="todos" />
Linguagem de expressões (EL)
A primeira variável na expressão é um OBJETO IMPLÍCITO ou um
ATRIBUTO $ { primeiro.segundo)
Objetos:
pageScope, requestScope, sessioScope,applicationScope
param, paramValues
header, headerValues
cookie
initParam
pageConext
Único que não é mapeamento (Map); é um bean
Atributo:
Em qualquer um dos escopos: page, request, session, application
Linguagem de expressões (EL)
Se a expressão possuir um avariável seguida por um ponto, a variável a
esquerda TEM QUE ser um MAP ou um BEAN
O que estiver do lado direito do ponto TEM QUE ser uma chave de MAP ou uma
propriedade do BEAN
Deve seguir regras normais do Java para nomenclatura dos identificadores
Operador [] é similar ao ponto, mas melhor
${pessoa[“nome“]} idem a ${pessoa.nome}
Se pessoa for List ou Array?
Só funciona com [] : ${listMusic[“Take“] } ou ${listMusic[0]}
O que vem dentro dos colchetes é uma String:
Chave Map
Propriedade Bean
Índice de um List ou Array
Principais ações
Suporte à impressão da linguagem expressões <c:out value="${pessoa.nome}" />
Expressões condicionais <c:if test="${pessoa.idade >= 18}">
<a href="adultos.html">Entrar</a>
</c:if>
<c:choose>
<c:when test="${dia.hora == 13}">
<c:out value="${mensagemEspecial}" />
</c:when>
<c:otherwise>
<c:out value="${mensagemPadrao}" />
</c:otherwise>
</c:choose>
Iteração <c:forEach items="${pessoas}" var="p" varStatus="s">
<c:out value="${s.count}"/>. <c:out value="${p}"/>
</c:forEach>
PageContext
Objeto que permite a tag acessar informações
sobre o contexto da aplicação para leitura de
valores de formularios (request), variaveis de
sessao e gerar conteudo de saida (response)
PageContext
Acesso facil a parametros de entrada vindos de
get/post, variaveis de sessoes e cookies
$session:minhavariaveldesessao
$cookie:meucookie
$param:email
$param:nome Dados vindos de
forms
set
Atribui valor a uma variável
Sintaxe 1
<c:set value="valor"
var=”nomeVariavel”
[scope=”{page|request|session|application}”] />
Sintaxe 2
<c:set var=” nomeVariavel”
[scope=”{page|request|session|application}”]>
Corpo do Conteúdo
</c:set>
Exemplo
<c:set var="nome"
value="${param.nome}" />
Olá ${nome}
<c:set var="nome">
${param.nome}
</c:set>
Olá ${nome}
remove
Remove uma variável
<c:remove var="nomeVar" [scope="{page|...}"]/>
Se o escopo for omitido a variável é removida do
escopo mais interno
Exemplo
<c:remove var="nome"
scope="page" />
out
Avalia e exibe uma expressão
Sintaxe
<c:out value="valor”
[escapeXml="{true|false}"]
[default="valorDefault"] />
Exemplo
Olá <c:out value="${nome}" />
if
Avalia o conteúdo se a condição for verdadeira
<c:if test="condição">
Conteúdo
</c:if>
Exemplo
<c:if test="${usuario.visitas eq 1}">
Esta é a sua Primeira Visita.
</c:if>
choose ... when ... otherwise
Avalia várias condições
semelhante a um if aninhado de Java
<c:choose>
<c:when test="condição">
</c:when>
...
<c:otherwise>
</c:otherwise>
</c:choose>
Exemplo
Situação Parcial:
<c:choose>
<c:when test="${nota lt 30}">
Reprovado
</c:when>
<c:when test="${nota lt 70}">
Recuperação
</c:when>
<c:otherwise>
Aprovado
</c:othewise>
</c:choose>
Exemplo : choose = if ... else
Situação Final:
<c:choose>
<c:when test="${nota lt 70}">
Reprovado
</c:when>
<c:otherwise>
Aprovado
</c:otherwise>
</c:choose>
forEach (1/2)
Percorre uma coleção (lista, array ou
mapeamento) de objetos
<c:forEach var=“variavel” itens=“colecao”
varStatus=“variavelStatus” />
conteúdo
</c:forEach>
Exemplo forEach
Exemplo:
<c:forEach var=“livro” itens=“${livros}”
varStatus=“status” />
${status.count} – ${livro.titulo}
</c:forEach>
1 - Java Como Programar
2 - Java Servlets
3 - HTML & XHTML
forEach (2/2)
Laço com início e fim
<c:forEach var=“variavel” begin=“inicio” end=“fim”
step=“passo” varStatus=“variavelStatus” />
conteúdo
</c:forEach>
Construindo uma Tabela
<%@ taglib prefix="c"
uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head><title>Função Quadrado</title></head>
<body>
<table border="1">
<tr><th>x</th><th>x^2</th></tr>
<c:forEach var="counter" begin="1" end="10">
<tr>
<td>${counter}</td>
<td>${counter*counter}</td>
</tr>
</c:forEach>
</table>
</body>
</html>
forTokens
Semelhante ao forEach mas os elementos estão
em um único String.
<c:forTokens items="stringOfTokens"
delims="delimitadores" [var=“nomeVar"]
[varStatus=“nomeVarStatus"]
[begin=“inicio"] [end=“fim"] [step=“passo"]>
Conteúdo
</c:forTokens>
Exemplo
Imprimir as letras do string "a,b/c,d/e,f" onde , e /
são delimitadores
<c:forTokens items="a,b/c,d/e,f" delims=",/"
var=“letra">
<p>${letra}</p>
</c:forTokens>
Arquitetura de Sistemas
Web
Modelo 2 Camadas
•Camada de Apresentação com Regras de Negócio Juntas.
•Camada de Persistência.
Problemas para o usuário, que não tem os programas funcionando
como deveriam; Problemas para a equipe de desenvolvimento que
não tem o seu trabalho reconhecido e, normalmente, tem que
trabalhar apenas "apagando incêndios"; e Problemas para a
Administração/Gerência da rede que não consegue gerar os
resultados esperados pela Administração da empresa, apesar dos
elevados valores já investidos.
Maior TCO – Custo Total de Propriedade
Modelo 2 Camadas
Modelo 3 Camadas
Modelo e códigos construídos para representar as camadas.
Os servidores não precisam estar necessariamente em máquinas diferentes, podem estar na mesma máquina. Porem questões de performance são relevantes.
• Camada de Apresentação
• Camada de Negócios
• Camada de Persistência
Modelo 3 Camadas
Modelo 3 Camadas c/ MVC
APRESENTAÇÃO NEGÓCIO OU LÓGICA PERSISTÊNCIA
(INTEGRAÇÃO)
NAVEGADOR WEB SGDB V
C
M
SERVIDOR CLIENTE - SERVIDOR CLIENTE
SERVIDOR WEB
Helper classes
MVC - FLUXOS
MVC
Modelo 4 Camadas
Modelo 4 Camadas
CLIENTE
(APRESENTAÇÃO)
NAVEGADOR WEB
CLIENTE
PERSISTÊNCIA
SGDB
SERVIDOR
GERENCIA DE
APRESENTAÇÃO
NEGÓCIO
SERVIDOR WEB
CLIENTE - SERVIDOR CLIENTE - SERVIDOR
SERVIDOR
APLICAÇÃO
EJB in
MVC
V
C
M
J2EE - 4 TIER