Java Server Pages (JSPs) Carlos Bazilio Depto de Ciência e Tecnologia Pólo Universitário de Rio das Ostras Universidade Federal Fluminense JSPs (JavaServer Pages) • São uma maneira mais confortável (comparado aos servlets) de se criar páginas web dinâmicas • Aparentemente, podem ser encaradas como o oposto de servlets: servlets são classes Java gerando html, enquanto jsps são htmls com trechos de código Java • Tecnicamente, são equivalentes: jsps são traduzidos pelo contêiner web em servlets equivalentes 2 JSP (JavaServer Page) • Referência: “http://java.sun.com/javaee/5/docs/api/java x/servlet/jsp/package-summary.html” 3 JSP - Exemplo <html> <head> <title>JSP Básico</title> </head> <body> <h1>Um exemplo básico</h1> <% for (int i=1; i<7; i++) { out.println("<h" + i + ">Heading " + i + "</h" + i + ">"); } %> </body> </html> 4 JSP – Exercício 6 • Copie o arquivo .jsp do exemplo para dentro do diretório de sua aplicação no Tomcat; • Chame a página digitando a url correspondente no browser: http://localhost:8080/<diretorio_aplicacao> /<arquivo>.jsp 5 JSP – Exercício 6 • De forma a simplificar a manutenção, supondo que os exercícios feitos até então compõe uma aplicação web, defina um servlet que receberá e tratará as requisições enviadas pelo cliente. 6 JSP – Ciclo de Vida • Podemos observar que, numa primeira chamada da página JSP, o browser demora um pouco para apresentar a resposta; • Isto ocorre pois a página JSP precisa ser interpretada; • Naturalmente, em chamadas sucessivas, o servlet não precisa ser gerado e o browser apresenta a resposta recebida mais rapidamente 7 JSP – Processo de Compilação • Solicitação para um JSP é recebida pelo contêiner • Existem compilações de servlet com um registro de data/hora posterior ao JSP de origem? – Se não, o contêiner traduz o JSP para um servlet Java equivalente, compila o arquivo e instancia o servlet; • O contêiner invoca jsp_service() para executar o servlet; • A resposta é enviada ao cliente. 8 JSP – Ciclo de Vida 9 JSP – Servlet Gerado • No Tomcat, o código do servlet gerado pode ser encontrado no diretório <tomcat>/work; • Do código gerado, podemos observar que a classe <arquivo>_jsp não herda de HttpServlet, mas sim de uma especialização do fabricante; • O método _jspService() equivale ao método service() visto anteriormente; • Ele representa o conteúdo da JSP traduzido 10 JSP – Tipos de Tags • Além das tags HTML, as seguintes tags podem ocorrer numa página JSP: <% ... %> Tag de inserção de código Java <% int v = (int) (Math.random() * 10); %> <%= ... %> Tag que gera o valor de uma expressão para ser exibido <%= (Math.random() * 10) %> <%! ... %> Tag de declaração. As declarações podem ser de variáveis instância ou métodos do servlet <%! int v = (Math.random() * 10); %> <%@ ... %> Tags para definição de diretivas: include, page e taglib <%@ include file="formBasico.html" %> 11 JSP - Comentários <!-- ... --> Comentário copiado para a saída <%! // ... %> <%! /* ... */ %> <%! /** ... */ %> Comentários copiados para o código do servlet gerado <% // ... %> e variantes acima <%-- ... --%> Comentário JSP. Não é copiado nem para a saída, nem para o servlet. 12 JSP – Exercício 7 • Crie uma página JSP para exibir a saída abaixo. Para tal declare uma variável que irá conter uma lista de valores a serem copiados para a saída do usuário. 13 JSP – Variáveis PréDefinidas • Auxiliam na criação de páginas JSP; • São usualmente chamadas de objetos implícitos, pois podemos utilizá-las sem declará-las; • Podemos encontrar estas declarações no início do método _jspService() (método do servlet gerado à partir de uma JSP). 14 JSP – Variáveis PréDefinidas application Implementa a interface javax.servlet.ServletContext. Corresponde ao escopo de aplicação. config É um objeto da classe ServletConfig. Ou seja, permite acessar parâmetros como os de inicialização do servlet. out Envia dados de saída de volta para o usuário. É utilizado apenas dentro de scriptlets. pageContext Oferece métodos para recuperação dos outros objetos implícitos. request Permite a obtenção de informações sobre o request. response session Permite a configuração de saída para o usuário. Fornece métodos para a manipulação de sessões. 15 JSP – Exemplo com Variáveis Pré-definidas <html><head><title>Basicão JSP</title></head> <body> <% String acessou = “sim”; session.setAttribute("statusBasicao", acessou); %> </body> </html> … <html><head><title>Outro JSP</title></head> <body> <% if ((session.getAttribute("statusBasicao") != null) && (session.getAttribute("statusBasicao").equals(“sim”)) out.println(session.getAttribute("statusBasicao")); else out.println("Basicao não executado"); %> </body> </html> 16 Diretivas JSP – Exercício 8 • Mostre, numa página JSP, o valor do contador criado num servlet anteriormente. Para tal, o contador deve ter sido criado como atributo. 17 JSP - Diretivas • São tags que fornecem ao contêiner informações sobre uma página JSP; • Como citamos no slide Tipos de Tags, JSP possui 3 tipos de diretivas: – include – page – taglib • As diretivas include têm a seguinte sintaxe: <%@ include file="<url_arquivo_incluido>" %> 18 JSP – Exemplo de diretivas <%@ page contentType="text/html;charset=ISO-8859-1" errorPage="paginaerro.jsp" %> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <html> <head> <title>Basicao JSP</title> </head> <body> <%@ include file=“saudacoes.html”%> <h1>Um exemplo basico</h1> <c:set var="indices" value="1, 2, 3, 4, 5" scope="page"/> <c:forEach items="${indices}" var="indice" varStatus="status"> <c:out value="<h${status.count}> Heading ${status.count} </h${status.count}>" /> </c:forEach> </body> </html> 19 JSP – Diretiva include • Arquivos incluídos também podem ser páginas JSP; • Esta construção tem o inconveniente de, no caso de alteração de um arquivo incluído, os arquivos que o incluem precisam ter suas datas/horas modificadas para que a alteração seja refletida; • Esse inconveniente é resolvido pela ação <jsp:include /> (vista adiante) que resolve os elos de inclusão dinamicamente. 20 JSP – Diretiva page • Permite configurar propriedades de uma JSP; • Estas propriedades são fornecidas como atributos (XML) da tag page; 21 JSP – Diretiva page Alguns Atributos Atributo Valor Descrição Valor Default autoFlush true/false Define o comportamento quando o buffer está cheio. Esvazia automaticamente ou gera uma exceção quando o buffer estoura true buffer none/n KB Configura o tamanho do buffer 8 KB de saída contentType tipo MIME Configura o tipo MIME errorPage URL relativo Configura a JSP de erro import Classes e interfaces a importar Permite importação de pacotes Java padrão text/html; charset=ISO8859-1 22 JSP – Diretiva page Atributo Valor Descrição Valor Default isErrorPage true/false Indica se a página receberá exceções de outras páginas isThreadSafe true/false session true/false Determina se o servlet true gerado implementa a interface SingleThreadModel Indica se a página atual true precisa de informações de sessão false 23 JSP – Exemplo de diretivas <%@ page contentType="text/html;charset=ISO-8859-1" errorPage="erro.jsp" %> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <html> <head> <title>Basicao JSP</title> </head> <body> <%@ include file=“saudacoes.html”%> <h1>Um exemplo basico</h1> <c:set var="indices" value="1, 2, 3, 4, 5" scope="page"/> <c:forEach items="${indices}" var="indice" varStatus="status"> <c:out value="<h${status.count}> Heading ${status.count} </h${status.count}>" /> </c:forEach> </body> </html> 24 JSP – Diretiva page • A combinação das diretivas include e page permite, por exemplo, o compartilhamento de recursos (cabeçalhos, rodapés, etc) numa aplicação; • Pacotes comuns podem ser importados numa única página JSP, e incluída por outras. 25 JSP – Diretiva taglib • Mecanismo de extensão de tags; • Ou seja, permite a utilização de tags além das pré-definidas (declaração, expressão, scriptlet e diretiva); • Assim, podemos utilizar tags definidas por terceiros ou suas próprias tags personalizadas; • JSTL é uma biblioteca de tags que implementa tarefas comuns e bem conhecidas, como iterações e condicionais; Visa minimizar o uso de código Java mesclado com código Html; 26 JSP – Exemplo de diretivas <%@ page contentType="text/html;charset=ISO-8859-1" errorPage="paginaerro.jsp" %> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <html> <head> <title>Basicao JSP</title> </head> <body> <%@ include file=“saudacoes.html”%> <h1>Um exemplo basico</h1> <c:set var="indices" value="1, 2, 3, 4, 5" scope="page"/> <c:forEach items="${indices}" var="indice" varStatus="status"> <c:out value="<h${status.count}> Heading ${status.count} </h${status.count}>" /> </c:forEach> 27 </body> </html> Diretivas JSP – Exercício 9 • Implemente o exemplo de uso de diretivas apresentado. Para tal, copie a biblioteca de JSTL (jstl.jar e standard.jar) para dentro de um dos diretórios abaixo: – <tomcat5>\commom\lib – <tomcat6>\lib – <app>\WEB-INF\lib 28 JSP – EL (Expression Language) • • • • • • Outro recurso para especificação de páginas JSP; Possui um conjunto de objetos implícitos próprio; Contém conjunto abrangente de operadores; Oferece acesso a coleções e propriedades aninhadas; Sintaxe básica: ${ expressão em EL } Pode ser utilizada tanto dentro de atributos de tags da JSTL, quanto diretamente dentro de páginas; • Exemplos: <p>1 é menor que 2: ${1<2}</p> <p>6 é maior que 7: ${6 gt 7}</p> <p>${cursos[‘petrobras’]}</p> <p>${cursos.petrobras}</p> <p>${applicationScope.statusBasicao}</p> // Idem para sessionScope, requestScope, pageScope, param e paramValues 29 JSP - EL • Especificação nova no JSP 2.0; • Ou seja, não compatíveis com versões de contêineres que não suportam esta versão; • Mecanismo de extensão através de métodos estáticos (visto à seguir); • Através do web.xml podemos desativá-la: <jsp-property-group> <url-pattern>*.jsp</url-pattern> <el-ignored>true</el-ignored> </jsp-property-group> 30 JSP – Ações Padrão • Tags especiais disponíveis para uso em páginas JSP; 31 JSP – Ações Padrão <jsp:forward page=”URL” /> Permite o encaminhamento de uma solicitação para outro recurso dentro da mesma aplicação Web (diferente de redirecionamento). A página que encaminha não pode gerar nenhuma saída para o browser. <jsp:include page=”URL” flush=”true/false” /> Permite a inclusão de recursos que são tratados dinamicamente (oposto da diretiva include). O atributo page indica a página a ser incluída, enquanto que o atributo flush indica se algum conteúdo no buffer antes da inclusão deve ser enviado ou não. <jsp:useBean class=”CLASSE” Permite o uso de JavaBeans dentro de uma JSP id=”IDENT” (classe Java comum, com construtor default e scope=”ESCOPO” /> métodos get e set para atributos) <jsp:getProperty name=”IDENT” property=”NOME_PROP”/> É utilizado para acessar propriedades dentro de um Bean. 32 JSP – Ações Padrão <jsp:setProperty É utilizado para configurar propriedades de um Bean. name=”IDENT” property=”NOME_PROP” value=”VALOR” /> <jsp:plugin type=”applet” code=”.CLASS” width=”VALOR” height=”VALOR” /> Permite a execução de um plugin, com possibilidade de instalação caso o navegador não o possua. <jsp:params /> Conjunto de parâmetros a ser passado para um plugin. <jsp:param name=”NOME” value=”VALOR” /> Formato de um parâmetro. Pode ser passado para um forward, um include ou dentro da tag params. <jsp:fallback /> Mensagem a ser exibida quando um navegador não entende o código HTML gerado para o plugin. 33 JSP – JavaBeans <% CarroCompras carro = (CarroCompras)session.getAttribute("carrinho"); // Se o usuário não possui carro de compras if (carro == null) { carro = new CarroCompras(); session.setAttribute("carrinho", carro); } %> <jsp:useBean id="carro" class=“pkg.CarroCompras" scope="session"/> 34 JSP – JavaBeans • Abordagem de desenvolvimento de componentes para JSP; • Encapsulam a lógica do negócio; • Exemplos de uso: – Acesso a dados de várias origens; – Validação de dados inseridos em formulários; • Possui as vantagens do desenvolvimento baseado em componentes; • Simplifica as páginas JSP através, por exemplo, da substituição de scriptlets de criação de objetos por tags de manipulação de beans (jsp:useBean, jsp:setProperty e jsp:getProperty); 35 JSP – JavaBeans • Aumento sensível de produção na utilização de formulários. • Um bean é uma classe Java comum que respeita algumas convenções (em JSP): – Um construtor default (sem argumentos) deve estar disponível; – Suas propriedades devem ser acessadas através de métodos get e set; – Entretanto, é possível chamar os métodos de um bean diretamente, dentro dos scriptlets; 36 JSP – JavaBeans • Observe que podemos ter uma propriedade sem termos um atributo de classe para ela; Basta oferecermos métodos get e/ou set; • Formato dos métodos: – Para uma propriedade chamada prop, poderemos ter os métodos <tipo_prop> getProp(); e void setProp(<tipo_prop>); 37 Exercício 10 • Defina uma classe como um JavaBean (construtor default e métodos get e set públicos para as propriedades) para armazenar objetos com propriedades nome e url. • Crie um arquivo .html que conterá o formulário com campos para o cadastro de favoritos. • Crie um arquivo .jsp que tratará estas requisições. Este deve utilizar as tags de manipulação de beans. • Uma lista de favoritos deve ser criada (atributo de sessão, por exemplo) e, para cada nova requisição, um novo item é inserido na lista. 38 JSTL (JavaServer Pages Standard Tag Library) • Uma biblioteca de tags visa minimizar o uso de código Java mesclado com código Html; • JSTL prove tags para 5 grupos funcionais: – – – – – Tags Básicas (iteração, desvio de fluxo, saída, ..) Tags para manipulação de documentos XML Tags para internacionalização Tags de acesso a banco de dados Tags de funções (principalmente para manipulação de strings) 39 JSTL – Classes de Tags Tipo URI Prefixo Exemplo Core http://java.sun.com/jsp/jstl/core c <c:nomedatag /> XML http://java.sun.com/jsp/jstl/xml x <x:nomedatag /> Internacionalização http://java.sun.com/jsp/jstl/fmt fmt <fmt:nomedatag /> Banco de Dados http://java.sun.com/jsp/jstl/sql sql <sql:nomedatag /> Funções http://java.sun.com/jsp/jstl/functions fn <fn:nomedatag /> 40 JSTL – Exemplo <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <html> <head>Exemplo de Uso de tags JSP</head> <body> <h1>Lista de Codinomes</h1> <table border="1"> <c:set var="nomes" value="Bazílio, Instrutor, Carlos, Fulano" scope="page"/> <tr><th>Codinome</th><th>Preferência</th></tr> <c:forEach var="codinome" items="${nomes}" varStatus="status"> <tr><td><c:out value="${codinome}"/></td> <td><c:out value="${status.count}"/></td></tr> </c:forEach> </table> 41 </body> </html> JSTL - Core • Ações Básicas Gerais – <c:out value=“expressão” /> • Semelhante a tag de expressão JSP; • O conteúdo pode ser estático ou dinâmico (composto de EL); – <c:set var=“nome_da_variável” value=“expressão” [scope=“page | request | session | application”] /> • Define uma variável com o valor da expressão fornecida em algum escopo; • O escopo default é o page; – <c:catch [var=“nome_da_exceção”] /> • Utilizada para capturar exceções geradas pelo código JSP englobado; • Estas exceções não são tratadas pelo mecanismo de página de erros de JSP. • var armazenará o conteúdo da exceção gerada. 42 JSTL - Core • Ações Básicas Condicionais – <c:if test=“condição_de_teste” [var=“nome_da_variável”] [scope=“page | request | session | application”] /> • Corresponde ao if das linguagens de programação; • Esta ação pode ter o valor do seu teste armazenado na variável var, do escopo fornecido; – <c:choose /> • Corresponde ao switch, para agrupamento de sentenças case; – <c:when test=“condição_de_teste” /> • Corresponde à uma sentença case; – <c:otherwise /> • Ação padrão a ser executada quando nenhuma ação when for tomada. 43 JSTL - Core • Ações Básicas de Iteração – <c:forEach items=“collection” [var=“nome_da_variável”] [varStatus=“nome_da_variável_status”] [begin=“início”] [end=“fim”] [step=“passo”] /> • Corresponde ao for das linguagens de programação; • Itera sobre coleções em geral; • varStatus contém informações sobre o índice numa iteração; – <c:forTokens items=“string_tokens” delims=“delimitadores” [var=“nome_da_variável”] [varStatus=“nome_da_variável_status”] [begin=“início”] [end=“fim”] [step=“passo”] /> • Análoga a classe StringTokenizer; • A string fornecida é subdividida em tokens de acordo com os delimitadores fornecidos. 44 JSTL - Core • Ações Básicas de Iteração – <c:import url=“recurso” [context=“contexto”] [var=“variável”] [scope=“escopo”] [charEncoding=“codificação”] /> • Análogo à ação padrão <jsp:include />; • Entretanto, permite a utilização de urls absolutas; ou seja, conteúdo fora da própria aplicação; – <c:param name=“nome_parâmetro” value=“valor_parâmetro” /> • Utilizado para criação de parâmetros de solicitação para URLs pelas ações c:import, c:url e c:redirect; – <c:redirect url=“recurso” [context=“contexto”]/> • Necessário quando se deseja abortar o processamento da JSP corrente; Frequentemente utilizado em situações de erro; – <c:url /> • Útil na regravação de URL com ID de sessão do cliente; • Necessário quando cookies estão desabilitados; 45 JSTL – Classes de Tags Tipo URI Prefixo Exemplo Core http://java.sun.com/jsp/jstl/core c <c:nomedatag /> XML http://java.sun.com/jsp/jstl/xml x <x:nomedatag /> Internacionalização http://java.sun.com/jsp/jstl/fmt fmt <fmt:nomedatag /> Banco de Dados http://java.sun.com/jsp/jstl/sql sql <sql:nomedatag /> Funções http://java.sun.com/jsp/jstl/functions fn <fn:nomedatag /> 46 JSTL - XML • Ações Básicas – Expressões de manipulação que utilizam a linguagem XPath; • Exemplos: • $variable : procura por um atributo chamado variable no contexto de página. Equivale a pageContext.findAttribute(“variable”) • $applicationScope$variable : procura por um atributo chamado variable no contexto de aplicação (idem para sessionScope, pageScope, requestScope e param); – <x:parse xml=“documento_XML” var=“nome_variável” [scope=“escopo”] /> • Percorre um documento XML; • Não faz validação frente a esquemas ou DTDs; • O atributo xml deverá conter uma variável, cujo conteúdo foi importado através de uma url de um xml (<c:import/>) 47 JSTL - XML • Ações Básicas – <x:out select=“expressão_xpath” [escapeXML=“{true | false}”] /> • Após a chamada da ação parse, está ação permite a extração de partes do documento XML à partir de expressões XPath; – <x:set var=“nome_variável” select=“expressão_xpath” [scope=“escopo”] /> • Permite armazenar o resultado de uma consulta XPath para futura utilização; • A variável utilizada pode ser definida em qualquer dos escopos vistos anteriormente; • Ações de Fluxo de Controle – <x:if />, <x:choose /> <x:when /> <x:otherwise /> <x:forEach /> – Similares às tags da biblioteca básica; – Atributo chamado select é utilizado sempre que referenciamos o documento XML. 48 JSTL – Exercício 11 • Escolha algum canal de informações XML (feed) de sua preferência e gera uma página similar à seguinte página: 49 JSTL – Exercício 11 • Para tal geração, é necessário os seguintes passos: – Copiar a biblioteca Xalan (XML) para ser acessível pela aplicação – Processar o XML da seguinte maneria: • • • • Escolha o canal RSS de sua preferência Importe este link para a sua aplicação: <c:import /> Processe-o como um documento XML: <x:parse /> Percorra o documento para gerar a saída: <x:forEach /> 50 JSTL • Internacionalização (I18N) – Oferece funções de internacionalização (localidade) e formatação de datas e números; • Banco de Dados – Tags para consultas a banco de dados; – Naturalmente, só devem ser utilizadas em protótipos ou aplicações simples; – Para aplicações corporativas, esses dados devem estar encapsulados em componentes JavaBeans; • Funções – Basicamente oferece funções para a manipulação de strings; 51 JSP – Mecanismo de Extensão • Incorporação de novas ações e funções que podem ser utilizadas em páginas JSP; • Permite ampliar a separação entre os papéis do programador e do webdesigner: – O programador encapsula código Java em tags e funções EL; – O webdesigner só precisa compreender a semântica de tags e funções e terá um tempo maior para implementar a apresentação; • Tipos de extensão: – Novas funções para expressões EL; – Ações personalizadas; • Ambos necessitam de 3 tarefas: – Implementação em Java da função/ação; – Criação do arquivo .tld (Tag Library Descriptor); – Atualização do descritor de implantação. 52 JSP – Extensão de Funções EL • A implementação em Java é fornecida através de um método Java public static; package helloPackage; public class ELFunctions { public static String sayHello () { return new String("Hello from EL !!"); } } 53 JSP – Extensão de Funções EL – TLD <taglib xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd" version="2.0"> <description>Hello library</description> <display-name>Hello Tags</display-name> <tlib-version>1.1</tlib-version> <short-name>h</short-name> <uri>hello_url</uri> <function> <name>SayHello</name> <function-class>helloPackage.ELFunctions</function-class> <function-signature>java.lang.String sayHello()</function-signature> 54 JSP – Extensão de Funções EL – “web.xml” <web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4"> ... <taglib> <taglib-uri>hello_url</taglib-uri> <taglib-location>/WEB-INF/hello.tld</taglib-location> </taglib> </web-app> 55 JSP – Extensão de Funções EL <%@ taglib uri="hello_url" prefix="h" %> <html> <head>Exemplo de Uso de tags JSP</head> <body> <p>${h:SayHello()}</p> </body> </html> 56 Exercício 12 • Implemente a extensão apresentada. 57 JSP – Extensão de Tags <%@ taglib uri="hello_url" prefix="h" %> <html> <head>Exemplo de Uso de tags JSP</head> <body> <p><h:tagqq quant=“5”></h:tagqq></p> </body> </html> HTML Alo mundo!!! Alo mundo!!! Alo mundo!!! Alo mundo!!! Alo mundo!!! 58 JSP – Extensão de Tags • Passos para geração do servlet: – Após o uso de uma tag <myprefix:mytag />, busca-se, à partir de myprefix, a uri correspondente na página onde a mytag é usada (diretiva taglib); – O descritor de implantação (“web.xml”) contém a associação entre a uri e o descritor da biblioteca (arquivo .tld); – O arquivo .tld contém, para cada tag, a classe que implementa essa tag; Ou seja, conterá a classe que implementa mytag. 59 JSP – Extensão de Tags – “web.xml” <web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4"> ... <taglib> <taglib-uri>hello_url</taglib-uri> <taglib-location>/WEB-INF/hello.tld</taglib-location> </taglib> </web-app> 60 JSP – Extensão de Tags • Passos para geração do servlet: – Após o uso de uma tag <myprefix:mytag />, busca-se, à partir de myprefix, a uri correspondente na página onde a mytag é usada (diretiva taglib); – O descritor de implantação (“web.xml”) contém a associação entre a uri e o descritor da biblioteca (arquivo .tld); – O arquivo .tld contém, para cada tag, a classe que implementa essa tag; Ou seja, conterá a classe que implementa mytag. 61 JSP – Extensão de Tags – TLD <taglib xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd" version="2.0"> … <short-name>h</short-name> <uri>hello_url</uri> <tag> <name>tagqq</name> <tag-class>helloPackage.TagQQ</tag-class> <body-content>empty</body-content> <attribute> JSP <name>quant</name> scriptless tagdependent <rtexprvalue>true</rtexprvalue> 62 </attribute></tag></taglib> JSP – Extensão de Tags • Para criação de tags personalizadas é preciso definir uma classe que implemente uma das interfaces, ou estenda uma das classes abaixo: 63 JSP – Extensão de Tags – Implementação package helloPackage; import java.io.IOException; import javax.servlet.jsp.tagext.TagSupport; import javax.servlet.jsp.JspException; public class TagQQ extends TagSupport { public int doStartTag () throws JspException { try { pageContext.getOut().print(“Alo mundo!!!"); } catch (IOException e) { System.out.println("Erro em TagQQ"); throw new JspException(e); } return SKIP_BODY; } } 64 JSP – Extensão de Tags – Constantes Constante Significado EVAL_BODY_INCL UDE Retornado pelo método doStartTag(), indica que o conteúdo do corpo da tag deve ser avaliado e colocado na saída. Retornado pelo método doEndTag(), indica que o restante da JSP deve ser processada. EVAL_PAGE SKIP_BODY SKIP_PAGE Os métodos doStartTag() e doAfterBody() podem retornar esse valor para indicar que o corpo deve ser pulado. Valor que pode ser retornado pelo método doEndTag() para indicar que o restante da 65 página deve ser pulado. Exercício 13 • Implemente uma biblioteca de tags que para atender aos seguintes usos numa página JSP: <mybib:add nome=“nome_da_url” url=“url”/> • Adiciona o nome e a url a um objeto, com escopo de aplicação, que guarda urls (alguma coleção, provavelmente criada por você para armazenar os pares). <mybib:link pos=“posicao”/> • Retorna um link na forma <a href=“url”>nome</a>, onde url e nome estão armazenados no objeto citado acima, na posição posicao. • Para este exercício, inclua no projeto o .jar que contém a definição das extensões de tag: (<tomcat>\common\lib\jsp-api.jar) 66 Exercício 13 • A aplicação deve implementar os tratadores de tag e criar telas para cadastro de favoritos e para a listagem destes favoritos. 67 JSP – Extensão de Tags – Simple Tags - JSP 2.0 • À partir da JSP 2.0, o desenvolvimento de tags personalizadas se tornou bem mais simples; • Basicamente, precisamos fazer 3 tarefas: – Criar um diretório chamado tags, abaixo do diretório WEB-INF (“WEB-INF/tags”), que conterá arquivos com extensão .tag para a definição das tags; – Criar arquivos .tag para cada tag a ser utilizada; estes arquivos poderão utilizar tags como JSTL e JavaBeans, mas não poderão conter scriptlets; – Uso das tags definidas, numa JSP, com a definição do parâmetro tagdir na diretiva taglib. 68 JSP – Extensão de Tags – JSP 2.0 – hello.tag <%@ tag pageEncoding="ISO-8859-1" bodycontent="empty" %> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <%@ attribute name="vezes" required="true" %> <c:forEach begin="1" end="${vezes}"> <c:out value="Alô você !!!"/> </c:forEach> 69 JSP – Extensão de Tags – JSP 2.0 – basico.jsp <%@ taglib tagdir="/WEB-INF/tags" prefix="tag2" %> <html> <head> <title>Basicao JSP</title> </head> <body> <tag2:hello vezes="3"/> </body> </html> 70