Java II Sérgio Luiz Ruivace Cerqueira sergioruivace@gmail.com
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
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
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 ( request ) Formulário Submetido via POST Servidor retorna HTML gerado pelo Servlet Cliente / Browser Servidor
Servlet requisição via HTTP GET GET (HTTP) http://localhost/servlet/servlethypermed?comando=setctxlabpornome&por=&no=apsen
Servlet requisição via HTTP POST
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
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()
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
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
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
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
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
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
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");
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
Servlet - HelloWorld
Outro exemplo
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
Inicialização de um Servlet - exemplo
Inicialização de um Servlet - exemplo
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
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
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
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()
Gerenciamento de sessão exemplo (carrinho de compras)
Gerenciamento de sessão exemplo (carrinho de compras)
Gerenciamento de sessão exemplo (carrinho de compras)
Gerenciamento de sessão exemplo (carrinho de compras)
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 NewClass8?? NewClass NewClass2 browser HTTP Servlet NewClass9 NewClass10 NewClass5 NewClass6 NewClass4
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 View Representa o modelo da sua aplicação, com as regras de negócio (business logic) e todo o processamento da aplicação 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
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
Padrão arquitetural MVC Browser Controlador Objetos de Negócio JavaBean de Resposta JSP
Padrão arquitetural MVC Uso de padrão Command Atributo hidden
Padrão arquitetural MVC Implementando o padrão Command Atributo hidden + Comando abstrato + Hashtable
Padrão arquitetural MVC HttpServlet MeuServlet comandos : Hashtable doget() dopost() init() ComandoAbstrato processacomando() ComandoA ComandoB ComandoC processacomando() processacomando() processacomando()
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
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
Padrão arquitetural MVC
Padrão arquitetural MVC
Padrão arquitetural MVC
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:
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
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>
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
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:
Aplicação no contêiner Web Geração do WAR no Eclipse
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