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