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 Usa 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 Seu código é executado quando o arquivo JSP que o usa é chamado
Tag Library - Criação exemplo
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.EVAL_PAGE: continua a execução da Página Tag.SKIP_PAGE: sai da execução da Página
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 rtexprvalue: se o valor pode ser determinado dinamicamente
Tag Library - Criação Um exemplo
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 Exemplo: <cwp:simpleprime>
Usando uma tag library Usando uma tag library
JSTL usando uma tag library O resultado da tag library
Tags, Servlets e JSPs
JSTL Conjunto de TagLib disponibilizadas pela Sun/Oracle Para uso geral nos sistemas
JSTL Área Subfunção Prefixo URI Core Suporte à variável O controle de fluxo Gestão URL Diversos c http://java.sun.com/jsp/jstl/core XML Essência O controle de fluxo Transformação x http://java.sun.com/jsp/jstl/xml I18N Locale Formatação de mensagens Formatação de números e data fmt http://java.sun.com/jsp/jstl/fmt Database SQL sql http://java.sun.com/jsp/jstl/sql Function Collection Manipulação de String fn http://java.sun.com/jsp/jstl/functions
Core set: permite atribuir um valor a uma nova variável ou a uma já existente <c:set var="idproduto" scope="page" value="${param.id}"/> <c:set var="idproduto" scope="request">25</c:set> remove: permite remover uma variável criada <c:remove var="idproduto" scope="page"/> <c:remove var="idproduto" /> if: permite o controle do fluxo do sistema com validação sobre as variáveis <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> </c:choose>
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) <h1><fmt:message key="app.titulo" /><h1> formatnumber: exibe numero a partir de uma formatação específica <fm:formatnumber value="produto.valor" type="currency"/> formatdate: exibe uma data a partir de uma formatação específica <fmt:formatdate value="produto.data" datestyle="full">
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> Olá, <jsp:getproperty name="usuario" property="nome"/>.
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
EL: Expression Language
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 Acabam com o propósito do padrão MVC
Problemas do MVC Objetivos da Expression Language Sintaxe mais concisa, sucinta e legível Habilidade para se acessar sub-propriedades Habilidade para acessar coleções
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]} Acesso sucinto a parâmetros da requisição e a cookies
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 Configurar o arquivo JSP 2.x web.xml
Chamando a Expression Language Forma básica: ${expressao} Uma expressão EL pode aparecer tanto no meio do código HTML quanto da tag JSP
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 bani-los
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 exemplo de acesso a variável
EL exemplo de acesso a variável
EL exemplo de acesso a variável
EL acessando propriedades de um Bean ${nomevariavel.nomepropriedade} Formas equivalentes ${cliente.primeironome} <%@ page import="coreservlets.nomebean" %> <% NomeBean pessoa = (NomeBean)pageContext.findAttribute("cliente"); %> <%= cliente.getprimeironome() %>
EL exemplo de acesso a Bean
EL exemplo de acesso a Bean
EL exemplo de acesso a Bean
EL exemplo de acesso a Bean
EL exemplo de acesso a Bean
EL exemplo de acesso a Bean
EL notação com ponto ou como array São notações equivalentes ${nomevariavel.nomepropriedade} ${nomevariavel["nomepropriedade"]}
EL acessando coleções ${nomeatributo[nomeindice]} Funciona como Array: umarray[indice] List: umalista.get(indice) Map: ummapa.get(indice)
EL exemplo de acesso a coleções
EL exemplo de acesso a coleções
EL exemplo de acesso a coleções
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! not
EL exemplo de operadores
EL exemplo de operadores
EL condicionais ${ teste? expressao1 : expressao2 } Avalia teste Se verdadeiro, executa expressao1 Caso contrário expressao2
EL exemplo de condicionais
EL exemplo de condicionais
EL exemplo de condicionais
EL exemplo de condicionais