Java – Plataformasflavio/pi/files/2013-02/servlets.pdf · Java EE – Java Platform, Enterprise...

Click here to load reader

  • date post

    07-Aug-2020
  • Category

    Documents

  • view

    10
  • download

    0

Embed Size (px)

Transcript of Java – Plataformasflavio/pi/files/2013-02/servlets.pdf · Java EE – Java Platform, Enterprise...

  • 1/25/2014

    1

    Programação para InternetProf. Flávio de Oliveira Silva, Ph.D.

    Java – Plataformas A tecnologia Java está dividida em plataformas. Cada plataforma oferece um conjunto de funcionalidades

    para o desenvolvimento de diferentes tipos de aplicações Existem três plataformas baseadas na tecnologia Java

    Java ME – Java Platform, Micro Edition Java SE – Java Platform, Standard Edition Java EE – Java Platform, Enterprise Edition

    70

    Programação para InternetProf. Flávio de Oliveira Silva, Ph.D.

    Java – Plataformas Java ME – Java Platform, Micro Edition

    Fornece um ambiente específico para a criação de aplicações destinadas a dispositivos como telefones celulares, pagers, PDAs, Smartphones; etc.

    Destinado a criação de aplicações para dispositivos móveis Java SE – Java Platform, Standard Edition

    Fornece um ambiente completo para o desenvolvimento de aplicações em destktops (clientes) e também servidores

    Base da tecnologia Java. Fornece a máquina virtual (JRE – Java RuntimeEnvironment)

    Java EE – Java Platform, Enterprise Edition Define um padrão para o desenvolvimento de aplicações baseadas em

    componentes e estruturadas em várias camadas Seu foco é o desenvolvimento de aplicações do lado servidor, cujo objetivo é

    prover funcionalidades para aplicações distribuídas

    71

  • 1/25/2014

    2

    Programação para InternetProf. Flávio de Oliveira Silva, Ph.D.

    Java – Java EE O padrão Java EE define um grupo da APIs( Application Programming

    Interfaces) que pode ser combinado para a criação de aplicações distribuídas baseadas ou não na Web

    O Java EE não é um produto, mas uma especificação. A especificação é criada pela JCP (Java Community Process) Esta comunidade é responsável pelo desenvolvimento da tecnologia

    Java e é aberta a qualquer desenvolver ou empresa interessado na tecnologia

    Esta especificação é então implementada pelas mais variadas companhias como, por exemplo: ORACLE

    SUN BEA

    IBM JBOSS

    72

    Programação para InternetProf. Flávio de Oliveira Silva, Ph.D.

    Java – Java EE O resultado desta implementação é um Servidor de Aplicações

    (Application Server) Exemplos de servidores de aplicações compatíveis com o padrão J2EE

    Oracle Oracle - Oracle Application Server 10g Sun - Sun GlassFish Enterprise Server BEA – Oracle WebLogic Server

    IBM – Websphere JBoss – JBoss Application Server SAP AG - Web Application Server

    Sybase – EAServer Adobe - JRun Server Borland – AppServer Fujitisu – Interstage Application Server

    Os servidores implementam uma das especificações Java EE (1.2; 1.3; 1.4 , 5 e 6)

    73

  • 1/25/2014

    3

    Programação para InternetProf. Flávio de Oliveira Silva, Ph.D.

    Aplicações Distribuídas Camadas O modelo para desenvolvimento de aplicações utilizando o Java EE é

    baseado em uma arquitetura multicamadas Cada camada contém componentes de acordo com a sua função. Basicamente existem as seguintes camadas:

    Cliente (Client Tier) Camada Web (Web Tier) Camada de Negócios (Bussiness Tier) Camada Enterprise Information System (EIS)

    A camada Web Tier estará presente quando a aplicação for baseada na WEB ou seja, o cliente é um navegador (browser)

    A arquitetura acima é conhecida como três camadas (3-tier) visto que existem 3 máquinas envolvidas: O cliente; O servidor de aplicações Java EE O servidor de banco de dados

    74

    Programação para InternetProf. Flávio de Oliveira Silva, Ph.D.

    Aplicações DistribuídasCamadas Cliente (Client Tier)

    Componentes que são executados na máquina do cliente. Podem ser executados em um Browser ou uma aplicação desktop baseada no Java SE

    Camada Web (Web Tier) Componentes que são executados em um servidor Java EE Basicamente tratam da apresentação do conteúdo na WEB Esta camada é responsável por gerar e enviar para o cliente o conteúdo gerado de forma dinâmica

    Camada de Negócios (Bussiness Tier) Contém os objetos relacionados ao negócio e suas regras O servidor de aplicações oferece recursos como controle de transações, de sessões para os objetos

    desta camada. Pode ser implementa com EJB (Enterprise JavaBeans)

    Camada Enterprise Information System (EIS) Consiste dos recursos que serão utilizados pela aplicação. Inclui gerenciadores de banco de dados

    (DBMS) e aplicações legadas, baseadas em mainframes, por exemplo. Esta camada é executada fora do servidor J2EE e a arquitetura J2EE possui uma interface para

    esta camada, que pode ser feita, por exemplo, através de conectores

    75

  • 1/25/2014

    4

    Programação para InternetProf. Flávio de Oliveira Silva, Ph.D.

    Aplicações DistribuídasCamadas – Arquitetura Java EE Visão Geral das Camadas

    76

    Programação para InternetProf. Flávio de Oliveira Silva, Ph.D.

    Aplicações DistribuídasArquitetura Java EE Comunicação entre as várias camadas

    77

  • 1/25/2014

    5

    Programação para InternetProf. Flávio de Oliveira Silva, Ph.D.

    Aplicações DistribuídasArquitetura Java EE Camada Web (Web Tier)

    JavaBeans; JSP Pages; Servlets

    78

    Programação para InternetProf. Flávio de Oliveira Silva, Ph.D.

    Aplicações DistribuídasArquitetura Java EE Camada de Negócios (Business Tier)

    Baseada em EJB

    79

  • 1/25/2014

    6

    Programação para InternetProf. Flávio de Oliveira Silva, Ph.D.

    Java EE contêineres O contêiner fornece a infra-estrutura para a execução de um componente

    específico da plataforma O servidor Java J2EE (Application Server) fornece dois tipos básicos de

    contêineres: WEB contêiner EJB contêiner

    80

    Programação para InternetProf. Flávio de Oliveira Silva, Ph.D.

    Java EE contêineresWeb Contêiner Executa Servlets e páginas JSP Servlets

    São classes Java que podem ser chamados dinamicamente e que podem executar alguma funcionalidade.

    Estes programas podem ser executado em um Servidor Web ou em um contêiner para Servlets

    Normalmente estão ligados a geração de conteúdo para browsers. O Servlet implementa a interface Servlet e possui um funcionamento pré-definido Os Servlets recebem e respondem a requisições feitas normalmente através do

    protocolo HTTP JavaServer Pages (JSP)

    Consistem de uma maneira para criar conteúdo dinâmico para a Web Seu objetivo é criar uma separação entre a apresentação e os dados que estarão

    presentes em uma página no navegador. Normalmente a página JSP é um modelo que contém tanto o conteúdo estático, como

    a indicação de como o conteúdo dinâmico será gerado

    81

  • 1/25/2014

    7

    Programação para InternetProf. Flávio de Oliveira Silva, Ph.D.

    Java EE contêineresEJB Contêiner Realiza a criação, destruição e gerenciamento dos EJBs (Enterprise JavaBeans) Enterprise JavaBeans

    Enterprise JavaBeans é um padrão para o desenvolvimento de componentes, utilizando a linguagem Java, que podem ser implantados (deployed) em qualquer servidor J2EE. Em sua essência são classes Java.

    Existem vários tipos de EJBs cada um com características próprias Além disso o contêiner de EJBs é responsável pelo:

    Gerenciamento Distribuído de Transações Implementação da Segurança Gerenciamento de Recursos Persistência dos EJBs Acesso Remoto Transparência de Localização Monitoramento Todas as funções são realizadas de forma transparente pelo servidor de aplicações.

    O EJB contêiner é aquele que realmente caracteriza um servidor de aplicações baseado na especificação Java EE

    82

    Programação para InternetProf. Flávio de Oliveira Silva, Ph.D.

    Java EE contêineresEJB Contêiner Existem vários tipos de EJBs cada um com características próprias O seu uso depende das características da aplicação, de suas vantagens e desvantagens

    particulares

    83

    TIPO SUB‐TIPO DESCRIÇÃO

    Session 

    Stateless (sem estado)  Componentes que simplesmente realizam a chamada de métodos. Utilizado para a implementação das regras de negócio 

    Stateful (com estado) Componentes com estado funcionam como um proxy para aplicações do cliente. Estes componentes mantém seu estado entre as chamadas 

    de Métodos 

    Message  Componentes sem estado que estão ligados ao Java Message Service(JMS), utilizado para chamada assíncrona de métodos 

    Entity 

    Component Managed (CMP) 

    Componentes com estados que fazem o encapsulamento de uma entidade de um banco de dados. O servidor de aplicações gera o 

    código para conectar estes objetos a um banco de dados específico 

    Bean Managed (BMP) 

    Componentes com estados que fazem o encapsulamento de entidades complexas de um banco de dados. Neste caso o 

    desenvolvedor deve escreve o código necessário para acessar o objeto no banco de dados 

  • 1/25/2014

    8

    Programação para InternetProf. Flávio de Oliveira Silva, Ph.D.

    Apache Tomcat O apache Tomcat basicamente é um contêiner Web (Servlets e JSP) O Tomcat é a implementação de referência das especificações para

    Servlets e JavaServer Pages Estas especificações são desenvolvidas pela Sun através da JCP (Java

    Community Process). A JCP é uma entidade aberta que possui como membros pessoas e

    empresas envolvidas com a tecnologia Java. A seguintes tabela mostra as versões das especificações e as

    respectivas versões do Tomcat

    84

    EspecificaçõesServlet/JSP 

    Versão Apache Tomcat Versão Atual

    Versão Miníma Java SE

    3.0/2.2  7.0.x  7.0.21  1.62.5/2.1  6.0.x  6.0.32  1.52.4/2.0  5.5.x  5.5.33  1.42.3/1.2  4.1.x 4.1.40 1.32.2/1.1  3.3.x 3.3.2 1.1

    Programação para InternetProf. Flávio de Oliveira Silva, Ph.D.

    Apache Tomcat O apache Tomcat basicamente é um contêiner Web (Servlets e JSP) O Tomcat é a implementação de referência das especificações para

    Servlets e JavaServer Pages Estas especificações são desenvolvidas pela Sun através da JCP (Java

    Community Process). A JCP é uma entidade aberta que possui como membros pessoas e

    empresas envolvidas com a tecnologia Java. A seguintes tabela mostra as versões das especificações e as

    respectivas versões do Tomcat

    85

    EspecificaçõesServlet/JSP 

    Versão Apache Tomcat Versão Atual

    Versão Miníma Java SE

    3.0/2.2  7.0.x  7.0.12  1.62.5/2.1  6.0.x  6.0.32  1.52.4/2.0  5.5.x  5.5.33  1.42.3/1.2  4.1.x 4.1.40 1.32.2/1.1  3.3.x 3.3.2 1.1

  • 1/25/2014

    9

    Programação para InternetProf. Flávio de Oliveira Silva, Ph.D.

    Tomcat – Estrutura de Pastas

    86

    Programação para InternetProf. Flávio de Oliveira Silva, Ph.D.

    Tomcat – Estrutura de Pastas /bin

    Contém os scripts para inicialização (startup.sh / startup.bat) e finalização do contêiner web (shutdown.sh / shutdown.bat)

    /conf Arquivos de configuração do tomcat Server.xml

    Definição dos serviços (elemento )oferecidos pelo Tomcat. Um serviço consiste de uma coleção de conectores

    O conector (elemento ) representa um ponto onde é possível receber e responder a requests. Neste elemento é definido o protocolo e porta onde as requisições serão recebidas

    tomcat-users.xml Permite defnir papeis () e usuários () Certas aplicações que são fornecidas com o Tomcat necessitam de papéis

    específicos para funcionamento

  • 1/25/2014

    10

    Programação para InternetProf. Flávio de Oliveira Silva, Ph.D.

    Tomcat – Estrutura de Pastas /lib

    Arquivos .Jar que compõe o Tomcat /logs

    Arquivos de log produzidos pelo Tomcat durante a execução Um chamada do tipo “System.out.println()” dentro de um Servlet será gravada

    nos arquivos de log /webapps

    Aplicações Web Dinâmicas que estão disponíveis em uma instalação do Tomcat

    O nome de cada pasta equivale ao contexto da aplicação web e deve ser fornecido para acesso à mesma através do navegador

    Cada pasta destas deverá seguir o padrão para aplicações Web

    88

    Programação para InternetProf. Flávio de Oliveira Silva, Ph.D.

    Estrutura de uma aplicação WEB / (Raiz da Aplicação)

    Todos os arquivos de acesso públicos são colocados nesta pasta como por exemplo: HTML; JSP; GIF; etc.

    No caso do TOMCAT o diretório raiz da aplicação é criado dentro da pasta webapps

    /WEB-INF Os arquivos desta pasta não são de acesso público Esta pasta contém um arquivo chamado web.xml, conhecido como

    deployment descriptor, que contém as configurações para uma aplicação WEB

    /WEB-INF/classes Todas as classes java compiladas (.class) são colocadas neste local

    /WEB-INF/lib Todas as classes que estão compactadas em um arquivo JAR são colocadas

    neste diretório

    89

  • 1/25/2014

    11

    Programação para InternetProf. Flávio de Oliveira Silva, Ph.D.

    Deployment Descriptor O arquivo web.xml é conhecido como "deployment descriptor" Este arquivo contém toda a configuração do servlet que será utilizada

    pelo contêiner de servlets (Tomcat) Este arquivo é escrito em XML e deve possuir no mínimo os seguintes

    elementos:

  • 1/25/2014

    12

    Programação para InternetProf. Flávio de Oliveira Silva, Ph.D.

    Deployment Descriptor Servlets 2.5 - JSP 2.1 (Tomcat 6)

    web app name

    92

    Programação para InternetProf. Flávio de Oliveira Silva, Ph.D.

    Deployment Descriptor Servlets 2.4 - JSP 2.0 (Tomcat 5)

    web app name

    93

  • 1/25/2014

    13

    Programação para InternetProf. Flávio de Oliveira Silva, Ph.D.

    Deployment Descriptor Para acessar Servlets este deve possuir no mínimo os seguintes elementos:

    ServletUniqueNameservletClassFile

    ServletUniqueName/rootFolder

    94

    Programação para InternetProf. Flávio de Oliveira Silva, Ph.D.

    Deployment Descriptor O elemento contém dois elementos-filho que descrevem o servlet

    O elemento deve ser único no arquivo web.xml. Este nome será utilizado para referenciar o servle em outros elementos como no elemento

    O nome da classe ()é o nome completo a partir da pasta classes. Indica a classe será utilizada como resposta ao chamado do servlet

    Caso a classe esteja em um pacote o nome do mesmo deve ser utilizadoEx: com.mycompany.servlets.NomeClasse

    O elemento é utilizado para realizar uma ligação entre um caminhoe um determinado servlet Para isto este elemento contém um elemento-filho como o nome do Servlet () e um

    elemento () que descreve a um caminho URL Quando este caminho estiver presente a solicitação será mapeada para o servlet indicado no

    arquivo web.xml - indicado por () Exemplos:

    /servApp – Neste caso qualquer URL que finalize com /servApp será mapeada para oservlet (http://localhost:8080/{contextpath}/servApp)*.do – Neste caso qualquer URL que termine com a string ".do" será mapeada para o servlet(http://localhost:8080/{contextpath}/login.do

    95

  • 1/25/2014

    14

    Programação para InternetProf. Flávio de Oliveira Silva, Ph.D.

    Deployment DescriptorExemplo

    96

    Programação para InternetProf. Flávio de Oliveira Silva, Ph.D.

    Aplicações WEB Em sua concepção a WEB é um meio para a troca de documentos HTML

    entre diferentes pontos, utilizando a infra-estrutura oferecida pela Internet.

    A medida que a WEB se popularizou novas aplicações começaram a surgir

    Em muitos sites da WEB o conteúdo não poderia ser constituído de código HTML estático, mas precisaria ser alterado, muitas das vezes a cada minuto.

    A partir desta necessidade começaram a surgir meios para se conseguir a produção de conteúdos dinâmicos

    A primeira proposta para a criação de conteúdos dinâmicos foi através do CGI (Common Gateway Interface)

    Este mecanismo permite a execução de um código, escrito em C ou Perl, através do navegador

    97

  • 1/25/2014

    15

    Programação para InternetProf. Flávio de Oliveira Silva, Ph.D.

    Aplicações WEB Usando CGI Uma aplicação CGI pode ser invocada da seguinte forma:http://www.server.com/cgi-bin/MyExecutable?name1=value1&name2=value2 Aplicação CGI, porém apresenta algumas desvantagens:

    Criada a partir de linguagens procedimentais Instabilidade em uma aplicação CGI pode impedir até a operação do servidor Problemas de Escalabilidade. A cada chamada uma nova instância da

    aplicação é criada, criando um novo thread e consumindo recursos do servidor.

    Outro aspecto é que através de uma aplicação CGI não é possível agregar recursos na aplicação como: estabelecimento de sessão; autenticação e autorização.

    Neste contexto e como uma resposta a estas desvantagens, na plataforma Java foi desenvolvido o conceito dos Servlets

    98

    Programação para InternetProf. Flávio de Oliveira Silva, Ph.D.

    Aplicações WEB Usando Servlets São programas Java que podem ser chamados dinamicamente e que

    podem executar alguma funcionalidade. Este programas podem ser executado em um Servidor Web ou em um

    contêiner para Servlets Todos os Servlets implementam a interface Servlet O servlet possui um ciclo de vida padrão e desta forma os métodos são

    chamados de uma maneira pré-determinada. init() service() destroy()

    99

  • 1/25/2014

    16

    Programação para InternetProf. Flávio de Oliveira Silva, Ph.D.

    Servlets - Operações Métodos são chamados durante o ciclo de vida de um Servlet:

    init() Chamado na inicialização do Servlet uma única vez, antes que o mesmo possa

    responder às requisições feitas pelos clientes. service()

    Chamado a fim de que o Servlet possa responder a uma solicitação. Em aplicações HTTP este método verifica qual o tipo de requisição (GET, POST,

    etc.) e encaminha o fluxo, conforme cada caso, para o métodos que tratarão cada situação

    Uma mesma instância de um Servlet pode ser utilizada por vários clientes, permitindo desta forma a economia de recursos do servidor.

    destroy() Chamado uma única vez, antes que o objeto seja destruído. Responsável pela liberação dos recursos alocados pelo método init()

    100

    Programação para InternetProf. Flávio de Oliveira Silva, Ph.D.

    Servlets – API Java Os Servlets são definidos como uma interface na API Java, sendo assim uma

    classe qualquer deve implementar esta interface a fim de que possa ser considerando um Servlet

    Esta interface é definida no pacote javax.servlet Métodos definidos pela interface:

    void destroy() Responsável pela finalização do Servlet e liberação de recursos

    ServletConfig getServletConfig() Retorna um objeto ServeletConfig que contém informações de inicialização e de configuração

    de um Servlet java.lang.String getServletInfo()

    Retorna informações sobre o Servlet como autor,versão; etc void init(ServletConfig config)

    Responsável pela inicialização e alocação de recursos void service(ServletRequest req, ServletResponse res)

    Chamado pelo contêiner a fim de que o Servlet possa responder a uma requisição de serviço.

    Esta interface é implementada pela classes: javax.servlet.GenericServlet; javax.servlet.http.HttpServlet

    101

  • 1/25/2014

    17

    Programação para InternetProf. Flávio de Oliveira Silva, Ph.D.

    HttpServlet Normalmente os Servlets a fim de serem executados sobre o protocolo

    HTTP, o mesmo utilizado pela WEB O protocolo HTTP define as seguintes operações:

    GET Requisita uma página para leitura

    HEAD Requisita o cabeçalho de uma página WEB

    PUT Envia uma página a fim de ser escrita em servidor WEB

    POST Envia informações que são adicionadas a uma página WEB

    DELETE Remove uma página WEB

    A classe HttpServlet uma classe abstrata que cria um Servlet próprio para uso com a Web.

    Esta classe está definida no seguinte pacote: javax.servlet.http102

    Programação para InternetProf. Flávio de Oliveira Silva, Ph.D.

    HttpServlet A classe HpptServlet define os métodos para que o Servlet possa ser utilizado

    juntamente com o protocolo HTTP Normalmente uma classe deverá especializar os métodos definidos nesta classe

    a fim de imprimir o comportamento desejado pelo Servlet Métodos principais

    doGet(HttpServletRequest req, HttpServletResponse resp) Utilizado em requisições do tipo HTTP GET

    doHead(HttpServletRequest req, HttpServletResponse resp) Utilizado em requisições do tipo HTTP HEAD

    doPost(HttpServletRequest req, HttpServletResponse resp) Utilizado em requisições do tipo HTTP POST

    doPut(HttpServletRequest req, HttpServletResponse resp) Utilizado em requisições do tipo HTTP PUT

    doDelete(HttpServletRequest req, HttpServletResponse resp) Utilizado em requisições do tipo HTTP DELETE

    init; destroy; getServletInfo

    103

  • 1/25/2014

    18

    Programação para InternetProf. Flávio de Oliveira Silva, Ph.D.

    HttpServlet Normalmente os métodos Service, doOptions e doTrace não são

    especializados Os método doGet() e doPost() são os métodos usualmente

    especializados As informações utilizadas na requisição e na resposta estão

    encapsuladas em HttpServletRequest e HttpServletResponse

    104

    Programação para InternetProf. Flávio de Oliveira Silva, Ph.D.

    HttpServlet Além dos métodos descritos anteriormente que devem ser especializados

    existe outros métodos muito utilizados em um Servlet public ServletContext getServletContext()

    Permite o obter um objeto que representa o contêiner do Servlet public ServletConfig getServletConfig()

    Recupera um objeto ServletConfig. Este objeto contém a configuração do Servlet que contém parâmetros de

    inicialização do Servlet, definidos no arquivo WEB.XML public void log(java.lang.String msg)

    Escreve uma mensagem no arquivo de log do contêiner de Servlets O nome do Servlet é adicionado ao início da mensagem (msg)

    105

  • 1/25/2014

    19

    Programação para InternetProf. Flávio de Oliveira Silva, Ph.D.

    HttpServletRequest A classe HpptServletRequest representa o pedido (request)

    que é enviado do navegador(cliente) para o servidor (contêiner de Servlets)

    Todos os parâmetros que são passados do cliente para o servidor estão encapsulados neste objeto

    Este objeto é instanciado pelo contêiner e entregue para uso do servlet

    Os principais métodos da classe HttpServlet sempre recebem um objeto HttpServletRequest

    106

    Programação para InternetProf. Flávio de Oliveira Silva, Ph.D.

    HttpServletRequestMétodos Principais public java.lang.String getParameter(java.lang.String name)

    Este método permite o acesso a parâmetros que são recebidos do cliente. Cada parâmetro possui um nome (name) que deve ser informado O nome está definido em um Form Html ou então na URL de acesso ao servlethttp://host/myWebApplication/MyApp?cmd=value1&otherParam=value2Ex: String sCmd = (String) request.getParameter("cmd");

    public HttpSession getSession() Retorna uma sessão (objeto HttpSession) associado ao pedido e caso a mesma não

    exista uma nova sessão é criada Através da sessão é possível compartilhar objetos entre vários execuções

    pedido/resposta de um servletEx: HttpSession session = request.getSession();

    public HttpSession getSession(boolean create) Retorna uma sessão (objeto HttpSession) associado ao pedido Uma nova sessão é criada somente se o parâmetro create igual a true

    107

  • 1/25/2014

    20

    Programação para InternetProf. Flávio de Oliveira Silva, Ph.D.

    HttpServletResponse A classe HpptServletRequest representa a reposta(response) que é

    enviada do servidor (contêiner de Servlets) para o navegador(cliente) Este objeto é instanciado pelo contêiner e normalmente é alterado pelo

    servlet a fim de produzir o resultado desejado Os principais métodos da classe HttpServlet sempre recebem um objeto

    HttpServletResponse Basicamente o servlet consiste em alterar este objeto conforme o

    necessário Este objeto contém métodos que permite o acesso ao cabeçalho

    (headers) HTTP e cookies bem como ao conteúdo da resposta

    108

    Programação para InternetProf. Flávio de Oliveira Silva, Ph.D.

    HttpServletResponseMétodos Principais public void setContentType(java.lang.String type)

    Permite definir o tipo de resposta que será devolvida ao navegador O tipo mais comum é "text/hmtl"

    public java.io.PrintWriter getWriter() throws java.io.IOException Este método obtém a stream (sequência de dados) que será utilizada na

    resposta Neste caso a stream representa uma sequência de carateres, como é um

    caso do conteúdo do tipo "text/html" public ServletOutputStream getOutputStream() throws

    java.io.IOException Este método obtém a stream (sequência de dados) que será utilizada na

    resposta Neste caso a stream representa uma sequência de bytes (binária), como é

    um caso do conteúdo do tipo MIME (Multipurpose Internet Mail Extensions) como por exemplo: “application/zip”; application/pdf ou "image/jpeg"

    109

  • 1/25/2014

    21

    Programação para InternetProf. Flávio de Oliveira Silva, Ph.D.

    Servlet Básico – Exemplo 1package org.lp2.servlet;import java.io.*; import javax.servlet.*;public class HelloWorldServlet extends HttpServlet {protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    //Indica que o conteudo da reposta é página htmlresponse.setContentType("text/html");//Obtém a stream de caracteres da saídaPrintWriter out = response.getWriter();//Conteúdo básico de uma página HTMLout.println("");out.println("");out.println("");out.println("");out.println("HELLO SERVLET WORLD!");out.println("");out.println("");out.println("");}

    }

    110

    Programação para InternetProf. Flávio de Oliveira Silva, Ph.D.

    Servet Básico – Exemplo 2Passagem de Parâmetrospackage org.lp2.servlet;import java.io.*; import javax.servlet.*;public class ParameterServlet extends HttpServlet {protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    //Obém o valor do parâmetroString sCmd = (String) request.getParameter("cmd");response.setContentType("text/html");PrintWriter out = response.getWriter();out.println("");out.println("");out.println("");out.println("Uso de Parâmetros em um Servlet!");out.println("COMANDO = "+sCmd);out.println("");out.println("O nome do comando acima foi passado como parâmetro.");out.println("");out.println("");}

    }

    111

  • 1/25/2014

    22

    Programação para InternetProf. Flávio de Oliveira Silva, Ph.D.

    Servet Básico – Exemplo 3Passagem de Parâmetros – Loginpackage org.lp2.servlet;import java.io.*;import java.util.HashMap;import javax.servlet.*;import javax.servlet.http.*;public class LoginServlet extends HttpServlet {//Neste caso tanto doGet como doPost executarão as memas operaçõesprotected void doPost(HttpServletRequest arg0, HttpServletResponse arg1) throws ServletException, IOException {

    doGet(arg0,arg1);}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    //Para definir os usuários e suas senha será criado um HashMap//que contém o nome do usuário e sua senhaHashMap users = new HashMap();users.put("flavio", "123");users.put("mateus", "456");users.put("lucas", "101");users.put("joao", "1213");//continua

    112

    Programação para InternetProf. Flávio de Oliveira Silva, Ph.D.

    Servet Básico – Exemplo 3Passagem de Parâmetros – Login

    //Obtém o valor do parâmetroString sNome = (String) request.getParameter("nome");String sSenha = (String) request.getParameter("senha");String sStatus;//Neste momento o Servlet poderia chamar uma classe//responsável pela realização do serviço de login//Neste exemplo, a fim simplificar será feita uma busca em um//HashMap de usuarios e senhas. Neste mapa será fácil executar a a pesquisaif (!users.containsKey(sNome)) {

    sStatus = "USUÁRIO NÃO CADASTRADO!";}else {

    //Verifica se a senha está corretaString sUserPass = users.get(sNome);if (sUserPass.equals(sSenha))sStatus = sNome + " - ACESSO AUTORIZADO! Seja bem-vindo";elsesStatus = "ACESSO NÃO AUTORIZADO!";

    }//continua

    113

  • 1/25/2014

    23

    Programação para InternetProf. Flávio de Oliveira Silva, Ph.D.

    Servet Básico – Exemplo 3Passagem de Parâmetros – Login

    //respostaresponse.setContentType("text/html");PrintWriter out = response.getWriter();out.println("");out.println("");out.println(" :) Login no Sistema ---- ");out.println("");out.println("");out.println("");out.println("Uso de Forms HTML em um Servlet!");out.println("LOGIN – RESULTADO" + sStatus);out.println("");out.println("");out.println("");

    }}

    114

    Programação para InternetProf. Flávio de Oliveira Silva, Ph.D.

    Servet Básico – Exemplo 3Passagem de Parâmetros – Login O Servlet pode ser chamado utilizando o seguinte formulário HTML

    Formulário de Login

    Bem vindo à Página de Login...

    Digite Seu Nome Digite Sua senha

    Os parâmetros "nome" e "senha" são obtidos no form e enviado no pedido (request) para o servidor

    115

  • 1/25/2014

    24

    Programação para InternetProf. Flávio de Oliveira Silva, Ph.D.

    ServletsClasses API – Visão Geral

    116

    Web Container (Tomcat)

    Request

    ResponseMyServletClass

    HttpServletRequest

    HttpServletResponse

    MyWebApplication

    OtherWebApplication

    http://host/MyWebApp/MyServlet

    host

    HttpServletResponse

    RequestDispatcher

    HttpServlet

    serv1 com.Serv1Servlet name value

    ServletConfig

    OtherServletClass

    HttpSession

    Browser

    ServletContext

    ServletConfig

    Programação para InternetProf. Flávio de Oliveira Silva, Ph.D.

    ServletContext Esta classe representa o contexto da aplicação ou seja o contêiner de um

    Servlet Através desta classe o Servlet pode obter parâmetros comuns existentes

    no arquivo WEB.XML; obter acesso ao arquivo de log da aplicação e ainda redirecionar pedidos

    Existe uma única instância deste objeto em cada aplicação Web. A aplicação Web pode conter vários Servlets e todos compartilham o

    mesmo contexto. Cada Servlet possui associado um objeto da classe ServletConfig que

    representa configurações particulares deste Servlet Estas configurações são expressas no element do arquivo web.xml

    117

  • 1/25/2014

    25

    Programação para InternetProf. Flávio de Oliveira Silva, Ph.D.

    Passagem de Parâmetros deConfiguração Context-Param

    O elemento context-param permite o uso parâmetros de inicialização para todo o sistema

    A partir de qualquer servlet ou página JSP é possível obter seus valores através do método getInitParameter da classe ServletContext

    O elemento contém dois elementos filhos que contém o nome do parâmetro (param-name) e o valor do parâmetro (param-value)

    O parâmetro sempre é obtido como String

    [email protected]

    118

    Programação para InternetProf. Flávio de Oliveira Silva, Ph.D.

    ServletContextMétodos Principais Representa o contexto da aplicação

    Caminho físico de arquivos; web.xml O objeto ServletContext poder ser obtido com o seguinte método da classe

    HttpServlet public ServletContext getServletContext()

    public java.lang.String getInitParameter(java.lang.String name) Este método permite obter o valor de parâmetros existentes no arquivo WEB.XML Para isto é necessário informar o nome do parâmetro (name) Um exemplo de parâmetros é uma string que contém o nome do banco de dados

    public RequestDispatcher getRequestDispatcher(java.lang.String path) O RequestDispatcher é um objeto que recebe pedido do cliente e envia este pedido

    para qualquer recurso de uma aplicação web existente no servidor, como por exemplo, um Servlet, um arquivo HTML ou um JSP

    Para obter este objeto é necessário informar o caminho (path) do recursoRequestDispatcher rd = request.getRequestDispatcher("/CatalogView.jsp")

    119

  • 1/25/2014

    26

    Programação para InternetProf. Flávio de Oliveira Silva, Ph.D.

    HttpSession O protocolo HTTP é stateless, ou seja, um conjunto request/response

    independe de outro Normalmente é necessário implementar na aplicação do conceito de

    sessão onde um conjunto de diferentes request/reponse estão ligados entre si Exemplo: Aplicação bancária – agência e conta são informadas apenas no

    primeiro request, porém é compartilhada por todos os outros request/response

    Classe Implementa o conceito de sessão Métodos principais

    Object getAttribute(String name) void setAttribute(String name, Object value) void invalidate() void setMaxInactiveInterval(int interval) boolean isNew()

    120

    Programação para InternetProf. Flávio de Oliveira Silva, Ph.D.

    ServletsClasses API – Visão Geral

    121

    Web Container (Tomcat)

    Request

    ResponseMyServletClass

    HttpServletRequest

    HttpServletResponse

    MyWebApplication

    OtherWebApplication

    http://host/MyWebApp/MyServlet

    host

    HttpServletResponse

    RequestDispatcher

    HttpServlet

    serv1 com.Serv1Servlet name value

    ServletConfig

    OtherServletClass

    HttpSession

    Browser

    ServletContext

    ServletConfig

  • 1/25/2014

    27

    Programação para InternetProf. Flávio de Oliveira Silva, Ph.D.

    Armazenamento e Recuperação de Informações (Objetos) É possível armazenar e recuperar informações em tempo de

    execução de um servlet Desta forma é possível o intercambio de informações entre

    diferentes servlets Armazenar Objeto

    void setAttribute(String name, Object object)

    Recuperar Objeto Object getAttribute(String name)

    122

    Programação para InternetProf. Flávio de Oliveira Silva, Ph.D.

    Armazenamento e Recuperação de Informações (Objetos) O objeto armazenado pode estar em diferentes escopos, conforme sua

    necessidade Nível Aplicação

    Classe: ServletContext Objeto armazenado está disponível para todos os servlets daquele contexto, todas as

    sessões existentes e qualquer pedido ou resposta Durante toda a execução da aplicação

    Nível Sessão Classe: HttpSession Objeto armazenado esteja disponível para todos os servlets de uma única sessão Duração equivalente à Sessão

    Nível Pedido HttpServletRequest Objeto armazenado pode ser enviado para outro servlet através do RequestDispatcher Duração do pedido

    123

  • 1/25/2014

    28

    Programação para InternetProf. Flávio de Oliveira Silva, Ph.D.

    ServletsEncaminhamento de Pedido Uma operação comum entre vários servlets é o encaminhamento do

    pedido (request) Para isto é utilizado a classe RequestDispatcher Este objeto pode ser obtido tanto a partir do contexto da aplicação

    (ServletContext) quanto de um pedido (HttpServletRequest) O código abaixo mostra como encaminhar o pedido uma página de erro

    (/errorpage) que neste caso pode ser tratado por outro servlet

    1. RequestDispatcher rd; 2. rd = request.getRequestDispatcher("/errorpage");

    //Encaminhar request e response para outro servlet3. rd.forward(request, response);

    124

    Programação para InternetProf. Flávio de Oliveira Silva, Ph.D.

    ExemploRealização Login

    125

    Bem vindo à Página de Login... Digite Seu Nome Digite Sua senha

    LoginServlet br.ufu.facom.pi.servlets.LoginServlet LoginServlet /login AppServlet br.ufu.facom.pi.servlets.AppServlet AppServlet /apphome ErroServlet br.ufu.facom.pi.servlets.LoginErrorServlet ErroServlet /error

    LoginServlet

    index.html

    AppServlet

    response

    Web Container (Tomcat)

    LoginErrorServlet

    request

    Web Browser

    HomePage(html)

    ErrorPage(html) response

  • 1/25/2014

    29

    Programação para InternetProf. Flávio de Oliveira Silva, Ph.D.

    Exemplo – LoginEncaminhamento Pedido

    126

    Programação para InternetProf. Flávio de Oliveira Silva, Ph.D.

    Armazenamento e Recuperação de InformaçõesContexto Aplicação (ServletContext)1. public class LoginStaticServlet extends HttpServlet {2. public void init(ServletConfig config) throws ServletException {3. super.init(config);4. ServletContext context = config.getServletContext();5. context.setAttribute("LOGINCOUNTER",new Integer(0));6. }7. protected void doPost(HttpServletRequest request, HttpServletResponse

    response) throws ServletException, IOException {8. //...9. String loginreceived = request.getParameter("user");10. String password = request.getParameter("password");11. ServletContext context = this.getServletContext();12. retorno = service.doLogin(loginreceived, password);13. if (retorno){14. //login com sucesso15. Integer loginCounter;16. loginCounter = (Integer) context.getAttribute("LOGINCOUNTER");17. //A cada login com sucesso o contador é acrescido de um18. loginCounter = loginCounter + 1;19. context.setAttribute("LOGINCOUNTER", loginCounter);20. }21. } 127

  • 1/25/2014

    30

    Programação para InternetProf. Flávio de Oliveira Silva, Ph.D.

    Armazenamento de InformaçõesContexto da Sessão1. public class LoginStaticServlet extends HttpServlet {2. protected void doPost(HttpServletRequest request, HttpServletResponse

    response) throws ServletException, IOException {3. //...4. retorno = service.doLogin(loginreceived, password);5. if (retorno){6. //login com sucesso7. //...8. //Cria a sessão usuário, caso a mesma não exista9. HttpSession session = request.getSession(true);10. //Armazena o nome do usuário na sessão11. session.setAttribute("USER", loginreceived);12. //...13. //Encaminha pedido para o AppServerlet14. RequestDispatcher rd;15. rd = request.getRequestDispatcher("/apphome");16. rd.forward(request, response);17. }18. }

    128

    Programação para InternetProf. Flávio de Oliveira Silva, Ph.D.

    Recuperação de InformaçõesContexto da Aplicação e Sessão1. public class AppServlet extends HttpServlet {2. protected void doPost(HttpServletRequest request, HttpServletResponse3. response) throws ServletException, IOException {4. //recupera o contexto da aplicação e o valor dos atributos5. ServletContext context = this.getServletContext();6. Integer logCounter = (Integer) context.getAttribute("LOGINCOUNTER");7. //Obtem o nome do usuario que realizou o login8. HttpSession session = request.getSession();9. String sLoginName = (String) session.getAttribute("USER");10. response.setContentType("text/html");11. PrintWriter out = response.getWriter();12. out.println("");13. out.println("");14. out.println("AppHome");15. out.println("");16. out.println("");17. out.println("Bem Vindo " + sLoginName);18. out.println("Sistema acessado "+ logCounter.toString()+ " vezes");19. out.println("");20. out.println(""); 21. }22. } 129

  • 1/25/2014

    31

    Programação para InternetProf. Flávio de Oliveira Silva, Ph.D.

    ServletPapéis No geral os servlets os servlets estão relacionados com dois papéis básicos

    Controle Neste caso o servlet não é responsável pela produção de conteúdo Obtém informações de parâmetros Realiza operações invocando serviços de outras classes Obtém dados enviados pelo Navegador (Parâmetros) Armazena dados no contexto da aplicação, da sessão ou do pedido

    ServletContext; HttpSession e HttpServletRequest Encaminha pedido para outros servlets

    RequestDispatcher Exemplo Anterior: LoginServlet

    Conteúdo Responsável pela produção de conteúdo Servlet que efetivamente produz o código HTML Devolve a resposta para o cliente Obtém dados armazenados no contexto da aplicação, da sessão ou do pedido Exemplo Anterior: AppServlet e LoginErrorServlet

    130

    Programação para InternetProf. Flávio de Oliveira Silva, Ph.D.

    Arquitetura MVC para WEB No caso da abordagem WEB existem algumas

    particularidades, então o padrão ficou conhecido como "Model 2"

    Esta particularidade acontece pois o browser não é necessariamente a parte VIEW do modelo pois o mesmo simplesmente mostra um código HTML

    Desta forma o código mostrado no browser está desacoplado, pois precisa ser traduzido para o HMTL antes de ser visualizado.

    131

  • 1/25/2014

    32

    Programação para InternetProf. Flávio de Oliveira Silva, Ph.D.

    Model 1 x Model 2 Model 1

    Primeiro modelo disponível para o desenvolvimento de aplicações WEB Elementos: Browser; Servlets/Páginas JSP e um Banco de dados Neste modelo pode ocorrer duplicação de código As regras de negócio e a Apresentação dos dados estão combinadas em um único

    elemento, dificultando modificações e manutenções

    132

    Programação para InternetProf. Flávio de Oliveira Silva, Ph.D.

    Model 1 x Model 2 Model 2

    Segundo modelo disponível para o desenvolvimento de aplicações WEB Baseado no modelo MVC (Model – View – Controller) Elementos: Browser; Controller (Servlets); View(Servlets ou Páginas JSP);

    Model(Outras classes) e um Banco de dados Elementos separados e responsabilidades bem definidas Facilita a reutilização de código e futuras modificações Permite o uso de múltiplos Banco de Dados e Clientes

    133

  • 1/25/2014

    33

    Programação para InternetProf. Flávio de Oliveira Silva, Ph.D.

    Arquitetura MODEL 2

    1. O usuário envia o pedido que é recebido por um servlet de controle (Controller)2. O servlet instância um ou mais Beans (Classes Java) para realizar o trabalho3. O servlet adiciona os Beans no pedido, sessão ou contexto da aplicação e envia

    o pedido para um Servlet de Conteúdo ou uma página JSP (VIEW)4. Este finalmente extrai os dados destes Beans, produz a resposta HTML e envia

    o resultado (response)

    134

    Programação para InternetProf. Flávio de Oliveira Silva, Ph.D.

    Exemplo - Realização LoginSeparando Controle e Conteúdo

    135

    Bem vindo à Página de Login... Digite Seu Nome Digite Sua senha

    LoginServlet br.ufu.facom.pi.servlets.LoginServlet LoginServlet /login AppServlet br.ufu.facom.pi.servlets.AppServlet AppServlet /apphome ErroServlet br.ufu.facom.pi.servlets.LoginErrorServlet ErroServlet /error

    LoginServlet

    index.html

    AppServlet

    response

    Web Container (Tomcat)

    LoginErrorServlet

    request

    Web Browser

    HomePage(html)

    ErrorPage(html) response

  • 1/25/2014

    34

    Programação para InternetProf. Flávio de Oliveira Silva, Ph.D.

    Exemplo 4 – LoginServletServlet de Controle – init()package br.ufu.facom.pi.servlets;

    import java.io.*;

    import java.util.HashMap;

    import javax.servlet.*;

    import javax.servlet.http.*;

    public class LoginServlet extends HttpServlet {

    public void init(ServletConfig config) throws ServletException {

    super.init(config);

    //Para definir os usuários e suas senha será criado um HashMap com estas informações

    //Este mapa contém o nome do usuário e sua senha

    //Neste caso o mapa será inicializado uma única vez

    HashMap users = new HashMap();

    users.put("flavio", "123");

    users.put("mateus", "456");

    ServletContext context = config.getServletContext();

    context.setAttribute("USERS", users);

    }

    //Neste caso tanto doGet como doPost executarão as mesmas operações

    protected void doPost(HttpServletRequest arg0, HttpServletResponse arg1) throwsServletException, IOException {

    this.doGet(arg0,arg1);

    }

    //continua...

    136

    Programação para InternetProf. Flávio de Oliveira Silva, Ph.D.

    Exemplo 4 – LoginServletServlet de Controle – doGet()protected void doGet(HttpServletRequest request, HttpServletResponse response) throws

    ServletException, IOException {

    String sNome = (String) request.getParameter("nome");

    String sSenha = (String) request.getParameter("senha");

    HashMap users;

    ServletContext context = this.getServletContext();

    users = (HashMap) context.getAttribute("USERS");

    //invoca serviço

    LoginService service = new LoginService();

    int iRetorno = service.doLogin(sNome, sSenha, users);

    String sStatus, sNextServlet("/error");

    if (iRetorno == 0) {

    sStatus = "ACESSO AUTORIZADO! Seja bem-vindo";

    HttpSession session = request.getSession(true);

    session.setAttribute("USER",sNome); //salva nome do usuário na sessão

    sNextServlet = "/apphome";

    }

    else if (iRetorno == 1) {

    sStatus = "USUÁRIO NÃO CADASTRADO!";

    }else {

    sStatus = "ACESSO NÃO AUTORIZADO!";

    }

    request.setAttribute("STATUS", sStatus); //salva status no nível do pedido

    137

  • 1/25/2014

    35

    Programação para InternetProf. Flávio de Oliveira Silva, Ph.D.

    Exemplo 4 – LoginServletServlet de Controle – doGet()

    //Encaminha pedido para o Servlet de conteúdo de acordo com a variável sNextServletRequestDispatcher rd;rd = request.getRequestDispatcher(sNextServlet);rd.forward(request, response);

    }

    138

    Programação para InternetProf. Flávio de Oliveira Silva, Ph.D.

    Exemplo 4 – LoginServiceClasse de Serviço (Model)public class LoginService {

    public int doLogin(String sNome, String sSenha, HashMap) {

    //Neste exemplo, a fim simplificar será feita uma busca em um

    //HashMap de usuarios e senhas. Neste mapa será fácil executar a a pesquisa

    int iRetorno;

    if (!users.containsKey(sNome)) {

    iRetorno = 1; //usuário não cadastrado

    }

    else {

    //Verifica se a senha está correta

    String sUserPass = users.get(sNome);

    if (sUserPass.equals(sSenha))

    iRetorno = 0; //senha do usuário cadastrado

    else

    iRetorno = 2; //senha incorreta - usuário não autorizado

    }

    }

    }

    139

  • 1/25/2014

    36

    Programação para InternetProf. Flávio de Oliveira Silva, Ph.D.

    AppServlet – Exemplo 4Servlet de Conteúdopackage br.ufu.facom.pi.servlets;

    //imports...

    public class AppServlet extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throwsServletException, IOException {

    String sStatus = (String)request.getAttribute("STATUS");

    HttpSession session = request.getSession();

    String sUser = session.getAttribute("USER");

    //ajuste do tipo de resposta

    response.setContentType("text/html");

    PrintWriter out = response.getWriter();

    response.setContentType("text/html");

    PrintWriter out = response.getWriter();

    out.println("");

    out.println("");

    out.println("AppHome");

    out.println("");

    out.println("");

    out.println("Bem Vindo " + sUser);

    out.println("

    Status:" + sStatus);

    out.println("");

    out.println("");

    }

    }

    140

    Programação para InternetProf. Flávio de Oliveira Silva, Ph.D.

    Exemplo 4 – LoginErrorServletServlet de Conteúdopackage br.ufu.facom.pi.servlets;

    //imports…

    public class LoginErrorServlet extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throwsServletException, IOException {

    String sStatus = (String)request.getAttribute("STATUS");

    //ajuste do tipo de resposta

    response.setContentType("text/html");

    PrintWriter out = response.getWriter();

    response.setContentType("text/html");

    PrintWriter out = response.getWriter();

    out.println("");

    out.println("");

    out.println("AppHome – Página de Erro");

    out.println("");

    out.println("");

    out.println("

    Status:" + sStatus);

    out.println("");

    out.println("");

    }

    }

    141