Linguagem de Expressão, JSTL
e DisplayTag
Linguagem de Expressão, JSTL
e DisplayTag
Fornece tags para encapsular funcionalidades complexas para utilização em JSPs
Motivação p/ utilização de Tags Customizadas
Motivação p/ utilização de Tags Customizadas
Facilita o desenvolvimento de futuras páginas JSP e
permite o reuso de código
Pois, páginas com excesso de scriptlets dificultam a sua leitura, manutenção e expansão
Facilitam a divisão de tarefas
Possuem sintaxe similar a linguagem XML Podem substituir scriptlets e JavaBeans
Características
Características
Pode ser parametrizada com a utilização de atributos
Pode acessar todos os objetos disponíveis em uma página JSP
Pode modificar a resposta da página que a chamou Você pode criar e iniciar componentes JavaBeans
Como Utilizar as Taglibs
Tipos de Tag
Tipos de Tag
São expressas utilizando sintaxe XML
Uma tag sem corpo pode ser expressa da seguinte maneira
<tlt:tag> body </tlt:tag>
Importando uma biblioteca de tags
Importando uma biblioteca de tags
Utilize a diretiva taglib
<%@ taglib uri=”” prefix=”” %>
uri –especifica a localização do TLD (Tag Lib
Descriptor)
prefix – é uma string que é utilizada unicamente
para identificar as tags personalizadas que vc deseja utilizar
TLD (Tag Lib Descriptor)
TLD (Tag Lib Descriptor)
É um arquivo XML que descreve o mapeamento entre as tags Há duas maneiras básicas de especificar esse mapeamento. URL relativo
<%@ taglib uri=”/WEB-INF/c.tld” prefix=”c” %>
URL absoluto <%@ taglib uri=”http://java.sun.com/jstl/core” prefix=”c” %> <?xml version="1.0" ?> ... <taglib> <tlib-version>1.0</tlib-version> ... <uri>http://java.sun.com/jstl/core</uri> ... </taglib>
A página tem que usar exatamente esta URI)
JSTL
(JSP Standard Tag Libraries)
JSTL
Visão Geral do JSTL
Visão Geral do JSTL
Linguagem de Expressão (EL) Biblioteca de Tags
Core Format SQL
Linguagem de Expressão
Linguagem de Expressão
Permite embutir em atributos expressões dentro de delimitadores ${...} facilitando o acesso a
atributos, propriedades e métodos. Exemplos
<%=((Usuario)request.getAttribute("usuario")).
getGrupo().getNome()%>
Corresponde a: ${usuario.grupo.nome}
<jsp:getProperty name=“usuario” property=“nome” />
Resolução de Identificadores
Resolução de Identificadores
A EL transforma identificadores em objetos fazendo uma chamada ao método
PageContext.findAttribute(String id) que
procura o atributo id nos quatros escopos JSP: page, request, session e application,
respectivamente, e retorna um objeto associado ao identificador ou null, caso não seja encontrado
Objetos implícitos fornecidos pelas EL
Objetos implícitos fornecidos pelas EL
Além de acesso a JavaBean, a EL também facilitam a leitura de
parâmetros de requisição, cabeçalhos HTTP, cookies e parâmetros de inicialização
Os objetos implícitos têm precedência sobre as variáveis (objetos) de escopo
param: acessa parâmetros de request. Exemplo campo login de
um formulário:
<%= request.getParameter("login") %>
${param.login} ou ${param[‘login‘]}
paramValues: quando o parâmetro tiver múltiplos valores. Ex: ${paramValues[‘perfies‘][0]}
Objetos implícitos fornecidos pelas EL
Objetos implícitos fornecidos pelas EL
initParam: parametros de inicialização fornecidos
no arquivo web.xml Ex: ${initParam.localizacao} equivale a: pageContext.getServletContext(). getInitParameter(“localizacao”) <?xml version="1.0" encoding="UTF-8"?> <web-app ...> <context-param>
<param-name>localizacao</param-name> <param-value>pt_BR</param-value>
</context-param> . . .
Objetos implícitos fornecidos pelas EL
Objetos implícitos fornecidos pelas EL
header : acessa os atributos do cabeçalho HTTP. headerValues: para cabeçalhos de múltiplos
valores
Ex: ${header.host} ou ${header[‘host‘]}
Objetos implícitos fornecidos pelas EL
Objetos implícitos fornecidos pelas EL
pageContext: Mesmo objeto pageContext do JSP
Exemplo: ${pageContext}
pageScope, requestScope, sessionScope,
applicationScope: acessa objetos em um contexto
específico
Ex: ${requestScope.funcionario} ${sessionScope.funcionario}
cookies: retorna um cookie a partir do seu nome Ex: ${cookie.favorito}
Operadores
Operadores
A EL fornece operadores aritméticos, lógicos e relacionais
Aritméticos: +, -, *, / (div), % (mod)
Lógicos: && (and), ||(or), !(not), empty
Relacionais: == (eq), != (ne), < (lt), > (gt) <= (le),
>= (ge)
Exemplos: ${10 % 3} produz 1
${-produto.preco} resultado -50
OBS: operador empty determina se um valor é nulo ou vazio. A operação empty obj retorne true caso obj seja null
Também retorna true para: uma string vazia, um array vazio, ou um objeto que implemete Map ou List e esteja vazio
JSTL
JSTL
JSTL
JSTL
É uma especificação do JCP (JSR-52) e faz parte do JSP 2.0 e do J2EE 1.4
É composta de quatro taglibs (Core, Format, XML e SQL)
Suporta linguagem de expressão (EL)
Oferece mais controle ao autor de páginas sem necessariamente aumentar a complexidade
Estimula a separação da apresentação e lógica Estimula o investimento em soluções MVC
Histórico
Histórico
Julho/2001 - Criado o projeto (JSR-052)
Junho/2002 – lançado o JSTL 1.0 baseado no JSP 1.2 (Tomcat4 e maioria dos servidores corporativos)
Janeiro/2004 - lançado o JSTL 1.1 baseado no JSP 2.0 (Tomcat 5)
JSTL
JSTL
Core (núcleo): Contém tags usadas para controle de fluxo e saída de mensagens
XML: Tags utilitárias para o processamento de XML
Format (Internacionalização): usadas para
formatação de texto, valores monetários e números com base em uma determinada localização
SQL: fornece tags para acesso a banco de maneira simplificada sem a necessidade de código Java
JSTL - Core
JSTL - Core
<c:out>: avalia uma expressão e exibe o resultado na página
<c:out value="${usuario.nome}"> Usuário Anônimo
</c:out>
Será exibido apenas quando o value for vazio ou null
É equivalente a:
<c:out value="${usuario.nome}"
default="Usuário Anônimo“ />
<c:out value=”” escapeXml=”false”> Usuario <i>anônimo</i>.
</c:out>
Atributo opcional, indica se caracteres
especiais (<, &, ...) devem ser convertidos para entidades XML equivalentes (<,
JSTL - Core
JSTL - Core
<c:set>: define o valor de uma variável de escopo
ou uma propriedade
<c:set var="usuario" scope="page"
value="${sessionScope.usuarioLogado}"/> Valor default
É usado para nome de variáveis de escopo
<c:set target="${usuario}"
property="nome" value="Maria" />
property e value correspondem a nome/valor da propriedade
JSTL - Core
JSTL - Core
Exemplos:
<c:set var="nome" value="Maria"/>
Variável nome: <c:out value="${nome}"/>
<c:set target="${usuario}" property="nome"
value="${nome}"/>
Propriedade nome do objeto usuário:
JSTL - Core
JSTL - Core
<c:remove>: remove uma variável de escopo
Não possui corpo Atributos
var – variável a ser removida
scope – escopo (opcional) da variável
<c:remove var="usuario"/>
Antes da remoção: <c:out value="${usuario}"/> <c:remove var="usuario"/>
<c:out value="${usuario}" escapeXml="false">
Variável <i>usuario</i> foi removida do escopo! </c:out>
JSTL - Core
JSTL - Core
<c:catch>: captura uma exceção ocorrida no corpo da tag
<c:catch var="excecao">
<c:set target="${usuario}" property="NOME" value="Joao" />
</c:catch>
<c:out value="${excecao}" > tudo ok!
JSTL - Core
JSTL - Core
<c:if>: executa o corpo da tag apenas se uma expressão for verdadeira
<c:if test="${empty sessionScope.usuarioLogado}"> <c:redirect url="login.jsp"/>
JSTL - Core
JSTL - Core
<c:choose>
<c:when test="${empty usuario.username}"> <b>Campo login é obrigatório!<br>
</c:when>
<c:when test="${empty usuario.senha}"> <b>Campo senha é obrigatório!<br>
</c:when>
<c:when test="${usuario.senha ne usuario.username}"> <b>Senha inválida!<br>
</c:when>
<c:otherwise>
<c:set var="usuarioLogado" scope="session"
value="${usuario}"/>
<c:redirect url="index.jsp"/>
</c:otherwise> </c:choose>
<c:chose>: executa uma tag quando a expressão da subtag for verdadeira
JSTL - Core
JSTL - Core
forEach - é usada para percorrer uma coleção de objetos ou uma faixa de valores
<c:forEach var="item" items="${colecao}"> ...
<c:out value="${item}" />
</c:forEach>
Opcionalmente, pode-se utilizar os atributos begin
e end (para definir o índice do primeiro) e step
para definir o intervalo da interação
<c:forEach var="i" begin="1" end="10"> <li> ${i}
JSTL - Core
JSTL - Core
c:param – serve para passar nome e o valor de um
parâmetro. É uma sub-tag das demais tags de manipulação de URL (<c:url>, <c:import> e <c:redirect>)
Atributos
name – nome do parâmetro
JSTL - Core
JSTL - Core
c:url – cria uma string contendo uma URL c:import – importa o conteúdo de uma URL
c:redirect – redireciona o cliente da aplicação
JSTL – Core (<c:import>
JSTL – Core (<c:import>
Importa o conteúdo de uma URL
Tem um comportamento semelhante a <jsp:include> e possibilita adicionar recursos localizados fora do container web
O resultado será exibido na tela ou atribuído a uma variável definida pelos atributos opcionais (var e scope) ou a um java.io.Reader (atributo varReader)
Exemplo:
<c:import
JSTL – Format
JSTL – Format
Fornece suporte:
internacionalização (i18n, internationalization – ‘i‘ + 18 letras + ‘n‘)
Fornece tags para internacionalização de mensagens através de resource bundles
Formatação
Formata números, datas e horas de acordo com a localização (i10n – localization) do usuário
JSTL – Format
(fmt:formatNumber)JSTL – Format
(fmt:formatNumber)Formata um número, valor monetário ou porcentagem, de acordo com as preferências de localização
Atributos
value – valor a ser formatado (pode ser o corpo da tag) type (opcional) – “number” (default), “currency” ou
“percent”
pattern (opcional) mascara de formatação, de acordo com as regras de java.text.DecimalFormat
currencySymbol (opcional)– símbolo monetário (como R$ ou US$)
JSTL – Format
(fmt:formatNumber)
JSTL – Format
(
fmt:formatNumber
)
groupingUsed – determina se os dígitos serão agrupados (ex: 5.350 em vez de 5350). A formatação é determinada pelo LocalemaxIntegerDigits/minIntegerDigits – números mínimos e máximos da parte inteira
maxFractionDigits/minFractionDigits – números mínimos e máximos de casas decimais
var – variável (opcional) que conterá a saída scope - (opcional) escopo da variável
JSTL – Format
(fmt:formatNumber)
JSTL – Format
(
fmt:formatNumber
)
<fmt:formatNumber value="9876543,21" type="currency"/>
<fmt:formatNumber value="12,3" pattern=".000"/>
<fmt:formatNumber value="123456,7891" pattern="#,#00.0#"/>
<fmt:formatNumber value="1234" type="currency“
var=“moeda"/> ${moeda} <fmt:formatNumber minFractionDigits="5“ maxFractionDigits="5"> <%=Math.PI%> </fmt:formatNumber> R$ 1.234.567,89 12,300 123.456,79 R$ 1.234,00 3,14159
JSTL – Format
<fmt:parseNumber>JSTL – Format
<fmt:parseNumber>Obtém um Number a partir de uma String value – valor a ser transformado
integerOnly (opcional) faz o parsing apenas da
parte inteira do número
Outros atributos opcionais: var, scope, type e pattern
Corpo da Tag: atributo value
<c:set var="reais" value="R$ 8,90"/>
<fmt:parseNumber value="${reais}"
type="currency"
JSTL – Format
<fmt:formatDate>JSTL – Format
<fmt:formatDate>Formata uma data e/ou hora de acordo com a Localização ou com parâmetros customizados Atributos:
value: data a ser formatada
Type (opcional): date (default), time ou both
dateStyle ou timeStyle (opcional) : nível de
detalhamento da data/hora
timeZone (opcional): define o fuso-horário
JSTL – Format
<fmt:formatDate>JSTL – Format
<fmt:formatDate><jsp:useBean id="agora" class="java.util.Date" />
<br>
<fmt:formatDate value="${agora}"
timeStyle="long"
dateStyle="long"/> <br>
JSTL – Format
<fmt:parseDate>JSTL – Format
<fmt:parseDate>Obtém um java.util.Date a partir de uma String Atributos
value: String que será transformada
type: (opcional) date (default), time ou both dateStyle ou timeStyle : (opcional) nível de
detalhamento da data/hora
timeZone: (opcional) define o fuso-horário
parseLocale: Locale usado para personalizar a
transformação
JSTL – Format
<fmt:parseDate>JSTL – Format
<fmt:parseDate><fmt:parseDate value="13:15" pattern="HH:mm" />
<%-- para o formato americano --%>
<fmt:parseDate value="07/16/2005"
dateStyle="short"
parseLocale="en_US"
var="dataUS" />
<%-- data formatada --%>
<fmt:formatDate value="${dataUS}" dateStyle="full"/>
Thu Jan 01 13:15:00 BRT 1970 Sábado, 16 de Julho de 2005
Display Tag Library
Display Tag Library
É uma suíte open source de tags customizadas que fornecem uma apresentação web de alto nível para ser usada em aplicações MVC
É possível mostrar tabelas, isto é, listar as
informações de objetos de uma aplicação com diversas funcionalidades:
diferenciação nas cores das linhas, ordenação nas colunas, paginação dos dados, agrupamento de
informações, exportação dos dados, links e decoração customizável
Exemplo
Exemplo
<%@ taglib uri="/WEB-INF/displaytag-11.tld" prefix="display" %>
...
<% List teste = new ArrayList( 4 ); teste.add( "Teste String 1" ); teste.add( "Teste String 2" ); teste.add( "Teste String 3" ); teste.add( "Teste String 4" );
request.setAttribute("teste", teste); %>
<display:table name="teste" /> Teste String 1Teste String 2
Teste String 3 Teste String 4
Instalação
Instalação
Deve seguir os seguintes passos:
Colocar o arquivo displaytag.tld no diretório
WEB-INF da aplicação
Colocar o displaytag.jar no WEB-INF/LIB
Adicionar no CLASSPATH da aplicação as seguintes bibliotecas usadas pela DisplayTag:
commons-logging.jar
commons-lang.jar (versão 2.0) commons-collections.jar
commons-beanutils.jar log4j.jar
<display:table>
<display:table>
Gera um tabela html baseada em uma coleção de objetos Cada item é formatado de acordo com a tag column aninhada dentro dela
<display:table name="listPessoas">
<display:column property="id" title="ID" /> <display:column property="name" />
<display:column property="email" /> <display:column property="status" /> <display:column property="description"
title="Commentários"/>
</display:table>
Tags table e column
Tags table e column
O valor mostrado será o resultado da propriedade (atributo property) ou de um decorator (se houver um).
<% List produtos = new ListaProdutos();
request.setAttribute("produtos", produtos); %>
<display:table name="produtos">
<display:column property="nome" title="Nome"/>
<display:column property="preco" title="Preço"/>
</display:table> Nome Preço Feijão 2.5 Arroz 4.0 Farinha 3.5 Trigo 5.8 Açucar 1.5
setProperty
setProperty
Deve ser colocada dentro de uma tag table, serve para setar uma determinada propriedade para a
tabela
Como alternativa pode-se criar um arquivo de propriedades para toda a aplicação
As propriedades e os valores possíveis estão em http://displaytag.sourceforge.net/configuration.html
<display:table name="produtos">
<display:column property="nome"/> <display:column property="preco"/> <display:setProperty Feijão 2.5 Arroz 4.0 Farinha 3.5 Trigo 5.8 Açúcar 1.5
indicamos que a tabela gerada não deve mostrar a linha de título, onde
footer
footer
Também deve estar dentro da tag table, ela irá fornecer um rodapé customizado para a tabela
<%
ListaProdutos produtos = new ListaProdutos(); request.setAttribute("produtos", produtos); %>
<display:table name="produtos">
<display:column property="nome" title="Nome"/> <display:column property="preco" title="Preço"/> <display:footer> <tr> <td>total:</td> <td><%= produtos.getTotal() %></td> </tr> </display:footer> </display:table>
Criando objeto implícito na tabela
Criando objeto implícito na tabela
É possível criar um objeto implicitamente na tabela ou no escopo da página usando o atributo 'id'
<display:table name="produtos" id="prod">
<display:column title="Produto" property="nome" />
<display:column title="Preço" property="preco" />
<display:column title="Desconto 10%">
${prod.preco * 0.9} </display:column>
</display:table> Produto Preço Desc. 10%
Feijão 2.5 2.25 Arroz 4.0 3.6 Farinha 3.5 3.15 Trigo 5.8 5.22 Açúcar 1.5 1.35
Links Dinâmicos
Links Dinâmicos
Para criar links dinâmicos podemos usar duas formas
diferentes. Uma forma é definir as propriedades na tag column e a outra é usando o Decorator
1ª Forma: a tag column tem cinco atributos que podem ser setados para criar o link dinâmico:
href - a URL usada para construir o link
paramID - o nome do parâmetro que será adicionado a URL paramName - nome do bean que contem o dado que será
colocado na URL
paramProperty - a propriedade chamada no objeto que
Links Dinâmicos
Links Dinâmicos
<display:table name="produtos">
<display:column property="id" href="details.jsp"
paramId="id" paramProperty="id" /> <display:column property="nome" title="Produto" /> <display:column property="preco" title="Preço" /> </display:table>
Ordenação
Usando Decorator para transformar dados
Usando Decorator para transformar dados
Um decorator é um design pattern onde um objeto fornece funcionalidades básicas encapsuladas para outros objetos
Ajuda a formatar datas, valores monetários,
Usando Decorator para transformar dados
Usando Decorator para transformar dados
Para criar uma classe wrapper que atue como um Decorator, 4 pontos devem ser observados:
O wrapper criado deve ser subclasse de TableDecorator
Para aumentar a performance, deve-ser criar os formatters no método construtor
Não é preciso fazer overload de todos os métodos no Decorator, somente daquele que serão formatados. o método getXXX do Decorator sempre será chamado primeiro para uma property, mas se ele não existir, é chamado o método da classe de negócio
Usando Decorator para transformar dados
Usando Decorator para transformar dados
<display:table name="produtos"> <display:column property="id"
href="details.jsp" paramId="id" paramProperty="id" /> <display:column property="nome" title="Produto" />
<display:column property="preco" title="Preço" /> <display:column property="dataValidade"
title="Validade"
decorator="util.decorator.FormatoDataMedium" /> </display:table>
public class FormatoDataMedium implements ColumnDecorator {
public final String decorate(Object columnValue) {
String retorno = " - ";
Format formataData = DateFormat.getDateInstance(
DateFormat.SHORT); if(columnValue != null){
Date date = (Date) columnValue;
retorno = formataData.format(date); }
Bibliografia
Bibliografia
SCWCD Exam Study Kit – Java Web Component Developer
Certification. Autores: Hanumant Deshmukh, Jignesh Malavia, Jacquelyn Carter, 2003