Java II
Sérgio Luiz Ruivace Cerqueira sergioruivace@gmail.com
JavaServerPages Standad Tag
Library (JSTL)
Tag Library - Criação
•
Permite a criação de seus próprios tags JSP
– É tratada por uma classe Tag Handler
•
A classe Tag Handler
– Deve implementar javax.servlet.jsp.tagext.Tag
– Normalmente estende TagSupport ou BodyTagSupport
– Fica no mesmo diretório das classes Servlet
•
O arquivo descritor da Tag Library
– Arquivo XML que descreve o nome do tag, seus atributos e a sua classe Tag Handler
•
O arquivo JSP
– Importa a Tag Library (referenciando o arquivo descritor)
– Define um prefixo para o tag
Tag Library - Criação
•
Estender a classe TagSupport
•
Deve importar os seguintes pacotes
– javax.servlet.jsp.*;
– javax.servlet.jsp.tagext.*;
– java.io.*;
•
Exemplo
– Sobrescrever o método doStartTag
• Obter um JspWriter através de pageContext.getOut() • Usar o JspWriter para escrever conteúdo JSP
• Retornar SKIP_BODY
– É traduzido para Servlet junto com o JSP que o usa
Tag Library - Criação
•
Podem ser sobrescritos os seguintes métodos:
– doInitBody – método executado na inicialização da instancia
– doStartTag – método executado no momento de execução da Tag na JSP
• <les:minhaTag>
– doEndTag – método executado no final de execução da Tag na JSP
• </les:minhaTag>
•
Pode ser retornado:
– doStartTag:
• Tag.EVAL_BODY_INCLUDE: inclui tudo que está dentro da Tag, seja HTML ou outra Tag
• Tag.SKIP_BODY: ignora todo o conteúdo dentro da Tag
– doEndTag:
Tag Library - Criação
•
Descritor de uma tag library
– Arquivo XML
<!DOCTYPE taglib
PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN" "http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_2.dtd">
•
O elemento de mais alto nível deve ser taglib
•
Cada tag definido por um elemento tag deve ter
– nome: que define o nome do tag
– tagclass: que deve indicar o caminho completo para a classe Tag Handler
– info: que indica uma breve descrição
– attribute: permite definir um atributo (parâmetro) para a tag
• name: nome do atributo
• required: se é obrigatório ou não
Tag Library - Criação
Usando uma tag library
•
Importar a tag library
– Especificar o caminho para o arquivo TLD
• <%@ taglib uri="cwp-tablib.tld" prefix="cwp" %>
– Definir um prefixo para o tag library
• <%@ taglib uri="cwp-tablib.tld" prefix="cwp" %>
•
Usar os tags
– <prefix:tagname>
• O nome do tag vem do arquivo TLD • Prefixo vem da diretiva taglib
Usando uma tag library
JSTL – usando uma tag library
JSTL
•
Conjunto de TagLib disponibilizadas pela Sun/Oracle
JSTL
Área Subfunção Prefixo URI Core Suporte à variável
c http://java.sun.com/jsp/jstl/core O controle de fluxo Gestão URL Diversos XML Essência x http://java.sun.com/jsp/jstl/xml O controle de fluxo Transformação I18N Locale fmt http://java.sun.com/jsp/jstl/fmt Formatação de mensagens
Formatação de números e data
Database SQL sql http://java.sun.com/jsp/jstl/sql
Function Collection
fn http://java.sun.com/jsp/jstl/functions Manipulação de String
Core
•
set: permite atribuir um valor a uma nova variável ou a
uma já existente
•
remove: permite remover uma variável criada
•
if: permite o controle do fluxo do sistema com validação
sobre as variáveis
<c:set var="idProduto" scope="page" value="${param.id}"/> <c:set var="idProduto" scope="request">25</c:set>
<c:remove var="idProduto" scope="page"/> <c:remove var="idProduto" />
<c:if test="${!empty param.id}">
<c:set var="idProduto" value="${param.id}"/> </c:if>
Core
•
choose / when / otherwise
– permite o controle do fluxo usando o if / else if / else
<c:choose>
<c:when test="${!empty param.id}">
<c:set var="idProduto" value="${param.id}"/> </c:when>
<c:when test="${!empty param.idProduto}">
<c:set var="idProduto" value="${param.idProduto}"/> </c:when>
<c:otherwise>
<c:set var="idProduto" value="0"/> </c:otherwise>
Core
•
forEach
– permite o loop sobre uma conjunto de elementos
<table>
<c:forEach var="usuario" items="usuarios"> <tr>
<td>${usuario.nome}</td> <td>
<c:forEach var="grupo" items="usuario.grupos"> ${grupo.nome}, </c:each> </td> </tr> </c:forEach> </table>
I18N
•
message: exibe um texto obtido no arquivo de Properties a
partir da chave(key)
•
formatNumber: exibe numero a partir de uma formatação
específica
•
formatDate: exibe uma data a partir de uma formatação
específica
<h1><fmt:message key="app.titulo" /><h1>
<fm:formatNumber value="produto.valor" type="currency"/>
Servlets e JSP
•
Fazendo redirecionamento para jsp
•
Enviando atributos para o jsp
Na Servlet:
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String login= request.getParameter("login");
Usuario usuario= usuarioController.getUsuario(login); request.setAttribute("usuario", usuario);
response.sendRedirect("usuario.jsp"); }
Na JSP:
<jsp:useBean id="usuario" scope="request" class="model.Usuario"> </jsp:useBean>
Implementando o MVC
•
Definir Beans para representar dados
•
Usar Servlets para atender a requisições
– Servlet lê os parâmetros, verifica se há dados mal-formados ou faltando, etc
•
Popular os Beans
– O Servlet chama a lógica de negócio para obter os resultados. Estes resultados são colocados nos Beans
•
Armazenar os Beans em um contexto (requisição, sessão ou
servlet)
– O Servlet chama setAttribute para colocar o Bean a disposição do resto da aplicação
Implementando o MVC
•
Encaminhar a requisição para um JSP
– O Servlet indica qual é o JSP apropriado para dar sequência à requisição
•
Extrair os dados dos Beans
– A página JSP acessa o contexto necessário e usa o jsp:useBean para recuperar os Beans
– A página JSP não cria nem modifica o Bean; ele meramente extrai os dados e os apresenta
Problemas do MVC
•
O maior problema se encontra no último passo: apresentar
os resultados em uma página JSP
– jsp:useBean e jsp:getProperty
• São verbosos e difíceis de usar
• Não podem acessar sub-propriedades dos Beans
– Elementos de scripting do JSP
• Pode gerar código difícil de manter
Problemas do MVC
•
Objetivos da Expression Language
– Sintaxe mais concisa, sucinta e legível
– Habilidade para se acessar sub-propriedades
Vantagens da Expression Language
•
Acesso conciso a objetos armazenados
– Para mostrar o valor de um objeto armazenado em um contexto basta usar ${nome-variavel}
•
Notação simplificada
•
Acesso simplificado para coleção de objetos
– ${variavel[indice]}
Vantagens da Expression Language
•
Conjunto pequeno de operadores
•
Conversão de tipos automática
•
Valore vazios em vez de mensagens de erro
– NullPointerException mostra um valor vazio em vez de lançar uma exceção
Ativando a Expression Language
•
Suportada apenas em servidores que apóiam o JSP 2.1 ou
mais novo
Chamando a Expression Language
•
Forma básica: ${expressao}
•
Uma expressão EL pode aparecer tanto no meio do código
Usando somente EL
•
Para não permitir o uso de scripting de JSP, basta alterar o
arquivo web.xml
Desvantagens de desabilitar os scripts
•
Dificuldade de se depurar
•
Não é possível redirecionar
•
Não é porque se deve evitar o uso de scriptlets que se deve
EL – acessando variáveis
•
${nome-variavel}
– Procura nos seguintes contextos: PageContext,
HttpServletRequest, HttpSession e ServletContext, nesta ordem
•
Formas equivalentes
– ${nome}
<%= pageContext.findAttribute("nome") %>
<jsp:useBean id="nome" type="umPacote.UmaClasse" scope="..."> ... <%= nome %>
EL – acessando propriedades de um Bean
•
${nomeVariavel.nomePropriedade}
•
Formas equivalentes
– ${cliente.primeiroNome} <%@ page import="coreservlets.NomeBean" %> <%NomeBean pessoa = (NomeBean)pageContext.findAttribute("cliente"); %>
EL – notação com ponto ou como array
•
São notações equivalentes
– ${nomeVariavel.nomePropriedade}
EL – acessando coleções
•
${nomeAtributo[nomeIndice]}
•
Funciona como
– Array: umArray[indice] – List: umaLista.get(indice) – Map: umMapa.get(indice)EL – referenciando objetos implícitos
•
pageContext
– ${pageContext.session.id}•
Parâmetros de request
– ${param.custID}•
Headers de request
– ${header.Accept}•
Cookies
– ${cookie.userCookie.value}EL – exemplo de referência a objetos
implícitos
EL – exemplo de referência a objetos
implícitos
EL – operadores
•
Aritméticos
– + - * / %
•
Relacionais
– == igualdade; != negação
– < menor que; > maior que
– <= menor ou igual; >= maior ou igual
•
Lógicos
– && and
– || or
EL – condicionais
•
${ teste ? expressao1 : expressao2 }
– Avalia teste
• Se verdadeiro, executa expressao1 • Caso contrário expressao2