Desenvolvimento de Sistemas Web - ?· Quando o servidor recebe uma requisição, ela é repassada para…

  • Published on
    11-Nov-2018

  • View
    212

  • Download
    0

Embed Size (px)

Transcript

  • Desenvolvimento de Sistemas Web

    Introduo

    Prof. Fellipe Aleixo (fellipe.aleixo@ifrn.edu.br)

  • Modelo de Aplicaes Web

    Modelo cliente-servidor

    Clientes so navegadores Web

    Servidores estendem a funcionalidade de servidores Web

  • Protocolo HTTP

    Protocolo baseado no modelo requisio-resposta

    Protocolo sem estado

    Requisies HTTP - GET, POST, PUT, etc.

    Retorno textual baseado em HTML ou outros contedos MIME

  • CGI-BIN

    Possibilidade de invocar "comandos" atravs de requisies HTTP

    Base para uns srie de tecnologias para desenvolvimento de sistemas Web

  • Frameworks de Desenvolvimento Web

    Java Tecnologia de Servlet (interface Java)

    Evolues na forma de JavaServer Pages e JavaServer Pages

    Rails Framework para o desenvolvimento de aplicaes

    Web em Ruby

    Linguagem de script orientada a objetos

    Aplicao do modelo MVC

  • Modelo MVC

    Model-View-Controller

  • Controle de Sesses

    Supre uma deficincia do protocolo HTTP (no guardar informaes de estado do cliente)

  • Cookies

  • SERVLETSTecnologia de Servlets

  • O que so Servlets?

    Extenso de servidor escrita em Java Podem ser usados para estender qualquer tipo de aplicao do

    modelo requisio-resposta

    Todo servlet implementa a interface javax.servlet.Servlet Tipicamente estende GenericServlet

    Servlets HTTP Extenses para servidores Web

    Estendem javax.servlet.http.HttpServlet

    Lidam com caractersticas tpicas do HTTP como mtodos GET, POST, Cookies, etc.

  • API: Fundamental

    Principais classes e interfaces de javax.servlet Interfaces

    Servlet, ServletConfig, ServletContext Filter, FilterChain, FilterConfig ServletRequest, ServletResponse SingleThreadModel RequestDispatcher

    Classes abstratas GenericServlet

    Classes concretas ServletException UnavailableException ServletInputStream e ServletOutputStream

  • Ciclo de Vida

    1. Quando o servidor recebe uma requisio, ela repassada para o container que a delega a um servlet

    2. O container1. Carrega a classe na memria2. Cria uma instncia da classe do servlet3. Inicializa a instncia chamando o mtodo init()

    3. Depois que o servlet foi inicializado, cada requisio executada em um mtodo service()

    1. O container cria um objeto de requisio (ServletRequest) e de resposta (ServletResponse) e depois chama service() passando os objetos como parmetros

    2. Quando a resposta enviada, os objetos so destrudos

    4. Quando o container decidir remover o servlet da memria, ele o finaliza chamando destroy()

  • Ciclo de Vida

    [Argonavis]

  • Como Escrever um Servlet?

    Um servlet genrico deve estender GenericServlet e seu mtodo service()

    import javax.servlet.*;

    import java.io.*;

    public class Generico extends GenericServlet {

    public void service (ServletRequest request, ServletResponse response)

    throws IOException {

    PrintWriter out = response.getWriter();

    out.println("Hello, World!");

    out.close();

    }

    }

  • Inicializao de um Servlet

    Inicializao: sobrescrever o mtodo init(config) com Carregar parmetros de inicializao, dados de configurao

    Obter outros recursos

    Falha na inicializao deve provocar UnavailableException (subclasse de ServletException)

    public void init(ServletConfig config)

    throws ServletException {

    String dirImagens = config.getInitParameter("imagens");

    if (dirImagens == null) {

    throw new UnavailableException(

    "Configurao incorreta!");

    }

    }

  • Finalizao

    Quando um continer decide remover um servlet da memria, ele chama o seu mtodo destroy() Com o objetivo de liberar recursos (ex.: conexo de banco de dados)

    O servlet geralmente s destrudo quando todos os seus mtodos service() terminaram ou depois de um timeout

    public void destroy() {

    banco.close();

    banco = null;

    }

  • Mtodos de Servio

    Implementam operaes de resposta executadas quando o cliente envia uma requisio

    Recebem dois parmetros: um objeto ServletRequeste outro ServletResponse

    Tarefas usuais de um mtodo de servio Extrair informaes da requisio Acessar recursos externos Escrever a resposta (HTTP (i) preencher os cabealhos

    de resposta, (ii) obter um stream de resposta e (iii) escrever os dados no stream

  • Mtodos de Servio

    O mtodo de servio de um servlet genrico abstratopublic void service(ServletRequest, ServletResponse)

    definido em javax.servlet.Servlet.

    Sempre que um servidor repassar uma requisio a um servlet, ele chamar o mtodo service(request, response)

    Um servlet genrico dever sobrepor este mtodo e utilizar os objetos ServletRequest e ServletResponse

  • Servlets Genricos

    Servlets genricos servem como componentes para servios tipo requisio-resposta em geral No se limitam a servios HTTP

    Podem ser usados para estender um servio existente: preciso implementar um "container" para rodar o servlet

    Para servios Web deve-se usar Servlets HTTP API criada especificamente para lidar com caractersticas

    prprias do HTTP

    Mtodo service() dividido em mtodos especficos para tratar os diferentes mtodos do HTTP

  • API: Servlets HTTP

    Classes e interfaces mais importantes do pacote javax.servlet.http Interfaces

    HttpServletRequest

    HttpServletResponse

    HttpSession

    Classes abstratas HttpServlet

    Classes concretas Cookie

  • Como Escrever um Servlet HTTP

    Para escrever um servlet HTTP, deve-se estender HttpServlet e implementar um ou mais de seus mtodos de servio e anotar com @WebServlet para mapear uma URL

    import javax.servlet.annotation.WebServlet;

    import javax.servlet.http.HttpServlet;

    import java.io.PrinterWriter;

    @WebServlet(/hello)

    public class ServletWeb extends HttpServlet {

    public void doGet (HttpServletRequest request,

    HttpServletResponse response)throws IOException {

    response.setContentType("text/html");

    PrintWriter out = response.getWriter();

    out.println("Hello, World!");

    out.close();

    }

    }

  • Mtodos de Servio HTTP

    A classe HttpServlet redireciona os pedidos encaminhados para service() para mtodos que refletem os mtodos HTTP (GET, POST, etc.):public void doGet(HttpServletRequest, HttpServletResponse)

    public void doPost(HttpServletRequest,HttpServletResponse)

    ...

    Um servlet HTTP dever implementar pelo menos um dos mtodos doGet() ou doPost()

  • Mtodos de Servio HTTP

  • Inicializao

    A inicializao de um HttpServlet, pode (e deve) ser feita com a verso de init() sem argumentos

    Todos os mtodos de config esto no servlet, pois GenericServlet implementa ServletConfig

    public void init() throws ServletException {

    String dirImagens = getInitParameter("imagens");

    if (dirImagens == null) {

    throw new UnavailableException ("Configurao incorreta!");

    }

    }

  • Parmetros de Inicializao

    exemploexemplo.PrimeiroServlet

    JDBCDriversun.jdbc.odbc.JdbcOdbcDriver

    1

  • A Requisio HTTP

    Uma requisio HTTP feita pelo browser tipicamente contm vrios cabealhos RFC822*

    Os mtodos de HttpServletRequest permitem extrair informaes de qualquer um deles Pode-se tambm identificar o mtodo e URL

  • Obteno de Dados de Requisies

    Alguns mtodos de HttpServletRequest1. Enumeration getHeaderNames() - obtm nomes dos cabealhos

    2. String getHeader("nome") - obtm primeiro valor do cabealho

    3. Enumeration getHeaders("nome") - todos os valores do cabealho

    4. String getParameter(param) - obtm parmetro HTTP

    5. String[] getParameterValues(param) - obtm parmetros repetidos

    6. Enumeration getParameterNames() - obtm nomes dos parmetros

    7. Cookie[] getCookies() - recebe cookies do cliente

    8. HttpSession getSession() - retorna a sesso

    9. setAttribute("nome", obj) - define um atributo obj chamado "nome

    10. Object getAttribute("nome") - recupera atributo chamado nome

    11. String getRemoteUser() - obtm usurio remoto (se autenticado, caso contrrio devolve null)

  • A Resposta HTTP

    Uma resposta HTTP enviada ao browser e contm informaes sobre os dados anexados

    Os mtodos de HttpServletResponse permitem construir um cabealho

  • A Resposta HTTP

    Alguns mtodos de HttpServletResponse1. addHeader(String nome, String valor) - adiciona cabealho HTTP2. setContentType(tipo MIME) - define o tipo MIME que ser usado

    para gerar a sada (text/html, image/gif, etc.)3. sendRedirect(String location) - envia informao de

    redirecionamento para o cliente (Location: url)4. Writer getWriter() - obtm um Writer para gerar a sada. Ideal para

    sada de texto.5. OutputStream getOutputStream() - obtm um OutputStream. Ideal

    para gerar formatos diferentes de texto (imagens, etc.)6. addCookie(Cookie c) - adiciona um novo cookie7. encodeURL(String url) - envia como anexo da URL a informao de

    identificador de sesso (sessionid)8. reset() - limpa toda a sada inclusive os cabealhos9. resetBuffer() - limpa toda a sada, exceto cabealhos

  • doGet() e doPost()

    Use doGet() para receber requisies GET Links clicados ou URL digitadas diretamente

    Alguns formulrios que usam GET

    Use doPost() para receber dados de formulrios

    Se quiser usar ambos os mtodos, no sobreponha service() mas implemente tanto doGet() como doPost()

    public class ServletWeb extends HttpServlet {

    public void doGet (HttpServletRequest request,

    HttpServletResponse response) {

    processar(request, response);

    }

    public void doPost (HttpServletRequest request,

    HttpServletResponse response) {

    processar(request, response);

    }

    public void processar(HttpServletRequest request,

    HttpServletResponse response) {

    ...

    }

    }

  • Parmetros da Requisio

    Parmetros so pares nome=valor que so enviados pelo cliente concatenados em strings separados por &

    Duas formas para passar parmetros: Se o mtodo for GET, os parmetros so passados em uma nica linha

    no query string, que estende a URL aps um "?

    Se o mtodo for POST, os parmetros so passados como um streamno corpo na mensagem

    GET /servlet/Teste?id=agente007&acesso=3 HTTP/1.0

    POST /servlet/Teste HTTP/1.0Content-length: 21Content-type: x-www-form-urlencoded

    id=agente007&acesso=3

  • Lendo Parmetros da Requisio

    Caracteres reservados e maiores que ASCII-7 bit so codificados em URLs: Ex: = %E3 Formulrios HTML codificam o texto ao enviar os dados

    Seja o mtodo POST ou GET, os valores dos parmetros, podem ser recuperados pelo mtodo getParameter() String parametro = request.getParameter("nome");

    Parmetros de mesmo nome podem ser repetidos. Neste caso getParameter() retornar apenas a primeira ocorrncia. Para obter todas use String[] getParameterValues() String[] params = request.getParameterValues("nome");

  • Gerando uma Resposta

    1. Para gerar uma resposta, primeiro necessrio obter, do objeto HttpServletResponse, um fluxo de sada, que pode ser de caracteres (Writer) ou de bytes (OutputStream) Writer out = response.getWriter(); // ou OutputStream out = response.getOutputStream(); Apenas um deve ser usado - correspondem ao mesmo stream

    1. Definir o tipo de dados a ser gerado (Content-type) para que o navegador saiba como exibir as informaes response.setContentType("text/html");

    1. Depois, pode-se gerar os dados (HTML), imprimindo-os no objeto de sada (out) obtido anteriormente

  • Processando Formulrios

    Um Formulrio Bsico

    Entre com seus dados:

  • Processando Formulrios

    public class ProcessaFormulario extends HttpServlet {

    private void processa(HttpServletRequest req, HttpServletResponse res)

    throws IOException {

    ServletOutputStream out = res.getOutputStream();

    res.setContentType("text/html");

    String tratamento = req.getParameter("titulo");

    String nome = req.getParameter("nome");

    String cidade = req.getParameter("cidade");

    String interesses[] = req.getParameterValues("interesses");

    out.println("Resp do Servlet");

    out.println("");

    out.println("Ol " + tratamento + " " + nome);

    out.println("Voc mora em " + cidade + " e seus interesses so: ");

    out.println("");

    for (String interesse : interesses) {

    out.println("");

    out.println(interesse);

    out.println("");

    }

    out.println("");

    }

    }

  • Redirecionamentos

    Ao receber uma requisio, um servlet pode:1. Respond-la diretamente, produzindo algum contedo

    HTML a ser enviado ao cliente (navegador)2. Encaminh-la para algum outro recurso responsvel por

    responder a esse tipo de requisio

    Duas formas de encaminhamento:1. Chamada ao mtodo

    HttpServletResponse.sendRedirect(String url)2. Criao de um objeto do tipo RequestDispatcher e

    chamada ao mtodo forward(HttpServletRequest, HttpServletResponse)

  • Redirecionamentos

    A chamada do mtodo sendRedirect(String url) faz com que o servidor envie ao cliente uma mensagem para que este envie a solicitao a uma nova URL O servidor envia ao cliente uma mensagem HTTP com

    cdigo 302 (o recurso foi movido para outra URL)

    O redirecionamento atravs da classe RequestDispatcher interno ao servidor No h comunicao com o cliente

  • Redirecionamentos

    Em termos de prticos, para o cliente a primeira opo modifica o endereo URL no navegador, enquanto que a segunda no

    Em aplicaes web, redirecionamentos so utilizados entre Servlets/JSPs como um mecanismo de delegao de tarefas

  • Escopo

    O escopo de um objeto indica quanto tempo o objeto existe depois de ter sido criado

    Estes variam do tempo de vida do continer at o tempo de vida de uma pgina individual

    Quatro nveis de escopos: (i) Aplicao, (ii) Sesso, (iii) Requisio e (iv) Pgina

  • Escopo

  • Escopo Aplicao

    Objetos compartilhados por todos os servlets em uma dada aplicao

    Exemplo: conexo com banco de dados, lista de produtos numa aplicao de controle de estoque, etc.

  • Escopo Aplicao

    A classe HTTPServlet possui um mtodo getServletContext() que retorna um objeto do tipo ServletContext

    Este objeto nos permite, por exemplo, criar atributos que existiro enquanto o servidor estiver no ar

    Outra alternativa atravs do mtodo init() de HTTPServlet, o qual possui um parmetro que uma instncia da classe ServletConfig; esta classe possui um mtodo denominado getServletContext() que retorna a mesma referncia citada no sub-item anterior

  • Escopo Sesso

    Objetos compartilhados numa sesso vinculada a um usurio

    Exemplo: carrinho num site de compras

  • Escopo Sesso

    A classe HTTPServletRequest (primeiro parmetro dos mtodos doGet()/doPost()) possui o mtodo getSession(), que retorna uma referncia para a sesso corrente

    Caso no exista sesso corrente ativa, uma nova criada

  • Escopo Pgina

    Objetos compartilhados entre JSPs e servlets na pgina de execuo atual

    Exemplo: variveis locais declaradas em pginas JSPs

  • Escopo Requisio

    Objetos compartilhados disponveis para JSPs/Servlets numa solicitao

    Difere do escopo de pgina por permitir o compartilhamento tambm para JSPs/Servlets includas ou redirecionadas

    Exemplo: parmetros de campo de formulrio

  • Exerccio em Sala de Aula

    Acompanhe na sua mquina a construo de um servlet HelloWorld

    Acompanhe a construo da classe (no Eclipse)

    Analise o web.xml

    Implante em um continer

    Execute e verifique o resultado

  • Exerccios

    1. Escreva um servlet que receba o nome e o telefone do usurio e retorne tais dados formatados em uma stringpassada ao servlet como parmetro de inicializao.

    i. Use o mtodo esttico format da classe String

    2. Crie um servlet que imprima, em uma tabela, todos osnomes de parmetros enviados e seus valores.

    3. Crie um servlet que imprima, em uma tabela, todos osnomes de cabealhos HTTP da requisio e seusvalores.

    4. Crie um servlet que retorne uma imagem.

  • Exerccios

    5. Escreva um servlet simples que devolva uma pgina contendo o dia, ms, ano e hora.

    6. Desenvolva a seguinte aplicao Web com as seguintes caractersticasi. Dois formulrios para fazer autenticao de um usurio

    a. O primeiro deve obter o nome do us...

Recommended

View more >