Java II Sérgio Luiz Ruivace Cerqueira [email protected] Por quê JSP? • Com Servlets é fácil – Ler dados de um formulário – Recuperar dados de uma requisição – Gerar informação de resposta – Fazer gerenciamento de sessão / cookies – Compartilhar dados entre Servlets – Lembrar dados entre requisições • Mas é difícil – Gerar o HTML de saída usando println – Fazer manutenção neste HTML de saída © LES/PUC-Rio JSP • A idéia – Usar HTML para maior parte das páginas – Marcar código Servlet com tags especiais – Toda a página JSP é traduzida para um Servlet (uma única vez) e é este Servlet que é chamado ao se chamar uma jsp © LES/PUC-Rio JSP • Exemplo de JSP – Página JSP • Obrigado por estudar <i><%="request.getParameter(titulo)"%></i> – URL • http://localhost:8080/meuJsp.jsp?titulo=Curso+de+JSP – Saída • Obrigado por estudar Curso de JSP © LES/PUC-Rio JSP HTML de resposta montado a partir de sucessivos comandos out.println(...). C on trolador B row ser O bjetosdeN egócio JavaB eande R esposta JS P © LES/PUC-Rio JSP • JSP é uma tecnologia que permite combinar informações estáticas com informações geradas dinamicamente • Script executado no servidor – Combinação de sintaxe JSP e tags de marcação – Tags estáticos (HTML, XML) – Conteúdo dinâmico gerado pelo código do script – Java • Exemplo <HTML><HEAD><TITLE>Primeiro JSP</TITLE></HEAD> <BODY><H1>Data e hora: <%= new java.util.Date() %></H1> </BODY></HTML> © LES/PUC-Rio JSP – benefícios • Embora JSP e Servlets sejam equivalentes, JSP – Facilita o desenvolvimento da interface da aplicação com HTML – Facilita a manutenção desta interface • JSP permite o uso de ferramentas de desenvolvimento HTML para criar a interface de aplicações Web • JSP encoraja a separação do código HTML de interface do código Java da aplicação – A lógica de geração de HTML pode ser implementada na JSP ou nas tags reutilizadas ou criadas como componentes separados © LES/PUC-Rio JSP – algumas perguntas • Quando o JSP é traduzido em um Servlet? – Na primeira chamada ao JSP – A tradução não ocorre para toda requisição • O que ocorre durante a tradução? – Código Servlet é gerado, usando as marcações JSP • O que ocorre ao se fazer uma requisição a um JSP? – O código Servlet gerado é executado – Em tempo de execução, não existe interpretação de páginas JSP – somente código Servlet é executado © LES/PUC-Rio JSP – compilação de um script requisição para xxx.jsp xxx.jsp Compilação resposta resposta indicação de erro xxx.class (servlet) Geração de Código Java xxx.java (servlet) © LES/PUC-Rio JSP – compilação de um script (cont.) requisição para xxx.jsp resposta de erro xxx.jsp Geração de Código Java Compilação resposta xxx.java (servlet) xxx.class (servlet) © LES/PUC-Rio JSP – construções • Elementos de script chamando código Servlet diretamente • Uso de Beans • Uso de Tag Library © LES/PUC-Rio Escopo, tags e diretivas JSP – escopos dos atributos • O JSP pode acessar objetos em tempo de execução em quatro escopos diferentes – Página • Objeto PageContext corrente (contexto da página) – Requisição • Objeto HttpServletRequest corrente (requisição HTTP) – Sessão • Objeto HttpSession corrente (sessão) – Aplicação • Objeto ServletContext corrente (contexto do servlet) © LES/PUC-Rio JSP – escopos dos atributos • Para armazenar informações: setAttribute(String, Object) • Para recuperar informações: getAttribute(String) © LES/PUC-Rio JSP – tags • Diretivas – Configuração do processador JSP – Inclusão estática de conteúdo – Encaminhamento de requisições para outros servidores • Comandos de script – Inserção de código para a programação de conteúdo dinâmico • Ações – Tags de alto nível que encapsulam padrões de programação mais corriqueiros © LES/PUC-Rio JSP – tags de diretivas • Formato – <%@ nome-da-diretiva [nome-atributo = "valor-do-atributo"]* %> • Diretivas disponíveis – <%@ page lista-de-atributos %> – <%@ include file="url-relativa" %> – <%@ taglib uri="url-relativa-da-biblioteca-de-tags“ prefix="prefixo-das-tags" %> © LES/PUC-Rio JSP – atributos da diretiva Page • language="nome-da-linguagem-de-script" • contentType="mime-type | mime-type; charset=nomecharset" • errorPage="url-página-de-erro" • isErrorPage="true | false" • buffer="none | tamanho-em-kb" • auto-flush="true | false“ • import="lista-de-pacotes" • Extends="nome-da-classe-base" • session="true | false" • isThreadSafe="true | false" • info="texto-informativo" © LES/PUC-Rio JSP – diretiva Page: atributo import • Formato – <%@ page import="package-class" %> – <%@ page import="package-class1, ..., package-classN" %> • Propósito – Permitir o uso de sentenças import no início do JSP © LES/PUC-Rio JSP – diretiva Page: atributo import (exemplo) © LES/PUC-Rio JSP – diretiva Page: atributo import (exemplo) • Saída – Primeiro acesso – Demais acessos © LES/PUC-Rio JSP – diretiva Page: atributo contentType • Formato – <%@ page contentType="MIME-type" %> – <%@ page import="MIME-type; charset=CharSet" %> • Propósito – Permitir dizer qual é o tipo de conteúdo da página de saída gerada pelo JSP © LES/PUC-Rio JSP – diretiva Page: atributo contentType (ex.) © LES/PUC-Rio JSP – diretiva Include • Formato – <%@ include file="relativeURL" %> • Propósito – Permitir o reuso de páginas JSP pela inserção destas em uma outra página JSP, fazendo uso das variáveis do JSP principal © LES/PUC-Rio JSP – diretiva Include (exemplo) • Arquivo JSP a ser incluído: ContactSection.jsp © LES/PUC-Rio JSP – diretiva Include (exemplo) • Arquivo JSP que inclui © LES/PUC-Rio JSP – diretiva Include (exemplo) • Saída © LES/PUC-Rio Tags de Scripts e Ações JSP – tags de script • Declarações – <%! declaração %> • Scriptlets – <% comandos %> • Expressões – <%= expressão %> • Comentários – <!-- comentário html --> – <%-- comentário jsp --> © LES/PUC-Rio JSP – tags de script: declarações • <%! declarações %> <%! int i = 0; public void metodo {...} %> <%! int a, b, c; %> <%! Circle a = new Circle(2.0); %> Declara variáveis ou métodos a serem utilizados no código JSP. © LES/PUC-Rio JSP – tags de script: scriptlets • <% fragmento_de_código_válido %> <% String name = null; if (request.getParameter(“nome") == null) { %> <%@ include file="error.html" %> <% } else { foo.setName(request.getParameter(“nome")); } %> Um scriptlet pode conter qualquer número de instruções, variáveis, métodos, declarações ou expressões válidos. © LES/PUC-Rio JSP – tags de script: scriptlets (exemplo) © LES/PUC-Rio JSP – tags de script: scriptlets (exemplo) • Saída © LES/PUC-Rio JSP – tags de script: expressões • <%= expressão %> O mapa tem <font color="blue"><%= mapa.getCount() %></font> entradas. Esta tag contém uma expressão que é avaliada e convertida para string, depois de processada. © LES/PUC-Rio JSP – tags de script: expressões (exemplo) © LES/PUC-Rio JSP – tags de script: expressões (exemplo) © LES/PUC-Rio JSP – tags de script: comentários • <!-- comentário [ <%= expressão %> ] --> <!-- Comentário --> <!-- Esta página foi carregada em <%= (new java.util.Date()).toLocaleString() %> --> O processador JSP trata um comentário como texto HTML não interpretado, retornando-o ao cliente. Uma expressão pode ser incluída em um comentário, sendo avaliada e seu resultado é retornado ao usuário juntamente com o HTML de resposta. © LES/PUC-Rio JSP – tags de script: comentários • <%-- comentário --%> <%@ page language="java" %> <html> <head><title>Um teste - comentário</title></head> <body> <h2>Um teste - comentário</h2> <%-- Este comentário não estará disponível para o cliente --%> </body> </html> O processador JSP simplesmente ignora este tipo de comentário e não processa nenhum código ou expressão contida entre os delimitadores. Este tipo de comentário não será enviado para o cliente. © LES/PUC-Rio JSP – objetos pré-definidos • Disponíveis para scriplets e expressões – request – response – session – out – exception (somente em páginas de erro) – page © LES/PUC-Rio JSP – ações • jsp:include • jsp:forward • jsp:useBean • jsp:setProperty • jsp:getProperty • ... © LES/PUC-Rio JSP – ação include • Formato – <jsp:include page="relativeURL" flush="true" %> • Propósito – Permitir o reuso de páginas HTML e JSP – Permitir a modificação das páginas HTML e JSP incluídas sem modificar a página JSP que as inclui © LES/PUC-Rio JSP – ação include (exemplo) © LES/PUC-Rio JSP – ação include (exemplo) • Saída © LES/PUC-Rio JSP – ação forward • Formato – <jsp:forward page="{URLrelativa | <%=expressão%>}"/> • Propósito – Repassar o objeto request enviado para o arquivo JSP para que seja processado por outra aplicação • Nota – O processador JSP não executa o restante das instruções contidas após a tag © LES/PUC-Rio JSP – ação useBean • Cria ou recupera uma instância de um bean • Java Bean – Classe Java que segue as seguintes convenções • Deve ter um construtor sem argumentos • Não deve ter atributos públicos • Atributos são acessados através de métodos getXXX e setXXX – Valores booleanos usam isXXX em vez de getXXX © LES/PUC-Rio JSP – ação useBean • Formato – <jsp:useBean id="nome" class="pacote.Classe" %> • Propósito – Permitir a instanciação de classes Java sem a sintaxe explícita de Java © LES/PUC-Rio JSP – ação useBean • Notas – <jsp:useBean id="umLivro" class="puc.Livro" %> é equivalente a <% puc.Livro umLivro = new puc.Livro(); %> – Mas o uso de Beans permite • Reuso mais simples de classes (Beans) • Uso simplificado dos atributos do Bean © LES/PUC-Rio JSP – acessando propriedades de um Bean • Formato – <jsp:getProperty id="nome" property="propriedade" %> • Propósito – Permitir recuperar o valor de atributos de um Bean sem uma chamada explícita ao método getXXX © LES/PUC-Rio JSP – acessando propriedades de um Bean • Notas – <jsp:getProperty id="umLivro" property="titulo" %> é equivalente a <% umLivro.getTitulo(); %> © LES/PUC-Rio JSP – modificando propriedades de um Bean • Formato – <jsp:setProperty id="nome" property="propriedade" value="valor"%> • Propósito – Permitir atribuir o valor de atributos de um Bean sem uma chamada explícita ao método setXXX © LES/PUC-Rio JSP – modificando propriedades de um Bean • Notas – <jsp:setProperty id="umLivro" property="titulo" value="Livro de JSP"%> é equivalente a <% umLivro.setTitulo("Livro de JSP"); %> © LES/PUC-Rio JSP – ação useBean (exemplo) • Bean StringBean © LES/PUC-Rio JSP – ação useBean (exemplo) • JSP que usa o Bean StringBean © LES/PUC-Rio JSP – ação useBean (exemplo) • Saída © LES/PUC-Rio JSP – ação useBean • É possível atribuir valores da requisição HTTP para um Bean • Se a propriedade for uma String – <jsp:setProperty ... value='<%=request.getParameter("...")%>' %> • Para fazer a conversão entre tipos, é preciso usar scriptlets JSP © LES/PUC-Rio JSP – ação useBean (exemplo) • Sem conversão explícita © LES/PUC-Rio JSP – ação useBean (exemplo) • Com conversão explícita © LES/PUC-Rio JSP – ação useBean • É possível compartilhar um Bean • Usar o atributo escopo para fazê-lo – <jsp:useBean id="..." class="..." scope="..."%> • Permite que diversos Servlets e JSP acessem o Bean • Também permite a criação condicional de um Bean © LES/PUC-Rio JSP – ação useBean (escopos) • Page – Escopo padrão. O Bean é colocado no objeto PageContext e só pode ser acessado pela página que o cria • Application – O Bean é colocado no objeto ServletContext e pode, então, ser compartilhado por todos os Servlets da aplicação © LES/PUC-Rio JSP – ação useBean (escopos) • Session – O Bean é colocado no objeto HttpSession associado à requisição atual e pode ser acessado enquanto a sessão do cliente com o servidor estiver ativa, por outras requisições • Request – O Bean é colocado no objeto HttpServletRequest e pode ser acessado (getXXX) somente na requisição atual. Não se pode atribuir o valor em um Bean (setXXX) neste escopo © LES/PUC-Rio