API Orientada a Objetos de Java - Wiki LES PUC-Rio

Propaganda
Java II
Sérgio Luiz Ruivace Cerqueira
[email protected]
Servlets
Servlet
• Aplicação Java que é executada no servidor que estende a
capacidade do servidor Web
– Alternativa Java para os scripts CGI
– Gerenciado pelo módulo web
• Vantagens
– Melhor aproveitamento dos recursos do sistema
– Portável
Sérgio Ruivace © LES/PUC-Rio
Arquitetura cliente/servidor
• Arquitetura baseada na divisão do processamento em
processos distintos
• Servidor
– Responsável pela manutenção da informação e oferta de lógica
de negócios
• Clientes
– Responsáveis pela obtenção dos dados
– Envio de solicitações ao processo servidor
Sérgio Ruivace © LES/PUC-Rio
Servlets e a arquitetura cliente/servidor
• Em aplicações web, o cliente faz requisições utilizando
protocolo HTTP
• Com Servlets, para cada requisição o servidor cria uma
nova Thread
GET (request) Documento HTML
retorna (response) Documento HTML
Formulário Submetido via POST (request)‫‏‬
Servidor retorna HTML gerado pelo Servlet
Cliente / Browser
Servidor
Sérgio Ruivace © LES/PUC-Rio
Servlet – requisição via HTTP GET
GET (HTTP)
http://localhost/servlet/ServletHyperMed?Comando=SetCtxLabPorNome&Por=&No=Apsen
Sérgio Ruivace © LES/PUC-Rio
Servlet – requisição via HTTP POST
Sérgio Ruivace © LES/PUC-Rio
A API Servlet
• A API de Servlet é formada por 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
|
+----javax.servlet.http.HTTPServlet
|
+----br.org.les.MeuServlet
Sérgio Ruivace © 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()
• Subclasses devem reescrever os métodos doGet, doPost e
podem reescrever os métodos init() e destroy()
Sérgio Ruivace © LES/PUC-Rio
Ciclo de vida de um Servlet
• Criação e inicialização
– Realizado uma única vez, ao criar o Servlet
• init(ServletConfig config)
– Sempre chama o método da super-classe primeiro
• super.init(config)
– Pode sinalizar a exceção UnavailableException caso ocorra
algum erro durante o processo de inicialização
• Os métodos service(), doGet(), doPost() são chamados para
atender requisições de clientes
– Cada requisição é atendida por uma nova thread
Sérgio Ruivace © LES/PUC-Rio
Ciclo de vida de um Servlet (cont.)
• destroy() e coleta de lixo
– Executado somente uma vez
– Alguns servidores somente removem o servlet quando ocorre o
shutdown
– Utilizado para liberar recursos
Sérgio Ruivace © LES/PUC-Rio
Criando um Servlet
• Para criar um Servlet é necessário
– Estender a classe HttpServlet
• pacote javax.servlet.http do JSDK
– Implementar os métodos doGet ou doPost
Sérgio Ruivace © LES/PUC-Rio
Requisições e respostas
• Os métodos doGet(), doPost() recebem dois parâmetros
• HttpServletRequest
– Encapsula os parâmetros da requisição
• HttpServletResponse
– Encapsula a resposta ao cliente
Sérgio Ruivace © LES/PUC-Rio
Configuração Inicial
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
Sérgio Ruivace © LES/PUC-Rio
HttpServletRequest
• Alguns métodos definidos em HttpServletRequest
– 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
Sérgio Ruivace © 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 (retorna um PrintWriter)
– getWriter()
• Ex: PrintWriter out = response.getWriter();
out.println("Escrevendo no cliente");
Sérgio Ruivace © LES/PUC-Rio
HttpServletResponse
• 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
Sérgio Ruivace © LES/PUC-Rio
Servlet - HelloWorld
Sérgio Ruivace © LES/PUC-Rio
Outro exemplo
Sérgio Ruivace © LES/PUC-Rio
Inicialização de um Servlet - parâmetros
• Muitas vezes existem valores que são constantes durante a
execução do servlet, mas que podem mudar durante o ciclo
de vida da aplicação
• Exemplos
– Localização de recursos
– Mensagens padrão
• Principais métodos
– Classes Servlet e ServletConfig
• public java.util.Enumeration getInitParameterNames()
• public String getInitParameter(String name)
– getInitParameterNames() e getInitParamater(String name) são
usados para obter parâmetros do web.xml
Sérgio Ruivace © LES/PUC-Rio
Inicialização de um Servlet - exemplo
Sérgio Ruivace © LES/PUC-Rio
Inicialização de um Servlet - exemplo
Sérgio Ruivace © LES/PUC-Rio
Gerenciamento de Sessão
Gerenciamento de sessão
• 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 HTTP e
recuperar suas informações
– Dados do estado do cliente
Sérgio Ruivace © LES/PUC-Rio
Gerenciamento de sessão
• 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
Sérgio Ruivace © LES/PUC-Rio
Gerenciamento de sessão
• Métodos para manipulação de objetos em sessão
– void removeAttribute(String name)
• Retira objeto, identificado por name, da sessão
– void setAttribute(String name, Object value)
• Coloca ou sobreescreve o objeto, identificado por name, na sessão
– java.lang.Object getAttribute(String name)
• Obtém objeto, identificado por name, da sessão
– java.util.Enumeration getAttributeNames()
• Obtém os nomes de todos os objetos armazenados na sessão
Sérgio Ruivace © LES/PUC-Rio
Gerenciamento de sessão
• 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()
Sérgio Ruivace © LES/PUC-Rio
Gerenciamento de sessão – exemplo (carrinho de
compras)
Sérgio Ruivace © LES/PUC-Rio
Gerenciamento de sessão – exemplo (carrinho de
compras)
Sérgio Ruivace © LES/PUC-Rio
Gerenciamento de sessão – exemplo (carrinho de
compras)
Sérgio Ruivace © LES/PUC-Rio
Gerenciamento de sessão – exemplo (carrinho de
compras)
Sérgio Ruivace © LES/PUC-Rio
Servlets e Aplicações
Multicamadas
Servlets e o modelo de objetos de negócio
• Modelo de classes implementa o negócio da aplicação
• Servlets implementam o módulo Web da camada lógica
• Como fazer para os dois funcionarem juntos?
NewClass7
NewClass3
NewClass
NewClass2
NewClass8
??
HTTP
browser
NewClass9
Servlet
NewClass5
NewClass6
Sérgio Ruivace © LES/PUC-Rio
NewClass4
NewClass10
Padrão arquitetural MVC
• MVC – Model-View-Controller
– Surgiu nos anos 80 com SmallTalk
• Sugere a divisão de uma aplicação visual em 3 partes
fundamentais
– Model
• Representa o modelo da sua aplicação, com as regras de negócio
(business logic) e todo o processamento da aplicação
– View
• Representa a informação e recolhe os dados fornecidos pelo
usuário
– Controller
• Recebe as informações da entrada e as transmite para o modelo
Sérgio Ruivace © LES/PUC-Rio
Padrão arquitetural MVC
• O modelo será uma aplicação Java orientada a objetos
• O controlador será alguma tecnologia de implementação
(padrão comando) que juntamente com o Servlet
redirecionará as chamadas feitas pelo cliente aos objetos
responsáveis no modelo
• A apresentação será representada por páginas HTML ou JSP
Sérgio Ruivace © LES/PUC-Rio
Padrão arquitetural MVC
Controlador
Browser
Objetos de Negócio
JavaBean de
Resposta
JSP
Sérgio Ruivace © LES/PUC-Rio
Padrão arquitetural MVC
• Uso de padrão Command
– Atributo hidden
Sérgio Ruivace © LES/PUC-Rio
Padrão arquitetural MVC
• Implementando o padrão Command
– Atributo hidden + Comando abstrato + Hashtable
Sérgio Ruivace © LES/PUC-Rio
Padrão arquitetural MVC
HttpServlet
MeuServlet
comandos : Hashtable
ComandoAbstrato
doGet()
doPost()
init()
processaComando()
ComandoA
ComandoB
ComandoC
processaComando()
processaComando()
processaComando()
Sérgio Ruivace © LES/PUC-Rio
Padrão arquitetural MVC
• Comando abstrato
• HttpServletRequest
– Passa o comando a ser instanciado (input do formulário)
• HttpServletResponse
– Contém o PrintWriter que deverá receber as respostas do
Comando
Sérgio Ruivace © LES/PUC-Rio
Padrão arquitetural MVC
• O Servlet deve possuir um atributo HashTable com todos os
Commands
• Ao ser iniciado, cada Comando deve ser instanciado e
inserido na HashTable
Sérgio Ruivace © LES/PUC-Rio
Padrão arquitetural MVC
Sérgio Ruivace © LES/PUC-Rio
Padrão arquitetural MVC
Sérgio Ruivace © LES/PUC-Rio
Padrão arquitetural MVC
Sérgio Ruivace © LES/PUC-Rio
Implantação da Aplicação
Aplicação no contêiner Web
• Primeiro, é preciso criar uma aplicação web
– Cria-se um empacotamento WAR com a seguinte estrutura:
Sérgio Ruivace © LES/PUC-Rio
Aplicação no contêiner Web
• Relembrando…
– Além dessa estrutura, as classes são colocadas no diretório:
• 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
• DIRETÓRIO_APLICAÇÃO\WEB-INF\lib
– As classes de Servlets precisam ser registradas em web.xml
Sérgio Ruivace © LES/PUC-Rio
Aplicação no contêiner Web
• Registrando Servlets
<web-app>
<servlet>
<servlet-name>ServletSistema</servlet-name>
<servlet-class>controller.Login</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ServletSistema</servlet-name>
<url-pattern>/servlet/ServletSes</url-pattern>
<servlet-mapping>
</web-app>
Sérgio Ruivace © LES/PUC-Rio
Aplicação no contêiner Web
• Exemplo de chamada de Servlet
URL para apontar o servlet que processará
este formulário.
Parâmetro passado para a Servlet como
parâmetro da requisição
Sérgio Ruivace © LES/PUC-Rio
Aplicação no contêiner Web
• Geração do WAR no Eclipse
– Uma vez criado um projeto no Eclipse, é necessário seguir os
seguintes passos:
Sérgio Ruivace © LES/PUC-Rio
Aplicação no contêiner Web
• Geração do WAR no Eclipse
Sérgio Ruivace © LES/PUC-Rio
Aplicação no contêiner Web
• O empacotamento WAR deve ser colocado em
/<TOMCAT_HOME>/webapp/ para ser implantado no
servidor de aplicação automaticamente, ao inicializá-lo
• O servlet poderá ser acessado através da URL
http://<host>:<porta>/DIRETÓRIO_APLICAÇÃO/servlet/ServletSes
localhost:8080
Sérgio Ruivace © LES/PUC-Rio
Download