Buscar

sevlets

Esta é uma pré-visualização de arquivo. Entre para ver o arquivo original

Linguagem III
Ana Patrícia F. Magalhães Mascarenhas
anapatriciamagalhaes@gmail.com
2014.2
Servlet
Servlets
Servlets
Servlets são classes Java que atendem a requisições HTTP e retornam resultados no formato de resposta HTTP. 
Requests e Responses
Quando um usuário acessa uma URL através do browser, uma requisição do tipo “request” é criada e enviada ao servidor. 
Dependendo do tipo de requisição, a reposta do servidor (“server response”) pode ser do tipo de uma página HTML estática armazenada previamente no servidor ou do tipo de conteúdo dinâmico. 
Ciclo de Vida do Servlet
Os estágios do ciclo de vida de um servlet são:
 A servlet é carregada e inicializada pelo servidor
 A servlet é usada para satisfazer as requisições do cliente. 
 A servlet é removida ou descarregada quando requisitado
O servidor roda o método init() quando a servlet é carregado e não o chama de novo. O servidor não pode recarregar o servlet até ele tenha removido o servlet chamando o método destroy() para esta servlet. 
Rodando um Servlet (1) 
Existem várias formas de se rodar um servlet.Vamos inicialmente mostrar um exemplo em que o servlet é chamado através de um endereço URL em seu browser. A URL para o browser tem o seguinte formato genérico:
http://machine-name:port/servlet/servlet-name
aonde o “servlet-name” coresponde ao nome que você deu ao servlet em sua máquina. Este nome deverá ser uma classe no diretório de classes do servidor servlet rodando na máquina e porta especificada.
Rodando um Servlet (2) 
Considere o exemplo abaixo. Neste exemplo, a URL está tentando chamar o servlet “Servlet01.class” na porta 8080 (default) da máquina lt3.unifacs.br:
http://lt3.unifacs.br:8080/servlet/Servlet01
Servlet01 será o nosso primeiro exemplo de implementação de um servlet.
Um Primeiro Exemplo
O Código
Como nos casos anteriores, vamos ver um exemplo concreto para entender os conceitos por trás da tecnologia.
Nosso Primeiro Servlet (1)
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class Servlet01 extends HttpServlet{
 public void doGet(HttpServletRequest req, 
 HttpServletResponse res)
 throws ServletException, IOException {
 // Estabelece o tipo de saída
 res.setContentType("text/html");
 
 // Obtem um stream de saída
 PrintWriter out = res.getWriter();
 
 // continua
Nosso Primeiro Servlet (2)
 
 // Monta uma página HTML para o cliente
 out.println("<HTML>");
 
 out.println("<HEAD><TITLE=Servlet01</TITLE></HEAD>");
 out.println("<BODY>");
 
 out.println("<h1 align=\"center\">"
 +"<font color=\"#FF0000\">");
 out.println(”Um Alô Vermelho");
 out.println("</font></h1>");
 out.println("</BODY></HTML>");
 } // fim do método doGet()
} // fim da classe Servlet01
Entendendo o Código
A Interface Servlet
A interface Servlet estabelece os serviços que podem ser chamados pelos clientes. Ela declara os métodos que gerencia os servlets e sua comunicação com os clientes.
Todos servlets têm que implementar esta interface. Você pode implementar ela diretamente. Todavia, normalmente se implementa ela indiretamente, estendendo-se uma classe padrão que a implemente. No nosso caso, usamos a classe HttpServlet. 
public class Servlet01 extends HttpServlet{
A Interface HttpServlet
A interface HttpServlet possui métodos para todos comandos que um cliente HTTP pode mandar para um servidor HTTP. 
Como programador servlet você deve sobrescrever alguns, ou todos, estes métodos para que o seu servidor tenha o comportamento que você deseja implementar.
No nosso exemplo o servlet sobrecreve apenas o método doGet.
public void doGet(HttpServletRequest req, 
 HttpServletResponse res)
 throws ServletException, IOException {
Método doGet (1)
O método doGet() corresponde a operação GET em HTTP. Se você não sobrescrever este método, a implementação default retorna um erro HTTP BAD_REQUEST ao cliente. 
Note que objetos são passados para o método doGet():
ServletRequest - encapsula a comunicação o cliente para o servidor
ServletResponse - encapsula a comunicação do servidor para o cliente
Estes dois objetos sempre são passados para o servlet quando este é chamado por um cliente.
Método doGet (2)
A principal finalidade da operação GET é tornar possível ao cliente obter alguma coisa do servidor. Ao sobrescrever doGet() você deve: 
 Ler os dados da requisição, 
 Construir os cabeçalhos próprios para a resposta, 
 Obter acesso a um stream writer ou output (dependendo se você vai retorna informação textual ou binária), 
 Escrever os dados da resposta. 
Método doGet (3)
public void doGet(HttpServletRequest req, 
 HttpServletResponse res)
 throws ServletException, IOException {
 // Estabelece o tipo de saída
 res.setContentType("text/html");
 
 // Obtem um stream de saída
 PrintWriter out = res.getWriter();
Montando a Resposta
 
 // Monta uma página HTML para o cliente
 out.println("<HTML>");
 
 out.println("<HEAD><TITLE=Servlet01</TITLE></HEAD>");
 out.println("<BODY>");
 
 out.println("<h1 align=\"center\">"
 +"<font color=\"#FF0000\">");
 out.println(”Um Alô Vermelho");
 out.println("</font></h1>");
 out.println("</BODY></HTML>");
 } // fim do método doGet()
} // fim da classe Servlet01
Indo um Pouco Mais Além nas Explicações
Os Métodos da
Classe HttpServer (1)
No nosso exemplo, nós usamos o método doGet da classe HttpServer. 
import javax.servlet.*;
import javax.servlet.http.*;
public class Servlet01 extends HttpServlet{
 public void doGet(HttpServletRequest req, 
 HttpServletResponse res)
 throws ServletException, IOException {
 ..........
 }
Os Métodos da
Classe HttpServer (2)
A classe HttpServer possui os seguintes método que podem ser sobrescritos: 
 doGet() - que trata de requisições GET 
recursos enviados na URL, limitados a 255 caracteres.Usado para solicitar recurso do servidor.
 doPost() - que trata de requisições POST 
mandar dados ao servidor. Quantidade ilimitada de dados. Os dados são parte da requisição. Usado para enviar dados ao servidor.
 doPut() - que trata de requisições PUT
Usado para upload no servidor (similar a FTP)
 doDelete() - que trata de requisições DELETE
Deletar um arquivo, pagina, etc. do servidor
Objetos de Requisição e Repostas
Como vimos os métodos da interface Servlet têm que passar objetos para encapsular a comunicação cliente servidor e servidor cliente.
Estes objetos são implementações da interface ServletRequest e ServletResponse que fornecem os seguintes importante métodos ...
public void doGet(HttpServletRequest req, 
 HttpServletResponse res)
 throws ServletException, IOException {
Métodos da ServletRequest (1)
 getAttribute(String) - retorna valor do atributo nomeado. 
 getCharacterEncoding() - retorna a codificação dos caracteres desta requisição. 
 getContentLength() - Retorna tamanho dos dados de requisição. 
 getContentType() - Retorna o tipo de meio (media) dos dados de requisição. 
 getInputStream() - Retorna um stream para ler dados binários. 
 getParameter(String) - Retorna uma string contendo o valor do parâmetro nomeado. 
getParameterNames() - Retorna o nome de todos os parâmetros desta requisição.
Métodos da ServletRequest (2)
getProtocol() - Retorna o protocolo e versão da requisição numa string no formato <protocolo>/<version>.<version secundária> . 
getReader() - Retorna um leitor de texto com buffer. getRemoteAddr() - Retorna o endereço IP do agente que enviou a requisição. 
getRemoteHost() - Retorna o nome do host do agente que enviou a requisição. 
getScheme() - Retorna o scheme da URL usada na requisição, por exemplo "http", "https", ou "ftp". 
getServerName()
- Retorna o nome do host que recebeu a requisição. 
getServerPort() - Retorna a porta na qual a requisição foi recebida.
Métodos da ServletResponse
 getCharacterEncoding() - Retorna a codificação dos caracteres usada localmente. 
 getOutputStream() - Retorna o stream de saída para escrever respostas binárias. 
 getWriter() - Retorna o print writer para escrever respostas em texto formatado. 
 setContentLength(int) - Seta o tamanho da conteúdo da resposta. 
 setContentType(String) - Seta o tipo de conteúdo desta resposta. 
Recuperando Informações das Requisições
Os pares nome-valor enviados numa requisição podem ser recuperados através do método getParameter()da requisição (ServletRequest)
String getParameter(String name)
Recuperando Informações das Requisições - Ex. (1)
<html>
<head>
 <title>Página de Identificação</title>
</head>
<body>
 <h1 align="center">Identificação</h1>
 <form method="post" action="/hello/helloID">
 <p>Primeiro Nome: <input type="text" name="pName"> </p>
 <p>Segundo Nome: <input type="text" name="sName"> </p>
 <p>
 <p align="center"><input type="submit" value="Enviar"></p>
 </form>
</body>
</html>
Recuperando Informações das Requisições - Ex. (2)
Recuperando Informações das Requisições - Ex. (3)
public class HelloID extends HttpServlet {
 protected void processRequest(HttpServletRequest req, 
				HttpServletResponse resp)
			 throws ServletException, IOException {
	String name = req.getParameter("pName") + " " +
		 req.getParameter("sName");
	resp.setContentType("text/html");
	PrintWriter out = resp.getWriter();
	out.println("<HTML>");
	out.println("<HEAD><TITLE>Meu Primeiro Servlet</TITLE></HEAD>");
	out.println("<BODY><H1>Olá " + name + "</H1>");
	out.println("</BODY></HTML>");
	out.close();
 }
 public void doPost(HttpServletRequest req, HttpServletResponse resp)
 		throws ServletException, IOException {
	processRequest(req, resp);
 }
}
Recuperando Informações das Requisições - Ex. (4)
Exemplo
NetBeans – novo projeto – web – aplicação web <next>
Colocar o nome do projeto
BDM no projeto – novo – servlet
Colocar nome da classe e nome do pacote <next>
Padrões de URL – colocar o nome que deseja que o servlet seja chamado pelo browser
SRC guarda o codigo fonte da classe criada
BDM no arquivo + executar para testar o servlet
BDM no projeto – novo – HTML
Coloca o nome e finalizar
Pasta Web – Web-inf contem o arquivo
BDM no arquivo + executar para testar a página
Exercícios
Lista de exercícios de Servlet I
Outra Olhada no Ciclo de Vida da Servlet
Ciclo de Vida do Servlet
O servlet container cria uma instância do servlet;
O container chama a instancia do método init();
Se o container tem uma requisição para o servlet, ele chama a instância do método service();
Antes de destruir a instância, o container chama o método destroy();
A instância é destruída e sinalizada para a coleção garbage.
O Método service
Servidores efetivamente chamam o método service() de um servlet. Se você estiver escrevendo um servlet genérico você terá que sobrescrever este método. 
No nosso caso, a classe HttpServlet já tem um método service() que faz todo setup e despacha as requisições para os métodos doGet(), doPost(), doPut(), e doDelete(). Quando se está escrevendo servlets HTTP, você irá normalmente sobrescrever estes quatro métodos ao invés do método service(). 
Resposta 1 HTTP 
Resposta 2 HTTP 
Servlet Container
Criação de pool de Threads
Thread
Thread
Instanciar Servlet
Servlet
Chamar método init()
Aloca Requisição para Thread
Chamar Service()
Chamar Service()
Aloca Requisição para Thread
Bloqueia todas as Requisições
Espera treads ativas terminar
Termina Pool de Thread
Chamar Destroy()
Termina Servlet
Container Shutdown
Inicialização
Executa
Clean Up
Requisição 1 HTTP 
Requisição 2 HTTP 
Inicia Shutdown
Web Browser
Web Server
Request
Response
Servlet
Request
Response

Teste o Premium para desbloquear

Aproveite todos os benefícios por 3 dias sem pagar! 😉
Já tem cadastro?

Outros materiais