Desenvolvimento de Projetos e Aplicações Web [email protected] JSP Conteúdo • • • • Introdução Arquitetura e funcionamento Sintaxe Elementos 3 JavaServer Pages • Tecnologia Java para criação de aplicações Web com conteúdo dinâmico como HTML e XML • JSP Permite separação de conteúdo dinâmico e estático • JSP Suporta scripting e tags 4 Arquitetura JavaServer Pages • Atua como a camada Web de acesso a aplicações n-tier • Utiliza o protocolo HTTP para comunicação com browsers • Requisições JSP são atendidas por servlets 5 Hello World <%@ page info="a hello world example" %> <html><head> <title>Hello, World</title> </head> <body bgcolor="#ffffff“ background="back.gif"> <table><tr><td width=150> &nbsp; </td> <td width=250 align=right> <h1> <%System.out.println(“Hello, World!”); %> </h1> </td></tr> </table></body></html> 6 Modelo de Requisições JSP Engine <%@ page info="a hello world example" %> Request <html><head><title>Hello, World</title></head> <body bgcolor="#ffffff“ background="back.gif"> <%@ include file="dukebanner.html" %> Response <table><tr><td width=150> &nbsp; </td> <td width=250 align=right> <h1>Hello, World!</h1> </td></tr> </table></body></html> 7 JSP Engine • O JSPEngine é um software para: – Atender requisições de páginas JSP – Transformar uma página JSP requisitada em um servlet – Executar o servlet para atender as requisições JSP correspondentes • Pode ser acoplado a um servidor web ou a um servidor de aplicações 8 Mecanismo (Funcionamento) Servidor Web JSP já traduzido em servlet ? Não Traduz JSP em Servlet Sim GET, POST Sim JSP foi modificado ? Compila o Servlet Não HTTP RESPONSE Executar o Servlet Carrega o Servlet 9 Sintaxe JSP Elementos JSP • Tags especiais • Interpretados no servidor (não chegam ao browser) • Organizados em 4 grupos: – Comentários – Diretivas e Taglibs – Scripting Elements • Expressões, Declarações e Scriptlets – Ações 11 Elementos JSP Elemento Tag Diretivas <%@ ... %> Declarações <%! ... %> Expressões <%= ... %> Scriptlets <% ... %> Comentários <%-- ... --%> Custom Tags <prefixo:elemento ... /> 12 Comentários • Utilizados para comentar o código • Não são processados pelo container JSP • Sintaxe: <%-- Este é um comentário --%> <%//Este é outro comentário %> 13 Diretivas • Utilizadas para enviar mensagens para o container JSP, afetando a estrutura do Servlet a ser gerado. • Sintaxe: <%@ directiveType attribute= =“valor” %> directiveType: {include, page e taglib} • Include e Page 14 Diretivas – Include • Utilizado para incluir arquivos estáticos no documento JSP • Sintaxe JSP: – <%@ include file=“URL” %> • Exemplos – <%@ include file=“Reverso.jsp” %> – Topo, base, miolo, etc. 15 Diretivas – page • Utilizado para descrever inúmeros atributos que serão considerados durante a criação do Servlet, tais como – – – – Importação de pacotes; Tipo de conteúdo; Retorno; Etc. • Sintaxe JSP: – <%@ page attribute=“valor” %> 16 Diretivas – page • Define características válidas para toda a página JSP e qualquer trecho de página incluída com a diretiva @include • Pode ser usada mais de uma vez na mesma página 17 Diretivas – page • Cada opção só pode aparecer uma vez na página, exceção feita à opção import • Embora possa ser colocada em qualquer lugar da página, é recomendável colocá-la no início do arquivo JSP 18 Diretivas – page • Atributos de <%@page attribute=“valor”%> 19 import • Pacotes/classes que serão utilizados no JSP • Deve aparecer antes de referenciar a classe • Pode-se separar pacotes por vírgula ou utilizar a opção import várias vezes <%@ page import=“java.io.*, java.util.*” %> 20 session • session = true|false • Quando true, a página utilizará o recurso de sessão HTTP e um objeto implícito session deverá estar disponível para a página JSP • Quando false, a página não utilizará o recurso de sessão HTTP e qualquer referência ao objeto implícito session causará um erro em tempo de tradução 21 Tag Extensions • Permite criação de tags personalizadas • Cada tag deve possuir uma classe Java que implementa sua funcionalidade • Propósitos diversos: – Manipulação de XML; Acesso a BD; IO;... • Sintaxe: – <%@ taglib uri=“URIForLibrary” prefix=“tagPrefix” %> 22 Taglibs - Exemplo <%@ taglib uri=“http://www.company.com/tags” prefix=“public” %> ... <public:loop> .... </public:loop> 23 Scripting Elementos de Scripting • São fragmentos de código java inseridos em uma página JSP • Declarações de variáveis, blocos de códigos, etc • Subdividem-se em três categorias: – Expressões – Declarações – Scriptlets 25 Declarações • Declarar variáveis e métodos usados nos Scriptlets e expressões • Sintaxe: <%! ... %> • Exemplos: <%! int i = 0; %> <%! public String title() { return “A”;}; %> <%! public final static String[] meses = {"jan","fev","mar","abr","mai","jun"}; %> <%! public static String getMesAtual() { Calendar c = new GregorianCalendar(); return meses[c.get(Calendar.MONTH)]; } %> 26 Declarações – Exemplo <html><head><title>Declarações JSP </title></head> <BODY> <H1>Declarações JSP</H1> <%! private int contadorAcessos=0; %> <H2>Número de acessos a essa página desde reboot do server: <%= ++contadorAcessos %> </H2> </body></html> 27 Scriptlets • Fragmentos de código Java • Sintaxe: <% ... %> • Exemplo: <% for(int i=0; i<100; i++) out.println(i); %> 28 Scriptlets • Se quisermos que alguma saída apareça na página HTML resultante, devemos usar o out <% String queryData = request.getQueryString(); out.println(“Query String: " + queryData); %> 29 Scriptlets • O código dentro de um scriptlet é inserido na página exatamente como escrito e qualquer HTML estático antes ou depois de um scriptlet é convertido em comandos print • Por exemplo, o seguinte código contém texto e scriptlets: <% if (Math.random() < 0.5) { %> <B>Bom</B> dia! <% } else { %> <B>Mau</B> dia! <% } %> • Será convertido (no servlet) para: if (Math.random() < 0.5) { out.println("Have a <B>nice</B> day!"); } else { out.println("Have a <B>lousy</B> day!"); } 30 Expressões • Expressões enviadas diretamente ao output stream corrente – Insere o valor de um atributo ou chamada de método em página JSP • Sintaxe: <%= expressão %> (sem o ;) • Equivale a out.print(expressão), portanto, expressão não pode terminar em ; • Exemplo: <%= new Date() %> • Apenas uma expressão Java 31 Exemplo <HTML> <BODY> <%// Isso é um scriptlet. // Note que a variável “hoje" // é declarada aqui e usada na expressão mais adiante out.println( “Data atual"); java.util.Date hoje = new java.util.Date(); %> <b>Olá, hoje é <%= hoje %></b> </BODY> </HTML> 32 Objetos implícitos • Objetos disponíveis nas páginas JSP sem a necessidade de declaração – Exceto session que depende de @page para ser ativado/desativado • Cada objeto implícito tem uma classe ou interface definida na API de Java • out, request, response, session,... 33 Objetos implícitos: request • Representa a requisição que causou a chamada do serviço • Disponibiliza informações sobre os parâmetros passados pela requisição: tipo (GET, POST); headers (cookies) • Objeto da classe HttpServletRequest 34 Objetos implícitos: request - Exemplos • URL no browser: http://servidor/programa.jsp?nome=Fulano&id=5 • Recuperação dos parâmetros no JSP: <% String nome = request.getParameter("nome"); String idStr = request.getParameter("id"); int id = Integer.parseInt(idStr); %> <p>Bom dia <%=nome %>! (cod: <%=id %>) • Cookies Cookie[] c = request.getCookies() 35 Objetos implícitos: response • Representa a resposta enviada à requisição que causou o serviço • Permite a atribuição de valores para o cabeçalho da resposta, criação de cookies, definição de parâmetros, etc. 36 Objetos implícitos: session • Sessão estabelecida entre o cliente e o servidor • Armazena informações que persistem por tempo determinado, podendo ser acessadas através de diversas páginas e requisições ao servidor 37 Objetos implícitos: session • A sessão tem uma relação direta com o browser, isto é, duas janelas de um browser compartilham a mesma sessão • A maneira como as sessões são mantidas depende do JSP Engine 38 Objetos implícitos: out • Output stream para escrita da resposta no cliente • Disponibiliza uma série de métodos para a escrita e controle do buffer de saída da página de resposta 39 Objetos implícitos: out • Equivalente a response.getWriter(); • Principais métodos – print() e println() • Os trechos de código abaixo são equivalentes <% for (int i = 0; i < 10; i++) { out.print("<p> Linha " + i); } %> OU <% for (int i = 0; i < 10; i++) { %> <p> Linha <%= i %> <% } %> 40 Referências • Deitel, capítulo 27 41