2. Programa
1. Minha Primeira Página JSP
2. Sintaxe de JSP
3. Ciclo de vida de página JSP
4. Diretivas
5. Ações
6. Variáveis implícitas
7. Configuração de uma página JSP
2
4. Minha primeira página
JSP
Um simples contador
[http://exemplos.googlecode.com/svn/trunk/scwcd/jsp01/]
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
5
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 --%>
9
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
10
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().
11
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.
12
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
13
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
14
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
15
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
17
18. Resumo
1. JSP é convertida para Servlet
2. Servlet é compilado
3. Servlet é carregado
4. 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.
18
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
19
20. Compilação
Servlets gerados/compilados (Tomcat)
%CATALINA_HOME%workCatalinalocalhost
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
20
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/]
21
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>
22
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 %>
23
24. contador.jsp (jsp02) (parte 3/6)
public void jspInit() {
try {
ServletContext sc = getServletContext();
contadorArq = sc.getRealPath(quot;/WEB-INF/contador.dbquot;);
if (!new File(contadorArq).exists()) sendInt(0);
contador = getInt();
} catch (Exception e) {
log(quot;Erro ao ler arquivo de contadorquot;, e);
}
}
public void jspDestroy() {
try {
sendInt(contador);
} catch (Exception e) {
log(quot;Erro ao salvar arquivo de contadorquot;, e);
}
}
24
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;
}
25
26. contador.jsp (jsp02) (parte 5/6)
Declaração resumida
<%!
int contador = 0;
String contadorArq = null;
// corpos dos métodos omitidos
public void jspInit() {}
public void jspDestroy() {}
public void sendInt(int v) throws Exception {}
public int getInt() throws Exception {}
%>
26
27. contador.jsp (jsp02) (parte 6/6)
Diretivas omitidas
<%@ page language=quot;javaquot; %>
<%@ page import=quot;java.io.*quot; %>
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++; %>
27
28. Resultado após várias requisições
(jsp02)
Este resultado foi obtido mesmo após várias interrupções
e reinícios do Tomcat.
28
31. horacorrente.jsp (jsp03)
<html>
<body>
<%@ page language=quot;javaquot; %>
<%@ page import=quot;java.io.*quot; %>
<%@ page import=quot;java.text.*quot; %>
<%@ page import=quot;java.util.*quot; %>
<%! String data; %>
<%
Locale l = new Locale(quot;ptquot;, quot;BRquot;);
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/] 31
32. horacorrente.jsp (jsp04)
<html>
<body>
<%@ page language=quot;javaquot; %>
<%@ page import=quot;java.text.*quot; %>
<%@ page import=quot;java.util.*quot; %>
<%! DateFormat df = null; %>
<%! public void jspInit() {
Locale l = new Locale(quot;ptquot;, quot;BRquot;);
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/] 32
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
44
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.
45
49. inclusao.jsp [jsp10.zip]
<%@ page import=quot;java.util.Datequot; %>
Inclui informações ao que já está sendo
gerado.
<br>Gerado em <%= new Date() %>
<br>Vá para
<a href=quot;pagina.jspquot;>pagina.jsp</a>.
49