jsp-intro

54
JSP básico

description

Introdução a JSP

Transcript of jsp-intro

Page 1: jsp-intro

JSP básico

Page 2: jsp-intro

2

Programa1. Minha Primeira Página JSP2. Sintaxe de JSP3. Ciclo de vida de página JSP4. Diretivas5. Ações6. Variáveis implícitas7. Configuração de uma página JSP

Page 3: jsp-intro

3

Pré-requisitos Servlet

Page 4: jsp-intro

Minha primeira página JSP

Um simples contador[http://exemplos.googlecode.com/svn/trunk/scwcd/jsp01/]

Page 5: jsp-intro

5

O que é JSP? JavaServer Page = JSP Tecnologia Combina HTML/XML e Java Objetivo: retornar conteúdo dinâmico para

um cliente Não há JSP sem servlets

Page 6: jsp-intro

6

contador.jsp

<html><body><%@ page language="java" %><%! int contador = 0; %><% contador++; %>

Esta é a requisição de número <%= contador %> que está sendo atendida.</body></html>

Page 7: jsp-intro

7

Resultado Após algumas requisições...

Page 8: jsp-intro

Sintaxe de JSP

Page 9: jsp-intro

9

Elementos de uma página JSP Diretiva

<%@ diretivas %> Declaração

<%! declaração em Java %> Scriptlet

<% código em Java %> Expressão

<%= expressão em Java %> Ação

<jsp:acaoNome /> Comentário

<%-- Qualquer texto --%>

Page 10: jsp-intro

10

<%@ diretiva %> Fornece informação geral acerca da página

JSP Tipos: page, include, taglib <%@ page language=“java” %>

Informa que Java é usada como linguagem de script

<%@ include file=“copyright.html” %>Conteúdo do arquivo inserido na página corrente

<%@ taglib prefix=“teste” uri=“taglib.tld” %>Associa prefixo a uma biblioteca de tags

Page 11: jsp-intro

11

<%! declaração %> Declara e define variáveis e métodos <%! int contador = 0; %>

Define a variável contador com valor inicial 0 Isto é feito uma única vez por página O valor é mantido em chamadas posteriores <%! String str = “ Funciona mesmo! “;

String getStr() { return str.trim(); }%>Declara str e o método getStr().

Page 12: jsp-intro

12

<% scriptlets %> Código em Java embutido em página JSP <% contador = contador + 1; %>

Adiciona um ao valor de contador Toda vez que se tem acesso à página o

código em Java é executado <% out.print(“<html><body>”);

out.print(“Bem-vindo ao curso JSP”); out.print(“</body></html>”);%>Gera página HTML de boas-vindas ao curso.

Page 13: jsp-intro

13

<%= expressão %> Representa expressão em Java <%= contador %>

É substituído pelo valor da variável Uma expressão é avaliada toda vez que se

tem acesso à página <%= 28 %>

Valor 28 <%= 27.5 * salario / 100 %>

27.5% do salário <%= str.length() %>

Tamanho da string

Page 14: jsp-intro

14

<jsp:acao atributos /> Comandos enviado para a máquina JSP <jsp:include page=“copyright.jsp” />

Inclua a saída de copyright.jsp nesta página Forma geral

<jsp:acaoNome atributos /> Ações padrão

jsp:include jsp:forward jsp:useBean jsp:setProperty jsp:getProperty jsp:plugin

Page 15: jsp-intro

15

<%-- comentário --%> <%-- Confirmar com Fulano --%>

Comentários não afetam a saída da página Observe a página JSP abaixo...

<html><body><!-- Comentário em HTML --><%-- Comentário em JSP --%><h1>Funciona ambos</h1></body></html>Comentário em HTML e JSP podem coexistir em uma mesma página

Page 16: jsp-intro

Ciclo de vida de página JSP

[jsp01.zip][jsp02.zip]

Page 17: jsp-intro

17

Página JSP é um Servlet Toda página JSP é executada por um servlet Seqüência

Máquina JSP gera arquivo Java correspondente à página JSP (este arquivo é um Servlet)

Máquina JSP compila o Servlet gerado Máquina JSP carrega em memória o Servlet Máquina JSP executa o Servlet como qualquer

outro Saída é enviada para o cliente

Page 18: jsp-intro

18

Resumo

1. JSP é convertida para Servlet2. Servlet é compilado3. Servlet é carregado4. Aguarda requisição Em conseqüência,...

A primeira vez que uma página JSP é requisitada a resposta é “lenta”, comparada com as demais. Após a primeira vez,...

Máquina compara data de criação da página e do Servlet correspondente gerado. O processo é refeito apenas quando o fonte é mais recente.

Page 19: jsp-intro

19

Fases do ciclo de vida de página JSP Tradução

Servlet correspondente é gerado da página JSP Compilação

Servlet gerado é compilado Carga

Classe compilada é carregada Instanciação

Instância do Servlet é criada jspInit()

Método chamado antes de qualquer outro _jspService()

Método chamado para cada requisição jspDestroy()

Chamado quando contêiner decide remover Servlet

Page 20: jsp-intro

20

Compilação Servlets gerados/compilados (Tomcat)

%CATALINA_HOME%\work\Catalina\localhost Executa compilador (reduzir tempo de resposta)

http://localhost:8080/app/p.jsp?jsp_precompile=true

Parâmetros com prefixo jsp são reservados Prática

Antes de qualquer requisição a uma página JSP, logo após início do contêiner, verifique que não há arquivo gerado

Faça uso da URL ilustrada acima (verifique o resultado) Consulte o conteúdo do arquivo gerado pelo compilador sem

fazer requisições à página

Page 21: jsp-intro

21

Contador “persistente” Problema

O contador do primeiro exemplo (jsp01) não “guarda” os valores entre execuções da aplicação. Reescreva-o para persistir o valor do contador entre execuções distintas.

Solução Guardar o valor do contador em meio estável

(arquivo)

[http://exemplos.googlecode.com/svn/trunk/scwcd/jsp02/]

Page 22: jsp-intro

22

contador.jsp (jsp02) (parte 1/6) “Esqueleto”<html><body><%-- diretivas omitidas --%><%-- declarações omitidas --%><%-- scriptlet omitido --%>Esta é a requisição de número <%= contador

%> que está sendo atendida.</body></html>

Page 23: jsp-intro

23

contador.jsp (jsp02) (parte 2/6) “Esqueleto” anterior sugere que precisamos:

contador (declaração) Iniciar este contador com valor armazenado em

arquivo. Caso seja a primeira vez então criar arquivo com valor 0 (jspInit()) Precisamos criar arquivo com valor fornecido Precisamos carregar valor de arquivo

Ao fechar o Servlet, enviar contador para arquivo (jspDestroy())

Todos os elementos acima podem ser colocados em uma <%! declaração %>

Page 24: jsp-intro

24

contador.jsp (jsp02) (parte 3/6)public void jspInit() {

try { ServletContext sc = getServletContext(); contadorArq = sc.getRealPath("/WEB-INF/contador.db"); if (!new File(contadorArq).exists()) sendInt(0);

contador = getInt();} catch (Exception e) { log("Erro ao ler arquivo de contador", e);}

}

public void jspDestroy() { try {

sendInt(contador); } catch (Exception e) {

log("Erro ao salvar arquivo de contador", e); }}

Page 25: jsp-intro

25

contador.jsp (jsp02) (parte 4/6) public void sendInt(int v) throws Exception {

FileOutputStream fos = new FileOutputStream(contadorArq);DataOutputStream dos = new DataOutputStream(fos);dos.writeInt(v);dos.close();

}

public int getInt() throws Exception {FileInputStream fis = new FileInputStream(contadorArq);DataInputStream dis = new DataInputStream(fis);contador = dis.readInt();dis.close();return contador;

}

Page 26: jsp-intro

26

contador.jsp (jsp02) (parte 5/6) Declaração resumida<%! int contador = 0; String contadorArq = null;

// corpos dos métodos omitidospublic void jspInit() {}public void jspDestroy() {} public void sendInt(int v) throws Exception {}public int getInt() throws Exception {}%>

Page 27: jsp-intro

27

contador.jsp (jsp02) (parte 6/6) Diretivas omitidas

<%@ page language="java" %><%@ page import="java.io.*" %>

Indicam que script será em Java Requisita a importação do pacote indicado

(serviços de I/O serão usados) Scriptlet omitido (executado a cada requisição)

<% contador++; %>

Page 28: jsp-intro

28

Resultado após várias requisições (jsp02)

Este resultado foi obtido mesmo após várias interrupçõese reinícios do Tomcat.

Page 29: jsp-intro

Diretivas

Page 30: jsp-intro

30

<%@ diretiva %> page (alguns atributos)

import session errorPage isErrorPage language extends buffer autoFlush contentType pageEncoding

Vejamos exemplos de alguns deles...

Page 31: jsp-intro

31

horacorrente.jsp (jsp03)<html><body><%@ page language="java" %><%@ page import="java.io.*" %><%@ page import="java.text.*" %><%@ page import="java.util.*" %><%! String data; %><%

Locale l = new Locale("pt", "BR");DateFormat df = DateFormat.getTimeInstance(DateFormat.FULL, l);data = df.format(new Date());

%>Hora corrente no servidor: <%= data %>.</body></html>

O que está em azul é executado em toda requisição à página.Uma versão alternativa é ...

[http://exemplos.googlecode.com/svn/trunk/scwcd/jsp03/]

Page 32: jsp-intro

32

horacorrente.jsp (jsp04)<html><body><%@ page language="java" %><%@ page import="java.text.*" %><%@ page import="java.util.*" %><%! DateFormat df = null; %><%! public void jspInit() {

Locale l = new Locale("pt", "BR"); df = DateFormat.getTimeInstance(DateFormat.FULL, l);

} %>Hora corrente no servidor: <%= df.format(new Date()) %>.</body></html>

Menos operações serão executadas para cada requisição.Há, por outro lado, memória ocupada pelo objeto DateFormat.

[http://exemplos.googlecode.com/svn/trunk/scwcd/jsp04/]

Page 33: jsp-intro

33

Resultado [jsp04.zip]

Page 34: jsp-intro

34

Mais duas diretivas (jsp05) excecao.jsp<%@ page errorPage="DivisaoPorZero.jsp" %><html><body><%= 4 / 0 %></body></html> DivisaoPorZero.jsp (pode ter nome melhor:

TrataExcecao.jsp)<%@ page isErrorPage="true" %><html><body><h2>Não foi possível executar sua requisição.</h2>Exceção gerada em <%= new java.util.Date().toString() %><br><br><%= exception.getMessage() %></body></html>

exception é uma variável implícita, veremos mais adiante.

[http://exemplos.googlecode.com/svn/trunk/scwcd/jsp05/]

Page 35: jsp-intro

35

Resultado (jsp05)

Page 36: jsp-intro

36

<%@ page info=“info” %> (jsp06)<%@ page info="Copyright (c) 2006 by Fábio Lucena" %><html><body><%= getServletInfo() %></body></html>

[http://exemplos.googlecode.com/svn/trunk/scwcd/jsp06/]

Page 37: jsp-intro

Ações

Page 38: jsp-intro

38

Cabeçalho e rodapé Página JSP (pagina.jsp)<html><body><jsp:include page=“/WEB-INF/jsp/cabecalho.jsp" />

Este é o corpo da minha página.<br>Cabeçalho e rodapé padronizados.

<jsp:include page="/WEB-INF/jsp/rodape.jsp" /></body></html>

Página JSP (cabecalho.jsp)Cabeçalho<hr> Página JSP (rodape.jsp)<hr>Obtido em <%= new java.util.Date() %>

[http://exemplos.googlecode.com/svn/trunk/scwcd/jsp07/]

Page 39: jsp-intro

39

Resultado (jsp07)

Page 40: jsp-intro

Variáveis implícitas

Page 41: jsp-intro

41

Variáveis implícitas application

javax.servlet.ServletContext session

javax.servlet.http.HttpSession request

javax.servlet.http.HttpServletRequest response

javax.servlet.http.HttpServletResponse out

javax.servlet.jsp.JspWriter (saída da página) page

java.lang.Object (instância do servlet referente à página) pageContext

javax.servlet.jsp.PageContext (ambiente da página) config

javax.servlet.ServletConfig exception

java.lang.Throwable

Page 42: jsp-intro

42

Exemplos [jsp08.zip] Identidades

<%= application %> <%= getServletContext() %>

Formas de se obter a sessão <%= session %> <%= request.getSession() %>

Servlet path (/vars.jsp) <%= request.getServletPath() %>

Servlet name <%= ((HttpServlet) page).getServletName() %>

Page 43: jsp-intro

43

Resultado [jsp08.zip]

Observe igualdades!

Page 44: jsp-intro

44

+ 1 exemplo [jsp09.zip] endereco.jsp

<html><body>A requisição desta página partiu do endereço IP <%= request.getRemoteAddr() %>.</body></html> Resultado

Se você estiver executando o tomcat localmente, provavelmente o endereço será 127.0.0.1

Page 45: jsp-intro

45

Forward/include [jsp10.zip] Problema

Aplicação que responde por default em /jsp10(index.jsp)

Uma página (pagina.jsp) deverá consultar o parâmetro “use”. Se o argumento é “include”, então inclua “inclusao.jsp”. Caso contrário, redirecione para “redireciona.jsp”. Se nenhum argumento é fornecido, então redirecione para arg.jsp.

Page 46: jsp-intro

46

index.jsp [jsp10.zip]<html><body><h3>index.jsp</h3><ul><li><a href="pagina.jsp?use=include">Include</a><li><a href="pagina.jsp?use=forward">Forward</a><li><a href="pagina.jsp">pagina.jsp</a></ul></body></html>

Page 47: jsp-intro

47

pagina.jsp [jsp10.zip]<html><body><h3>pagina.jsp</h3><% if (request.getParameter("use") == null) { pageContext.forward("arg.jsp"); return; } if (request.getParameter("use").equals("include")) pageContext.include("inclusao.jsp"); else pageContext.forward("redireciona.jsp");%></body></html>

Page 48: jsp-intro

48

arg.jsp [jsp10.zip]<html><body><h3>arg.jsp</h3><ul><li><a href="pagina.jsp?use=include">Include</a><li><a href="pagina.jsp?use=forward">Forward</a></ul></body></html>

Page 49: jsp-intro

49

inclusao.jsp [jsp10.zip]

<%@ page import="java.util.Date" %>Inclui informações ao que já está sendo

gerado.<br>Gerado em <%= new Date() %><br>Vá para <a href="pagina.jsp">pagina.jsp</a>.

Page 50: jsp-intro

50

redireciona.jsp [jsp10.zip]

<html><body><h3>redirecionada.jsp</h3>Vá para <a href="pagina.jsp">pagina.jsp</a>.</body></html>

Page 51: jsp-intro

Configuração de uma página JSP

Page 52: jsp-intro

52

Parâmetros (web.xml) [jsp11.zip]<servlet> <servlet-name>Jsp11Exemplo</servlet-name> <jsp-file>/WEB-INF/jsp/jsp11.jsp</jsp-file> <init-param> <param-name>cor</param-name> <param-value>azul</param-value> </init-param> <init-param> <param-name>estado</param-name> <param-value>Goiás</param-value> </init-param></servlet><servlet-mapping> <servlet-name>Jsp11Exemplo</servlet-name> <url-pattern>/</url-pattern></servlet-mapping>

Em vez de servlet-class

Referência não é WEB-INF/classes

Page 53: jsp-intro

53

jsp11.jsp [jsp11.zip]<html><body><b>Nome:</b> <%= getServletName() %><br><b>Cor</b>: <%= config.getInitParameter("cor") %><br><b>Estado</b>: <%= config.getInitParameter("estado") %></body></html>

Page 54: jsp-intro

54

Resultado (jsp11)