2 © LES/PUC-Rio
Agenda
• Servlets
• JSP
Servlets
4 © LES/PUC-Rio
Fundamentos
• Alternativa Java para os scripts CGI
• Um Servlet é uma classe Java que extende as capacidades de servidores que suportam aplicações através do modelo request-response.
• Embora servlets possam ser utilizados para responder qualquer tipo de request, geralmente são usados em web servers. A tecnologia Java define uma classe para tratar este tipo de requisição (HttpServlet).
Servlet x CGI Script
• Extensibilidade
– Java é orientada a objetos
– Servlets foram projetados para serem simples
– Arquitetura permite que os Servlets sejam facilmente estendidos
• Independência de plataforma
– São programas escritos em Java
• Performance
– São bem mais rápidos que programas CGI
– São carregados na memória apenas uma vez
– Executam pedidos concorrentemente
5 © LES/PUC-Rio
6 © LES/PUC-Rio
A API de Servlet
• A API de Servlet é um conjunto de classes Java que define uma interface padrão entre o cliente web e o servidor web.
• java.lang.Object• |• +----javax.servlet.GenericServlet implements javax.servlet.Servlet• |• +----javax.servlet.http.HTTPServlet• |• +----br.com.puc.MeuServlet
A interface Servlet
• javax.servlet.Servlet– destroy()
• Método chamado pelo container onde o servlet está sendo executado para indicar que o servlet terminou.
– getServletConfig()
• Método que retorna um objeto ServletConfig, que contém os parametros de inicializacao passados no arquivo web.xml
– getServletInfo()
• Retorna informações sobre a aplicação, como autor, versão e copyright.
– init(ServletConfig config)
• Metodo chamado na inicialização do servlet.
– service(ServletRequest req, ServletResponse res) • Método que trata as requisições feitas a um servlet bem como a criação das respostas.
A implementação para HTTP
• javax.servlet.http.HttpServlet
– Deve-se estender os 2 métodos abaixo para tratar requisições do tipo POST e GET.
• doGet
• doPost
ServletWeb Browser
Servidor
BD
Arquitetura Básica
10 © LES/PUC-Rio
Arquitetura Básica
browserHTTP
Servlet
NewClass5
NewClass
NewClass4NewClass6
NewClass7
NewClass2
NewClass3 NewClass8
NewClass9 NewClass10
11 © LES/PUC-Rio
HttpServlet
• Tratador de requisições HTTP
• Trata métodos HTTP específicos:
– doGet(HttpServletRequest req, HttpServletResponse resp)
– doPost(HttpServletRequest req, HttpServletResponse resp)
• doGet e doPost são chamados pelo método service() da interface Servlet.
• Subclasses reescrevem os métodos doGet, doPost e podem reescrever os métodos init() e destroy()
12 © LES/PUC-Rio
HttpServletRequest e HttpServletResponse
• Os métodos doGet(), doPost() recebem dois parâmetros:
– HttpServletRequest
• encapsula os parâmetros da requisição
– HttpServletResponse
• encapsula a resposta ao cliente
13 © LES/PUC-Rio
HttpServletRequest
• Interface que encapsula a requisição feita pelo cliente através do protocolo HTTP
• Possui métodos que permitem recuperar os dados da requisição:
– cabeçalho
– dados de formulários ou parâmetros enviados
– informações sobre a sessão do cliente
14 © LES/PUC-Rio
HttpServletRequest
• Alguns métodos definidos em HttpServletRequest
– Manipulação de Parâmetros
• java.util.Enumeration getParameterNames()
– Obtém listagem, contendo nomes de parâmetros da requisição
• java.lang.String[] getParameterValues(java.lang.String name)
– Obtém valores do parâmetro “name” da requisição
• java.lang.String getParameter(java.lang.String name)
– Obtém valor do parâmetro “name” da requisição
– Manipulação de Atributos
• void setAttribute( java.lang.String name, java.lang.Object)
– Coloca ou sobreescreve atributo no request identificado por “name”
• java.util.Enumeration getAttributesNames()
– Obtém listagem, contendo nomes de atributos da requisição
• java.lang.String getAttribute(java.lang.String name)
– Obtém valor do atributo “name” da requisição
15 © LES/PUC-Rio
HttpServletResponse
• Interface que encapsula a resposta ao cliente
• Possui um método responsável por recuperar o canal de resposta com o cliente
– getWriter()• retorna um PrintWriter • Ex: PrintWriter out = response.getWriter();
out.println( “Escrevendo no cliente” );
• Também é possível configurar qual é o tipo dos dados que estão sendo enviados de volta ao cliente
– setContentType( String type )– Os tipos mais comuns são text/html, text/xml– O método setContentType deve ser chamado antes do método getWriter
16 © LES/PUC-Rio
Hello World!
Hello World!
17 © LES/PUC-Rio
Segundo Exemplo
18 © LES/PUC-Rio
Gerenciamento de sessão (I)
• O protocolo HTTP é um protocolo sem estado
• Não é possível a princípio conhecer o estado do cliente anterior à uma requisição
• O gerenciamento de sessão provê uma maneira de identificar usuários através de várias requisições HTTPs e recuperar suas informações
– Dados do estado do cliente
• Para obter uma sessão:• HttpSession getSession()
– Obtém sessão existente, caso não exista retorna uma nova sessão. • HttpSession getSession(boolean create)
– Obtém sessão existente ou cria uma nova sessão dependendo do valor de o parâmetro create
• Funciona a base de cookie ou reescrita de URL
19 © LES/PUC-Rio
Gerenciamento de sessão (II)
• Principais métodos
– Métodos para manipulação de objetos em sessão• void removeAttribute(java.lang.String name)
– Retira objeto da sessão
• void setAttribute(java.lang.String name, java.lang.Object value) – Coloca ou sobreescreve objeto na sessão identificado por name
• java.lang.Object getAttribute(java.lang.String name)– Obtém objeto da sessão
• java.util.Enumeration getAttributeNames() – Obtém os nomes de todos os objetos armazenados na sessão
20 © LES/PUC-Rio
Gerenciamento de sessão (III)
• Tempo de duração da sessão
– As sessões em geral têm intervalo máximo de tempo que podem ficar inativas
– public int getMaxInactiveInterval()
– public void setMaxInactiveInterval(int interval)
• As sessões também podem ser encerradas explicitamente pelo programador:
– public void invalidate()
21 © LES/PUC-Rio
Jakarta Tomcat
• Servidor gratuito baseado em java
• Configurável de maneira simples via XML
• Oferece suporte a Java (Servlets e JSP)
22 © LES/PUC-Rio
Jakarta Tomcat
• Você irão precisar do Tomcat
– Pode ser gratuitamente obtido em http://www.apache.org
– Utilizem a versão 5.x ou superior
23 © LES/PUC-Rio
Publicação de Servlets
• Imagine que você implementou um Servlet, gerou o .java e compilou para ter o .class.
• E agora? Como o Servlet é publicado no servidor?
• Na verdade, existe um local para colocar as classes de sua aplicação
24 © LES/PUC-Rio
Configurando o Tomcat
• Onde colocar as classes dos Servlets?
– Primeiro, é preciso criar uma aplicação web
• Cria-se um diretório em %TOMCAT_HOME%\webapps\, sem
espaços no nome.
• Dentro desse diretório, cria-se a pasta WEB-INF
• Dentro de WEB-INF, criam-se 2 pastas: lib e classes
• Dentro de WEB-INF, cria-se o arquivo web.xml (deployment descriptor web)
Obs: TOMCAT_HOME é o nome do diretório aonde está sua instalação do TomCat
25 © LES/PUC-Rio
Configurando o Tomcat
• O arquivo web.xml deverá ter conteúdo similar ao presente em %TOMCAT_HOME%webapps\ROOT\WEB-INF
– Trata-se de um arquivo já pronto, que servirá como base para a criação de nosso arquivo
26 © LES/PUC-Rio
Configurando o Tomcat
• As classes são colocadas no diretório:
– %TOMCAT_HOME%\webapps\DIRETÓRIO_APLICAÇÃO\WEB-INF\classes
– A partir deste diretório devem ser colocadas em seus próprios pacotes
• As libs (arquivos .jar) devem ser colocadas no diretório:
– %TOMCAT_HOME%\webapps\DIRETÓRIO_APLICAÇÃO\WEB-INF\lib
27 © LES/PUC-Rio
Configurando o Tomcat
• Registrando os Servlets
– Os servlets devem ser chamados com seu nome completo (pacotes e classe)
– Muitas vezes o nome se torna grande demais
– Pode-se então dar um nome ao servlet através do qual o servidor redirecionará a chamada à classe específica
28 © LES/PUC-Rio
Configurando o Tomcat
• Registrando Servlets (1)
– O arquivo web.xml
• Localizado no diretório:– %TOMCAT_HOME%\webapps\DIRETÓRIO_APLICAÇÃO\WEB-INF
29 © LES/PUC-Rio
Configurando o Tomcat
• Registrando Servlets (2)<web-app>
<servlet>
<servlet-name>ServletSes</servlet-name>
<servlet-class>interfPesquisa.ServletSes</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ServletSes</servlet-name>
<url-pattern>/exemplo</url-pattern>
<servlet-mapping>
</web-app>
30 © LES/PUC-Rio
Configurando o Tomcat
• Agora, o servlet poderá ser acessado através da URL:
http://<host>:<porta>/DIRETÓRIO_APLICAÇÃO/exemplo
31 © LES/PUC-Rio
Configurando o Tomcat
• Outras configurações
– O arquivo server.xml
• Localizado no diretório:
– %TOMCAT_HOME%\conf
– Configuração da porta do servidor:
<Connector className="org.apache.tomcat.service.SimpleTcpConnector">
…
<Parameter name="port" value="8081"/>
</Connector>
Java Server Pages (JSP)
33 © LES/PUC-Rio
O que é 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áticas
• 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>
34 © LES/PUC-Rio
Escopo dos Atributos
• O JSP pode acessar objetos em tempo de execução em quatro escopos diferentes:– Página
• Objeto PageContext corrente (pageContext)
– Requisição• Objeto HttpServletRequest corrente (request)
– Sessão• Objeto HttpSession corrente (session)
– Aplicação• Objeto ServletContext corrente (servletContext)
• Para armazenar informações: setAttribute(String, Object)
• Para recuperar informações: getAttribute(String)
35 © LES/PUC-Rio
Tags JSP
• 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
• Tags
– Tags de alto nível que encapsulam padrões de programação mais corriqueiros
36 © LES/PUC-Rio
Diretivas
• <%@ nome-da-diretiva
[nome-atributo = “valor-do-atributo”]* %>
• Diretivas disponíveis:
– <%@ include file=“url-relativa” %>
– <%@ taglib uri=“url-relativa-da-biblioteca-de-tags” prefix=“prefixo-das-tags” %>
– <%@ page lista-de-atributos %>
37 © LES/PUC-Rio
Atributos da Diretiva Page
• language=“nome-da-linguagem-de-script”
• info=“texto-informativo” - getServletInfo()
• session=“true | false”
• import=“lista-de-pacotes”
• errorPage=“url-página-de-erro”
• isErrorPage=“true | false”
• contentType=“mime-type | mime-type; charset=nome-charset”
• buffer=“none|tamanho-em-kb”
• auto-flush=“true | false”
• extends=“nome-da-classe-base”
• isThreadSafe=“true | false”
38 © LES/PUC-Rio
Exemplos de Diretivas
• Diretiva Include
• Diretiva Taglib
39 © LES/PUC-Rio
Exemplos de Diretivas
• Diretiva Page
• Ou
40 © LES/PUC-Rio
Tags de Script
• Declarações
– <%! declaração %>
• Scriptlets
– <% comandos %>
• Expressões
– <%= expressão %>
• Comentários
– <!-- comentário html -->
– <%-- comentário jsp -->
41 © LES/PUC-Rio
Declarações
• <%! declarações %>
Exemplos:
<%! 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.
42 © LES/PUC-Rio
Scriptlets
• <% fragmento_de_código_válido %>
Exemplo:
<% 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.
43 © LES/PUC-Rio
Expressão
• <%= expressão %>
Exemplo:
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.
44 © LES/PUC-Rio
Comentários
• <!-- comentário [ <%= expressão %> ] -->
Exemplo:
<!-- 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.
45 © LES/PUC-Rio
Comentários para Desenvolvimento
• <%-- comentário --%>
Exemplo:
<%@ 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.
46 © LES/PUC-Rio
Objetos Pré-Definidos
• Disponíveis para scriplets e expressões
– request
– response
– session
– out
– exception (somente em páginas de erro)
– page
47 © LES/PUC-Rio
Exemplo JSP
48 © LES/PUC-Rio
Tags
• jsp:useBean
• jsp:setProperty
• jsp:getProperty
• jsp:include
• jsp:forward
49 © LES/PUC-Rio
jsp:useBean
• Cria ou recupera uma instância de um bean.
• <jsp:useBean lista_de_atributos>
• Principais atributos
– id: “nomeDaInstânciaDoBean”
– scope:”page|request|session|application”
– class: “*{pacotes}.NomeClasse”
• Exemplo:
50 © LES/PUC-Rio
jsp:include e jsp:forward
• Ações utilizadas para o encadeamento de páginas jsp.
• <jsp:include page=“url-relativa-da-página” />
– suspende o processamento da página chamadora;
– repassa o controle para a página chamada até que o retorne.
• <jsp:forward page=“url-relativa-da-página” />
– o processamento da página chamadora é terminado;
– controle repassado sem espera de retorno para a página chamada.
51 © LES/PUC-Rio
jsp:include
• <jsp:include page="{URLrelativa |<%=expressão%>}"/>
Exemplo:
52 © LES/PUC-Rio
jsp:forward
• <jsp:forward page="{URLrelativa|<%=expressão%>}"/>
Exemplo:
A tag <jsp:forward> repassa o objeto request enviado para o arquivo JSP para que seja processado por outra aplicação.
O processador JSP não executa o restante das instruções contidas após a tag.
53 © LES/PUC-Rio
JSP Standard Tag Library
• A JSTL encapsula tarefas comumente encontradas em aplicações web (iteração, manipulação de xml, etc).
• Versão JSTL (Java 1.4) lançada em meados de 2002 impulsionou o desenvolvimento com JSP.
• Requer servlet container que suporte Servlet 2.4 and JSP 2.0 (tomcat 5.x)
• Provê 4 standard Tag Libs:
– core, internationalization/format, XML, and SQL
• Provê uma Expression Language (EL).
54 © LES/PUC-Rio
JSTL EL
55 © LES/PUC-Rio
JSTL – Core Tag Lib
>
56 © LES/PUC-Rio
JSTL - Format tag lib