Java Web com Servlets e JSPs
Java Server Pages
Tópicos Abordados
• O que é
• Elementos de um JSP
– Scriplets
– Expressions
– Declarations
• Diretivas do JSP
– Include
– Taglib
– Page
• JSP Actions
• Objetos implícitos
• Páginas de erro
• Inicialização e destruição de JSPs
• Passando parâmetros para JSPs
O Que É
• Um documento HTML é estático
• Para criar respostas dinâmicas em Java,
existem os servlets
– Dependendo da resposta, é bastante difícil
codificá-la usando servlets
• Surgiram os JSPs
– Java Server Pages
– HTML + Código Java
1
Exemplo de JSP
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<%@page import="java.util.List"%>
<%@page import="java.util.ArrayList"%>
<%
List<String> l = new ArrayList<String>();
l.add("Arroz");
l.add("Feijão");
l.add("Batata");
%>
<html>
<body>
<H1>Lista de Compras</H1>
<ul>
<% for (String item : l) { %>
<li><%= item %></li>
<% } %>
</ul>
</body>
</html>
Exemplo de JSP
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<body>
<H1>Lista de Compras</H1>
<ul>
<li>Arroz</li>
<li>Feijão</li>
<li>Batata</li> Na resposta que chega ao
</ul>
cliente, o documento é 100%
</body>
</html> HTML
O Que é Realmente um JSP?
• Um JSP é na verdade um servlet!
tradução compilação inicialização Servlet
lista_compras.jsp lista_compras_jsp.java lista_compras_jsp.class
Desenvolvedor Container
Este processo só ocorre
na primeira vez que o
JSP é acessado
2
Scriptlets
• São códigos Java inseridos no JSP
• Não estão presentes no HTML resultante
• Um scriptlet deve começar com <% e
terminar com %>
<%
List<String> l = new ArrayList<String>();
l.add("Arroz");
l.add("Feijão");
l.add("Batata");
%>
O ponto-e-vírgula é
necessário aqui
Expressions
• Também são códigos Java inseridos no JSP
• São convertidas em texto no HTML
resultante
• Uma expression deve começar com <%= e
terminar com %>
<ul>
<% for (String item : l) { %>
<li><%= item %></li>
<% } %>
</ul>
Uma expression deve Expressions não
sempre resultar recebem ponto-e-
numa string vírgula
Declarations
• Também são códigos Java inseridos no JSP
• Usadas para declarar atributos e métodos
de instância
• Uma declaration deve começar com <%! e
terminar com %>
<%! int id = 0; %>
<%! Não esqueça de
int getId() { colocar ponto-e-vírgula
return id;
}
%>
3
Detalhes do Servlet Gerado
Servlet
public class area_jsp extends HttpJspBase {
public void _jspService(
HttpServletRequest request,
HttpServletResponse response)
throws java.io.IOException, ServletException {
PrintWriter out = response.getWriter();
JSP response.setContentType("text/html");
<html><body> out.write("<html><body>");
<% int lado = 10; %> int lado = 10;
A área do quadrado é: out.write("A área do quadrado é: ");
<%= lado * lado %> out.print(lado * lado);
</body></html> out.write("</body></html>");
}
Scriptets são Expressions são traduzidas
traduzidos da forma como parâmetros para o
como são escritos out.print()
10
Detalhes do Servlet Gerado
Servlet
public class area_jsp extends HttpJspBase {
int lado = 10;
JSP int calcularArea() {
return lado * lado;
<html><body> }
<%! int lado = 10; %>
<%! public void _jspService(
int calcularArea() { HttpServletRequest request,
return lado * lado; HttpServletResponse response)
} throws java.io.IOException, ServletException {
%>
Á área do quadrado é: PrintWriter out = response.getWriter();
<%= calcularArea() %> response.setContentType("text/html");
</body></html>
out.write("<html><body>");
out.write("A área do quadrado é: ");
out.print(calcularArea());
Declarations são out.write("</body></html>");
traduzidas como }
atributos e métodos
11
Comentários em JSP
• Dentro de scriptlets, os comentários
seguem o padrão do Java
<% <%
//este é um comentário /* este é um comentário */
int x = 0; int x = 0;
%> %>
• Fora dos scriptlets, deve ser usada outra
notação
<%-- este é um comentário %>
12
4
Diretivas do JSP
• JSP possui 3 tipos de diretivas (directives)
• Elas são identificadas por começarem por
<%@ e terminarem por %>
Diretiva Descrição
include Inclui código de um arquivo externo no JSP
taglib Define uma tag library
page Define propriedades da página
13
A Diretiva Include
• Permite incluir um arquivo externo na
criação do JSP
• A inclusão é feita durante a fase de tradução
– O servlet gerado já contém o conteúdo incluído
<%@ include file="inc/header.jsp" %>
14
A Diretiva Taglib
• Permite referenciar tag libraries na página
– Tag libraries são bibliotecas de tags
– Utilizadas para simplificar algumas tarefas e
esconder o código Java
<%@ taglib uri="http://www.softblue.com.br/tags" prefix="sb" %>
<sb:loop id="item" value="lista">
...
</sb:loop>
15
5
A Diretiva Page
• Define propriedades específicas da página
JSP
• É composta por diversos atributos
– language
– contentType
– pageEncoding
– import
– isErrorPage
– errorPage
16
A Diretiva Page
• Os atributos language, contentType e
pageEncoding definem a linguagem e
codificação
<%@ page language="java"
contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1" %>
17
A Diretiva Page
• O atributo import é utilizado para importar
classes e/ou pacotes que serão usados no
JSP
• Funciona de forma bastante semelhante ao
import do Java
<%@ page import="java.util.List" %>
<%@ page import="java.util.List, java.util.ArrayList" %>
<%@ page import="java.util.*" %>
18
6
A Diretiva Page
• Por padrão, alguns imports já são realizados
– java.lang.*
– javax.servlet.*
– javax.servlet.jsp.*
– javax.servlet.http.*
19
JSP Actions
• Funcionalidades para melhorar a
produtividade no desenvolvimento
• São definidas pelas tags no formato
<jsp:action>
Action Descrição
<jsp:include> Inclui outro JSP para renderização
<jsp:forward> Redireciona a requisição para outro local
<jsp:param> Cria parâmetros no JSP
<jsp:getProperty> Recupera a propriedade de um Java Bean
<jsp:setProperty> Atribui um valor a uma propriedade de um Java Bean
<jsp:useBean> Referencia um Java Bean no JSP
20
A action <jsp:include>
• Inclui o conteúdo de outro arquivo (HTML,
JSP, servlet, etc.)
• A inclusão é feita durante a renderização
– A diretiva <%@ include %> faz a inclusão na
fase de tradução
<html>
Inclui o arquivo
<body>
<jsp:include page="header.jsp" /> header.jsp na geração do
... HTML de retorno
</body>
</html>
21
7
A action <jsp:forward>
• Permite redirecionar a requisição para outro
local
– HTML, JSP, servlet, etc.
<jsp:forward page="result.jsp" />
Redireciona para o
arquivo result.jsp
22
Objetos Implícitos
• Como um JSP é um servlet, ele possui
acesso à objetos que um servlet acessaria
• Estes objetos existem de forma implícita no
JSP
23
Objetos Implícitos
Objeto Implícito Classe do Objeto
out JspWriter Dados na saída
application ServletContext
Configuração
config ServletConfig
exception JspException Apenas para páginas de erro
request HttpServletRequest
response HttpServletResponse
session HttpSession Escopo de dados
pageContext PageContext
page Object
24
8
Páginas de Erro
• Os atributos isErrorPage e errorPage
possibilitam o direcionamento para uma
página de erro caso alguma exceção
inesperada ocorra
• isErrorPage deve ser usado pela página que
representa a página de erro
• errorPage deve indicar uma página de erro
para que haja o redirecionamento no caso de
erro
25
Páginas de Erro
lista_compras.jsp
<%@ page errorPage="error.jsp" %>
<html>
<body>
<%
Object o = null;
o.toString();
%>
</body>
</html>
O atributo errorPage define
Este código vai gerar uma
qual JSP chamar em caso de
NullPointerException
exceção
26
Páginas de Erro
error.jsp
<%@ page isErrorPage="true" %>
<html>
<body>
<H1>Erro no Sistema</H1>
<STRONG>Mensagem: </STRONG><%= exception.toString() %>
</body>
</html>
Uma página de erro possui um objeto
implícito chamado exception, que
representa a exceção ocorrida
27
9
Inicialização e Destruição de JSPs
• Em servlets, o container chama os métodos
– init(): ao inicializar o servlet
– destroy(): ao destruir o servlet
– service(): ao atender uma requisição
• Como um JSP é um servlet, o container
também chama métodos semelhantes
– jspInit(): ao inicializar o JSP
– jspDestroy(): ao destruir o JSP
– _jspService(): ao atender uma requisição
28
Inicialização e Destruição de JSPs
• É possível sobrescrever os métodos
jspInit() e jspDestroy()
• O método _jspService() não deve ser
sobrescrito
<%!
Usar declaration public void jspInit() {
//inicializar o que for necessário
}
public void jspDestroy() {
//destruir o que for necessário
}
%>
29
Passando Parâmetros para JSPs
• Assim como servlets, JSPs também podem
receber parâmetros de inicialização
web.xml
<servlet>
<servlet-name>ListaCompras</servlet-name>
<jsp-file>/lista_compras.jsp</jsp-file>
<init-param>
<param-name>moeda</param-name>
<param-value>R$</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>ListaCompras</servlet-name>
<url-pattern>/lista_compras.jsp</url-pattern>
</servlet-mapping>
30
10
Passando Parâmetros para JSPs
lista_compras.jsp
<html><body>
Moeda: <%= config.getInitParameter("moeda") %>
</body></html>
O objeto implítico config acessa o
ServletConfig do servlet
31
Não use código Java em JSPs
• Apesar de JSPs terem sido criados para
possibilitar a mistura de HTML e código Java,
escrever código Java em JSPs não é uma
boa prática
– Dificulta o trabalho de web designers, que não
são programadores
– Para páginas complexas, o código fica confuso
– Dificuldade de manutenção
32
Não use código Java em JSPs
• Qual a alternativa?
– EL (Expression Language)
– JSTL (Java Server Pages Standard Tag Library)
– Tag libraries customizadas
33
11