Java - CIC/UnBjhcf/MyBooks/itjava/slides/Servlets...Servlet Context Visão do Servlet Engine Passada...

Preview:

Citation preview

JavaTM ServletsJava e Engenharia de Software Orientada a Objetos

por Jorge H. C. Fernandes(jorge@dimap.ufrn.br)Julho de 1999

Java e Engenharia de Software Orientada a Objetos. Copyright © 1999, Jorge H. C. Fernandes (jhcf@di.ufpe.br)

Objetivos desta Aula

�Descrever o modelo computacional de Servlets�Comparar Servlets com CGI �Criar e executar pequenos servlets�Compreender a arquitetura de aplicações de

médio e grande porte usando servlets

Java e Engenharia de Software Orientada a Objetos. Copyright © 1999, Jorge H. C. Fernandes (jhcf@di.ufpe.br)

Referências

�Sun Microsystems�Servlet Tutorial �http://java.sun.com/products/servlet/index.html�JSDK 2.1�JSDK 2.0

�RFCs (Requests for Comments)�RFC 2616 (2068) Hypertext Transfer Protocol

(HTTP/1.1) �Repositório

⌧http://info.internet.isi.edu/7c/in-notes/rfc/.cache

Java e Engenharia de Software Orientada a Objetos. Copyright © 1999, Jorge H. C. Fernandes (jhcf@di.ufpe.br)

Conteúdo

�O que é e para quê [serve]2 lets?�CGI versus Servlets�O ciclo de vida de servlets�Características avançadas�Programação de servlets�Execução de servlets

Java e Engenharia de Software Orientada a Objetos. Copyright © 1999, Jorge H. C. Fernandes (jhcf@di.ufpe.br)

O que é um Servlet?

�Módulo de software - Orientados a Objetos - que estende servidores Web

�Vantagens na substituição de CGI scripts�Orientados a objetos�Processos persistem após atendimento do

pedido�Tratamento de sessões�API Java

⌧Independente de plataforma

Java e Engenharia de Software Orientada a Objetos. Copyright © 1999, Jorge H. C. Fernandes (jhcf@di.ufpe.br)

Para que [Serve]2 lets?

�Substituição de CGI Scripts�Independente de plataforma

�Repassando pedidos�Arquiteturas multi-camadas

�Colaboração entre pessoas�Uso compartilhado de um mesmo módulo

por vários clientes

CGI versus Servlets

Java e Engenharia de Software Orientada a Objetos. Copyright © 1999, Jorge H. C. Fernandes (jhcf@di.ufpe.br)

NomeAnoMod

FormulárioNomeAnoMod

Sepia1997999.999

FormulárioCGIscript

Web ServerWWW(HTTP)

Web Browser

CGI e Formulários HTML

CGIscript

Java e Engenharia de Software Orientada a Objetos. Copyright © 1999, Jorge H. C. Fernandes (jhcf@di.ufpe.br)

Um CGI Script em PERL#!/usr/local/bin/perl## hello world escrito por jhcf#print "Content-Type: text/html\n";print "\n";print "<HTML>\n";print "<HEAD><TITLE>Hello World</TITLE></HEAD>\n";print "<BODY>\n";print "<H1>Hello World</H1>\n";print "</BODY>\n";print "</HTML>\n";exit;

Java e Engenharia de Software Orientada a Objetos. Copyright © 1999, Jorge H. C. Fernandes (jhcf@di.ufpe.br)

NomeAnoMod

FormulárioNomeAnoMod

Sepia1997999.999

Formulário

Web Server

WWW(HTTP)

Web Browser

Servlets e Formulários HTML

Servlet Engine

Um Servlet Simples

Java e Engenharia de Software Orientada a Objetos. Copyright © 1999, Jorge H. C. Fernandes (jhcf@di.ufpe.br)

public class SimpleServlet extends HttpServlet { public void doGet (HttpServletRequest request,

HttpServletResponse response)throws ServletException, IOException {

PrintWriter out;String title = ”Hello World Servlet";

// set content type and other response header fields firstresponse.setContentType("text/html");

// then write the data of the responseout = response.getWriter();

out.println("<HTML>");out.println("<HEAD><TITLE>”+title+"</TITLE></HEAD>”);out.println("<BODY>");out.println("<H1>" + title + "</H1>");out.println("</BODY>");out.println("<HTML>");out.close();

}}

O Ciclo de Vida de Servlets

Java e Engenharia de Software Orientada a Objetos. Copyright © 1999, Jorge H. C. Fernandes (jhcf@di.ufpe.br)

Ciclo de Vida de Servlets

MeuServlet

1 - Instanciação

newnewnew

2 - Carga3 - Inicialização4 - Serviço5 - Remoção

Servlet Engine

destroy()

init(ServletConfig config)

service(Request, Response)

MeuServlet1MeuServlet2MeuServlet3

Java e Engenharia de Software Orientada a Objetos. Copyright © 1999, Jorge H. C. Fernandes (jhcf@di.ufpe.br)

Instanciação e Carga

�Feita durante o startup do servidor, ou sob demanda, quando o servidor necessita do servlet

Java e Engenharia de Software Orientada a Objetos. Copyright © 1999, Jorge H. C. Fernandes (jhcf@di.ufpe.br)

Inicializaçãopublic void init(ServletConfig config) {..}

�Durante a inicialização o servlet deve:�Ler dados persistentes�Estabeceler conexões JDBC ou com outros recursos

�ServletConfig�Implementado pelo servlet engine (servlet runner)�contém

⌧Conjunto de pares (nome, valor) que fazem parte da configuração do servidor

⌧ServletContext

Java e Engenharia de Software Orientada a Objetos. Copyright © 1999, Jorge H. C. Fernandes (jhcf@di.ufpe.br)

Tratamento de Pedidospublic void service(ServletRequest, ServletResponse) {..}

�ServletRequest - parâmetros enviados pelo cliente�Método do protocolo (GET, POST, HEAD, etc)�Cabecalho do pedido�Corpo do Pedido

⌧Dados de formulário

�ServletResponse�Cabecalho da resposta

⌧status code, etc

�Corpo da resposta⌧HTML, etc

Desenvolvimento de Servlets

Java e Engenharia de Software Orientada a Objetos. Copyright © 1999, Jorge H. C. Fernandes (jhcf@di.ufpe.br)

Multithreading e Mapping

�Por default, todos os servlets são multithreaded�SingleModelInterface - single threads servlets

Java e Engenharia de Software Orientada a Objetos. Copyright © 1999, Jorge H. C. Fernandes (jhcf@di.ufpe.br)

Servlets Mapping

� Um URL em um servlet/index.html -> HelloServlet

� Um servlet para atender todos URLs de um subdiretório/download/ -> DownloadServlet

� Um servlet para todos URLs com uma terminação*.thtml -> TextGeneratorServlet

� Um URL que é o nome do servlet/servlet/LocalTimeServlet

� Um URL com o nome da classe do servlet a ser carregado/servlet/br.com.cesar.TesteServlet

Java e Engenharia de Software Orientada a Objetos. Copyright © 1999, Jorge H. C. Fernandes (jhcf@di.ufpe.br)

Servlet Context

�Visão do Servlet Engine�Passada ao Servlet durante sua inicialização

�Acesso ao logger de eventos�Obtenção de outros recursos e objetos

�Outros servlets no mesmo host

�Cada servlet recebe um contexto , mas um mesmo servidor pode passar contextos diferentes para servlets diferentes (ex: hosts virtuais)

Java e Engenharia de Software Orientada a Objetos. Copyright © 1999, Jorge H. C. Fernandes (jhcf@di.ufpe.br)

Sessões HTTP

�HTTP 1.0/1.1 é um protocolo stateless�Servlets oferecem uma API simples que

permite fazer o trace de sessões

�HttpSession�Clientes podem criar novas sessões ou se

religar-se a uma sessão já existente�Ligação entre objetos e sessões

⌧Objetos ligados a sessões podem ser notificados através da interface HttpSessionBindingListener

Usando o JSDK 2.1

Java e Engenharia de Software Orientada a Objetos. Copyright © 1999, Jorge H. C. Fernandes (jhcf@di.ufpe.br)

Exemplos Contidos no JSDK2.1

�HelloWorld�RequestInfo�RequestHeaders�RequestParameters�Cookies�Sessions

Java e Engenharia de Software Orientada a Objetos. Copyright © 1999, Jorge H. C. Fernandes (jhcf@di.ufpe.br)

Exercício

�Instale o JSDK 2.1 e execute os exemplos�Veja o código dos servlets�Crie e instale o seu servlet HelloWorld

API Servlets 2.1

Java e Engenharia de Software Orientada a Objetos. Copyright © 1999, Jorge H. C. Fernandes (jhcf@di.ufpe.br)

Pacotes e Classes

�javax.servlet�RequestDispatcher�Servlet�ServletConfig�ServletContext�ServletRequest�ServletResponse�SingleThredModel�GenericServlet�ServletInputStream�ServletOutputStream�ServletException�UnavailableException

�javax.servlet.http�HttpServletRequest �HttpServletResponse �HttpSession �HttpSessionBindingListe

ner �HttpSessionContext �Cookie �HttpServlet �HttpSessionBindingEven

t �HttpUtils

Java e Engenharia de Software Orientada a Objetos. Copyright © 1999, Jorge H. C. Fernandes (jhcf@di.ufpe.br)

HttpServlet

Java e Engenharia de Software Orientada a Objetos. Copyright © 1999, Jorge H. C. Fernandes (jhcf@di.ufpe.br)

Interface javax.servlet.Servlet

void destroy() Remove o servlet após todos os threads dentro deste serviço

terem acabados, ou após um período de timeoutServletConfig getServletConfig()

Retorna um objeto (ServletConfig) que contém parâmetros de inicialização

String getServletInfo()Retorna um string com informação sobre o servlet (autor, versão

e copyright)void init(ServletConfig config)

Inicializa o servlet o o coloca em serviçovoid service(ServletRequest req, ServletResponse res)

Solicita ao servlet o atendimento de um pedido

Java e Engenharia de Software Orientada a Objetos. Copyright © 1999, Jorge H. C. Fernandes (jhcf@di.ufpe.br)

public abstract class GenericServletextends java.lang.Objectimplements Servlet, ServletConfig, java.io.Serializable

void destroy() {..}java.lang.String getInitParameter(java.lang.String name) {..}java.util.Enumeration getInitParameterNames() {..}ServletConfig getServletConfig() {..}ServletContext getServletContext() {..}java.lang.String getServletInfo() {..}void init() {..}void init(ServletConfig config) {..}void log(java.lang.String msg) {..}void log(java.lang.String message, java.lang.Throwable t) {..}abstract void service(ServletRequest req, ServletResponse res) {..}

Java e Engenharia de Software Orientada a Objetos. Copyright © 1999, Jorge H. C. Fernandes (jhcf@di.ufpe.br)

HttpServlet

Atendimento aos métodos do HTTPprotected void doDelete(HttpServletRequest req, HttpServletResponse

resp)protected void doGet(HttpServletRequest req, HttpServletResponse resp)protected void doOptions(HttpServletRequest req, HttpServletResponse

resp) protected void doPost(HttpServletRequest req, HttpServletResponse resp)protected void doPut(HttpServletRequest req, HttpServletResponse resp)protected void doTrace(HttpServletRequest req, HttpServletResponse

resp)

protected long getLastModified(HttpServletRequest req)protected void service(HttpServletRequest req, HttpServletResponse

resp)void service(ServletRequest req, ServletResponse res)

Java e Engenharia de Software Orientada a Objetos. Copyright © 1999, Jorge H. C. Fernandes (jhcf@di.ufpe.br)

Exemplos Contidos no Java Tutorial (JDSK 2.0)

� CatalogServlet� Busca de livros postos a

venda� CatalogServlet

� Comprar um livro colocando-o em um carrinho de compras

� Sessão, Cookies� BookDetailServlet

� Ver mais informações sobre um livro específico

�GET� Chamando um servlet de

outro servlet� BookDBServlet

�Gerenciar a base da dados de livros

� Inicialização e Destruição

� ShowCartServlet� Ver a lista de livros

selecionados para compra� ShowCartServlet

� Remover um ou mais livros do carrinho

� Lendo Cookies� CashierServlet

� Efetivamente comprar os livros no caixa

� ReceiptServlet� Receber um obrigado pela

compra� POST� SingleThreaded� Invalidar Sessão

Java e Engenharia de Software Orientada a Objetos. Copyright © 1999, Jorge H. C. Fernandes (jhcf@di.ufpe.br)

Exercício

�Instale o JSDK 2.0�Execute e compreenda o exemplo

bookstore

Dicas do Tutorial Java

Inicializando e Destruindo Servlets

Inicialização de Servlets

Java e Engenharia de Software Orientada a Objetos. Copyright © 1999, Jorge H. C. Fernandes (jhcf@di.ufpe.br)

Servlet initialization

�Regras na construção do método init�Se um erro de inicialização ocorrer, de modo

que o servlet fique incapacitado, levante ums UnavailableException. ⌧Ex: incapacidade de abrir conexões de rede.

�Não chamar System.exit()�Salvar o parâmetro ServletConfig de modo

que o método getServletConfig possa retornar o valor.

Java e Engenharia de Software Orientada a Objetos. Copyright © 1999, Jorge H. C. Fernandes (jhcf@di.ufpe.br)

public class BookDBServlet ... {

private BookstoreDB books;

public void init(ServletConfig config) throws ServletException {

// Store the ServletConfig object and log the initializationsuper.init(config);

// Load the database to prepare for requestsbooks = new BookstoreDB();

}...

}

Destruindo um Servlet

Java e Engenharia de Software Orientada a Objetos. Copyright © 1999, Jorge H. C. Fernandes (jhcf@di.ufpe.br)

public class BookDBServlet extends GenericServlet {

private BookstoreDB books;

... // the init method

public void destroy() {// Allow the database to be garbage collectedbooks = null;

}}

Aspectos Avançados do Gerenciamento de Servlets

Clean Shutdown

Java e Engenharia de Software Orientada a Objetos. Copyright © 1999, Jorge H. C. Fernandes (jhcf@di.ufpe.br)

Técnicas para shutdown de Servlets

�Manter controle de quantos threads estão correntemente executando método service

�Notificar serviços que demoram e aguardar um tempo para que eles acabar de forma organizada

�Serviços demorados devem periodicamente verificar se o servidor pediu para que eles sejam destruídos, de modo que eles possam parar e o servidor possa encerrar.

Java e Engenharia de Software Orientada a Objetos. Copyright © 1999, Jorge H. C. Fernandes (jhcf@di.ufpe.br)

Controle de Threads Ativos

public ShutdownExample extends HttpServlet {private int serviceCounter = 0;...//Access methods for serviceCounterprotected synchronized void enteringServiceMethod() {serviceCounter++;}protected synchronized void leavingServiceMethod() {

serviceCounter--;}protected synchronized int numServices() {return serviceCounter;}

}

Java e Engenharia de Software Orientada a Objetos. Copyright © 1999, Jorge H. C. Fernandes (jhcf@di.ufpe.br)

Controle de Threads Ativos

protected void service(HttpServletRequest req, HttpServletResponse resp)

throws ServletException, IOException{enteringServiceMethod();try {

super.service(req, resp);} finally {

leavingServiceMethod();}

}

Java e Engenharia de Software Orientada a Objetos. Copyright © 1999, Jorge H. C. Fernandes (jhcf@di.ufpe.br)

Clean Shutdown

public ShutdownExample extends HttpServlet {private boolean shuttingDown;...//Access methods for shuttingDownprotected setShuttingDown(boolean flag) {shuttingDown = flag;}protected boolean isShuttingDown() {return shuttingDown;}

}

Java e Engenharia de Software Orientada a Objetos. Copyright © 1999, Jorge H. C. Fernandes (jhcf@di.ufpe.br)

Verificando Clean Shutdownpublic void destroy() {

/* Check to see whether there are still service methods running,* and if there are, tell them to stop. */

if (numServices() > 0) {setShuttingDown(true);}

/* Wait for the service methods to stop. */while(numServices() > 0) {

try {Thread.sleep(interval);

} catch (InterruptedException e) {}

}}

Java e Engenharia de Software Orientada a Objetos. Copyright © 1999, Jorge H. C. Fernandes (jhcf@di.ufpe.br)

Exercícios

�Crie o servlet ContaBancária e o integre com o formulário HTML de manipulação de contas bancárias

FIM