JSP Mais Recursos Jobson Ronan jrjscin ufpe br
JSP – Mais Recursos Jobson Ronan {jrjs@cin. ufpe. br}
Objetivos n n n Aprender o que são Java. Beans e como podem ser usados em páginas JSPs Aprender a usar a JSTL Aprender a usar e EL
Usando beans n Java. Beans são objetos escritos de acordo com um determinado padrão que permite tratá-los como componentes de um framework ¡ ¡ n Ótimos para separar os detalhes de implementação de uma aplicação de seus “serviços” Permitem encapsular dados recebidos de outras partes da aplicação e torná-los disponíveis para alteração e leitura através de uma interface uniforme. Podem ser usados com JSP para remover grande parte do código Java de uma página JSP ¡ ¡ Maior facilidade de manutenção e depuração Separação de responsabilidade e reuso de componentes
Como incluir um bean n Para que um bean possa ser usado por uma aplicação JSP, ele deve estar compilado e localizado dentro do CLASSPATH reconhecido pelo servidor ¡ n No subdiretório WEB-INF/classes do seu contexto Para incluir: <jsp: use. Bean id="nome_da_referência“ class="pacote. Nome. Da. Classe“ scope="page|session|request|application"/> n O atributo de escopo é opcional e indica o tempo de vida do Java Bean. Se omitido, será page, que o limita à página ¡ ¡ Com escopo de request, o bean pode ser recuperado com outra instrução <jsp: use. Bean> que esteja em outra página que receber amesma requisição (via dispatcher) Com escopo de session, o bean é recuperável em páginas usadas pelo mesmo cliente, desde que <%@page> não tenha
Como incluir um bean n n O nome do bean (atributo id) comporta-se como uma referência a um objeto Java Incluir o tag <jsp: use. Bean id="bean" class="bean. Hello. Bean" scope="request" /> é o mesmo que incluir na página <% Object obj = request. get. Attribute("bean"); bean. Hello. Bean bean = null; if (obj == null) { bean = new bean. Hello. Bean(); request. set. Attribute("bean", bean); } else { bean = (bean. Hello. Bean) obj; } %> n O id pode ser usado em scriptlets para usar membros do bean <% bean. set. Valor(12); %>
Propriedades n n Java. Beans possuem propriedades que podem ser somenteleitura ou leitura-alteração. O nome da propriedade é sempre derivada do nome do método get. XXX(): public class Bean { private String mensagem; public void set. Texto(String x) { mensagem = x; } public String get. Texto() { return mensagem; } } n O bean acima tem uma propriedade (RW) chamada texto
Propriedades n Páginas JSP podem ler ou alterar propriedades de um bean usando os tags <jsp: set. Property name="bean" property="propriedade" value="valor"/> n n n que equivale a <% bean. set. Propriedade(valor); %> e <jsp: get. Property name="bean" property="propriedade"/> que equivale a <%=bean. get. Propriedade() %> Observe que o nome do bean é passado através do atributo name, que corresponde ao atributo id em <jsp: use. Bean> Valores são convertidos de e para String automaticamente Parâmetros HTTP com mesmo nome que as propriedades têm valores passados automaticamente com <jsp: set. Property>
Inicialização de beans n A tag <jsp: use. Bean> simplesmente cria um bean chamando seu construtor. Para inicializá-lo, é preciso chamar seus métodos set. XXX() ou usar <jsp: set. Property> após a definição <jsp: use. Bean id="bean" class="bean. Hello. Bean" /> <jsp: set. Property name="bean" property="prop" value="valor"/> n n Se um bean já existe, porém, geralmente não se deseja inicializá-lo. Neste caso, a inicialização pode ser feita dentro do marcador <jsp: use. Bean> e o sistema só a executará se o bean for novo (sejá existir, o código será ignorado) <jsp: use. Bean id="bean" class="bean. Hello. Bean" /> <jsp: set. Property name="bean" property="prop" value="valor"/> </jsp: use. Bean> n ou <jsp: use. Bean id="bean" class="bean. Hello. Bean" /> <% bean. set. Prop(valor); %> </jsp: use. Bean>
Condicionais e iterações n Não é possível usar beans para remover de páginas Web o código Java de expressões condicionais e iterações como for do-while e while ¡ n Para isto, não há tags padrão. É preciso usar Taglibs (JSTL) Beans, porém, podem ser usados dentro de iterações e condicionais, e ter seus valores alterados a cada repetição ou condição <jsp: use. Bean id="m. Bean" class="Message. Bean" scope="session" /> <% Message. Bean[] messages = Messages. Collection. get. All(); for (int i = messages. length -1; i >= 0; i--) { m. Bean = messages[i]; %> <tr><td><jsp: get. Property name="m. Bean" property="time"/></td> <td><%=m. Bean. get. Host()%></td> <td><%=m. Bean. get. Message()%></td></tr> <% } %> (Message. Bean tem propriedades: time, host, message)
Matando beans n Beans são sempre gravados em algum objeto de escopo: page, request, session ou application ¡ n Persistem até que o escopo termine ou expirem devido a um timeout (no caso de sessões) Para se livrar de beans persistentes, use os métodos remove. Attribute(), disponíveis para cada objeto de escopo: session. remove. Attribute(bean); application. remove. Attribute(bean); request. remove. Attribute(bean);
Composite View n Páginas Web complexas (ex: portais) freqüentemente são divididas em partes independentes ¡ ¡ ¡ n Algumas partes são altamente dinâmicas, mudando frequentemente até na estrutura interna Outras partes mudam apenas o conteúdo Outras partes sequer mudam o conteúdo Gerar uma página dessas usando apenas um template é indesejável
Composite View n n O padrão de projeto Composite View sugere que tais páginas sejam separadas em blocos menores, que possam ser alterados individualmente e compostos durante a publicação (deployment) ou exibição JSP oferece duas soluções para obter esse efeito ¡ ¡ Usando inclusão estática (no momento da compilação do servlet) Usando inclusão dinâmica (no momento da requisição)
Inclusão estática n n Mais eficiente: fragmentos são incluídos em único servlet Indicada quando estrutura não muda com freqüência (conteúdo pode mudar) ¡ ¡ n Menus, Logotipos e Avisos de copyright Telas com miniformulários de busca Implementada com <%@ include file="fragmento" %> <!-- Menu superior --> <table> <tr><td><%@ include file="menu. jsp" %></td></tr> </table> Fragmento menu. jsp <!-- Fim do menu superior --> <a href="link 1">Item 1</a></td> <td><a href="link 2">Item 2</a></td> <a href="link 3">Item 3</a> Se tela incluida contiver novos fragmentos, eles serão processados recursivamente
Inclusão dinâmica n n Mais lento: fragmentos não são incluídos no servlet mas carregados no momento da requisição Indicada para blocos cuja estrutura muda com freqüência ¡ n n Bloco central ou notícias de um portal Implementada com <jsp: include page="fragmento"/> Pode-se passar parâmetros em tempo de execução usando <jsp: param> no seu interior <!-- Texto principal --> <table> <tr><td> <jsp: include page="texto. jsp"> <jsp: param name="data" value="<%=new Date() %>"> </jsp: include> </td></tr> </table> <!-- Fim do texto principal -->
Repasse de requisições n Uma requisição pode ser repassada de uma página JSP para outra página ou servlet usando Request. Dispatcher <% Request. Dispatcher rd = request. get. Request. Dispatcher("url"); rd. forward(request, response); %> n n O mesmo efeito é possível sem usar scriptlets com a ação padrão <jsp: forward> Assim como <jsp: include>, pode incluir parâmetros recuperáveis na página que receber a requisição usando request. get. Parameter() ou <jsp: get. Property> se houver bean <% if (nome != null) { %> <jsp: forward page="segunda. jsp"> <jsp: param name="nome" value="<%=nome %>"> </jsp: forward> <% } %>
JSP Standard Tag Library (JSTL) n Esforço de padronização do JCP: JSR-152 ¡ n Oferece dois recursos ¡ ¡ n Baseado no Jakarta Taglibs (porém bem menor) 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 n n n 1. Fazer o download da última versão do site da Sun 2. Copiar os JARs das bibliotecas desejadas para o diretório WEB-INF/lib/ da sua aplicação Web 3. Incluir em cada página que usa os tags: <%@ taglib uri="uri_da_taglib" prefix="prefixo" %> n 4. Usar os tags da biblioteca com o prefixo definido no passo anterior <prefixo: nome. Tag atributo=". . . ">. . . </prefixo: nome. Tag>
Cinco bibliotecas de tags n 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> n XML library: tags para processamento XML <%@ taglib prefix="x" uri="http: //java. sun. com/jsp/jstl/xml" %> ¡ Exemplo: <x: parse>. . . </x: parse> n Internationalization library <%@ taglib prefix="fmt" uri="http: //java. sun. com/jsp/jstl/fmt" %> ¡ Exemplo: <fmt: message key=". . . " /> n SQL library <%@ taglib prefix="sql" uri="http: //java. sun. com/jsp/jstl/sql" %> ¡ Exemplo: <sql: update>. . . </sql: update> n Function library <%@ taglib prefix="fn" uri="http: //java. sun. com/jsp/jstl/functions" %> ¡ Exemplo: ${fn: length(. . . )}
Linguagem de expressões n Permite embutir em atributos expressões dentro de delimitadores ${. . . } ¡ ¡ n n Em vez de request. get. Attribute("nome") ${nome} Em vez de bean. get. Pessoa(). get. Nome() ${bean. pessoa. nome} Suporta operadores aritméticos, relacionais e binários Converte tipos automaticamente <tag item="${request. valor. Numerico}" /> n Valores default <tag value="${abc. def}" default="todos" />
Principais ações n Suporte à impressão da linguagem expressões ¡ n <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="${mensagem. Especial}" /> </c: when> <c: otherwise> <c: out value="${mensagem. Padrao}" /> </c: otherwise> </c: choose> n Iteração ¡ <c: for. Each items="${pessoas}" var="p" var. Status="s"> <c: out value="${s. count}"/>. <c: out value="${p}"/> </c: for. Each>
Tag Files - Vantagens n n Reuso – os tag files permitem uma melhor customização de conteúdo, assim como o uso de nested tags. Compatibilidade com tag handlers Páginas JSP sem Scriptlet Desenvolvimento rápido – Recompilação dinâmica dos tag files é suportada por alguns containers como tomcat 5. X
Tag Files n <%@tag description=“Descrição da Tag" page. Encoding=“Padrão de codifficação“ bodycontent="empty | scriptless | tagdependent" dynamic-attributes=“handler. Dos. Atributos" %> - similar a diretiva page das páginas JSP. n <%@attribute name=“Nome. Do. Atributo" required="true|flase“ type=“Tipo. Dado” %> - descreve um atributo da tag, e se é obrigatório ou não. n <jsp: do. Body/> - representa o que é definido entre a abertura e fechamento da tag.
Exemplo de um Tag File <%@tag description="Display logo" page. Encoding="UTF-8"%> <%@taglib prefix="c" uri="http: //java. sun. com/jsp/jstl/core"%> <%@attribute name="size" required="true"%> <c: choose> <c: when test="${size == 'large'}"> <img src='logos/Logo. Large. gif' align='Center'> </c: when> <c: otherwise> <img src='logos/Logo. Small. gif' align='Center'> </c: otherwise> </c: choose> <jsp: do. Body/>
Usando um Tag File <%@ taglib prefix="tags" tagdir="/WEB-INF/tags" %> <html> <head> <title>Usando um Tag File</title> </head> <body> <tags: logo size="large"/> </body> </html>
Exercícios n 1. Use um Java. Bean Mensagem, com propriedades email e mensagem para implementar a aplicação de Mensagen da aula anterior ¡ ¡ n n 2. Altere gravar. Mensagens para que use <jsp: forward> para despachar a requisição para uma página erro. jsp, caso o usuário deixe os campos do formulário em branco, e para listar. Mensagens. jsp se tudo funcionar corretamente 3. Instalar tags do JSTL ¡ n Substitua todas as chamadas de new Mensagem() por <jsp: use. Bean> no escopo da sessão Use Expressões para exibir os dados Veja a documentação e os tags disponíveis 4. Use os tags de lógica <if> e <for. Each> para remover as expressões condicionais e iterações das páginas da aplicação de mensagens
Exercícios n 5. Substitua a página grava mensagem por um servlet que faça a mesma coisa n 6. Escreva um custom tag simples <pcc: tabela> que receba um String como parâmetro (texto) e imprima o String dentro de uma tabela HTML: ¡ ¡ n O tag <pec: tabela texto="Texto Recebido"/> deve produzir <table border="1"><tr><td>Texto Recebido</td></tr></table> Crie mais dois atributos que definam cor-de-fundo e cor-do-texto para a tabela e o texto. 7. Escreva uma segunda versão do tag acima que aceite o texto entre os tags <pec: tabela>Texto Recebido</pcc: tabela>
- Slides: 26