Fundamentos da programação web

Programação Java para Web

Prof. Wagner Macedo

## Programação web - [As linguagens da web](#linguagens-da-web) - [Conteúdo estático e dinâmico](#sec-websites) - [Lado cliente e lado servidor](#sec-programacao-web) - [O protocolo HTTP](#sec-http)

As linguagens da web

HTML 5

Não precisa ser a versão 5, mas é melhor 😄

CSS

O estilista da web

JavaScript

A linguagem de programação da Web

JavaScript não é Java

Não confunda 😉

Navegador e o JavaScript

Como a web funciona

A Internet e a World Wide Web

A web é como uma estrada

A estrada da web

Sua conexão de Internet
A rua entre sua casa e uma loja.
TCP/IP
Os mecanismos de transporte para contatar a loja.
DNS
Quando você procura o endereço e o telefone da loja.
HTTP
O idioma que você usa para falar com o atendente.
Arquivos do site
São os produtos oferecidos pela loja.

A comunicação na prática

O que acontece quando você digita um endereço no browser?

O servidor web é como um mordomo

Endereço IP e Portas

Portas conhecidas
HTTP80
HTTPS443
FTP21
SMTP25
SSH22

Veja mais 🔖

Como a Web funciona
Como funciona a Internet e a World Wide Web

Websites

Sites Estáticos Sites Dinâmicos
Conteúdo de arquivos hospedados Conteúdo gerado por um programa
Conteúdo sempre o mesmo Diferente em certas condições
HTML, CSS e JavaScript PHP, Ruby, Python, C++, etc
Acessa somente dados do computador do cliente Pode acessar sistemas de banco de dados

Sites Estáticos

Vantagens 👍
  • Fácil de criar
  • Hospedagem barata
  • Custo baixo
Desvantagens 👎
  • Requer desenvolvedor web para atualizar site
  • Funcionalidades limitadas

Servidor web estático

Sites Dinâmicos

Vantagens 👍
  • Não requer desenvolvedor para atualizar o site
  • Funcionalidades de acordo com a necessidade
Desvantagens 👎
  • Difícil de criar
  • Hospedagem mais cara
  • Custo mais alto

Servidor web dinâmico

Lado cliente vs Lado servidor

A programação web acontece em códigos relevantes para o cliente e códigos relevantes para o servidor.

👆 websites dinâmicos
Lado Cliente
  • HTML+CSS+JavaScript
  • O código é executado no navegador
  • Acesso ao ambiente do navegador
  • Incompatibilidades entre navegadores 😠
Lado Servidor
  • Qualquer linguagem pronta para web
  • O código é executado no servidor
  • Acesso a recursos no servidor e em outros servidores 😁

Frontend vs Backend

Frontend

Backend

HTTP

O protocolo dos navegadores e servidores web

O HTTP é o protocolo de comunicação utilizado pelos navegadores e servidores web. Quando o navegador solicita uma página web é chamado de requisição e quando o servidor web envia a página solicitada de volta é chamado de resposta.

O que é um protocolo de comunicação?

Protocolos não se misturam

Características de HTTP

  • 🔁 Requisição-Resposta
  • 🖼️ Independente de mídia
  • 📨 Sem estado

Equivalência de Nomes

Português Inglês
Requisição Request
Resposta Response
Método Method
Caminho Path
Cabeçalhos Headers
Conteúdo/Corpo Content/Body
Código de estado Status code
Para acessar http://portal.fanese.edu.br/?page_id=220

A requisição feita pelo cliente


            GET /?page_id=220 HTTP/1.1
            Host: portal.fanese.edu.br
             
          
Explicando a requisição: - **`GET`**: eu quero obter uma informação - **`/?page_id=220`**: a informação desejada - **`HTTP/1.1`**: estou me comunicando com o protocolo HTTP na versão 1.1 - **`Host`**: estou pedindo de um site específico - **`portal.fanese.edu.br`**: o nome do site

Esta requisição tem o conteúdo vazio!

A resposta entregue pelo servidor


            HTTP/1.1 200 OK
            Date: Mon, 31 Jul 2017 21:15:35 GMT
            Content-Type: text/html;charset=UTF-8
            Server: Apache

            <!DOCTYPE html>
            <html lang="pt-BR">
            …
          
O servidor diz “eu também falo HTTP 1.1, sua requisição foi um sucesso, então eu respondi com o código de estado **`200`**. Nos cabeçalhos têm a data em que enviei a resposta, o tipo do conteúdo e quem sou eu. A resposta inclui o conteúdo da página que você pediu, iniciando por **`<!DOCTYPE html>`**.”
### Prática HTTP 1. Inicie o cliente HTTP **Insomnia**. 2. Pressione **Ctrl+N** para criar uma requisição. 2. Dê o nome que quiser e escolha a opção **GET**. 3. Insira um endereço web e clique em **Send**. 4. Observe na resposta da requisição - **Status code** (provável 200 OK) - **Headers** (os cabeçalhos) - **Conteúdo** da página requisitada

Baixe o Insomnia em https://insomnia.rest/

URI/URL

O identificador de endereços na Internet.

Exemplos de URI/URL

  • https://www.facebook.com/zuck
  • ftp://ftp.uhserver.com
  • tg://resolve?domain=pavel
  • mailto:fulanodetal@gmail.com

URL HTTP

#### Porta HTTP Quando acessamos http://portal.fanese.edu.br/, estamos acessando o servidor web na porta `80`. O seguinte URL dá acesso ao mesmo site: http://portal.fanese.edu.br:80/. Para acesso a um servidor que não está na porta `80`, é necessário afixar a **porta** ao nome do servidor. http://portquiz.net:8080/
#### Porta HTTPS O tráfego de HTTP seguro se faz pela porta 443. - https://facebook.com/ - https://facebook.com:443/ É óbvio que também é possível usar outra porta: https://www.exemplo.com:7865/

A requisição HTTP

Métodos de requisição HTTP

GET A requisição mais comum de todas.
Usamos para obter um recurso do servidor.
POST Usamos para solicitar alterações no lado servidor.
PUT Substitui o conteúdo de um recurso.
DELETE Remove um recurso especificado.
TRACE Raramente usados por desenvolvedores web
OPTIONS
PATCH
CONNECT
HEAD

Elementos da requisição HTTP


          GET /blog/ HTTP/1.1
          Host: www.exemplo.com.br
          User-Agent: Mozilla/5.0 (Linux x86) Chrome/59.0
          Accept: text/html
          Accept-Charset: UTF-8
          Accept-Language: pt-br
          Cookie: Variant=1; Theme=blue;
          Referer: http://exemplo.com/index.html
          If-Modified-Since: Sat, 07 Aug 2017 21:18:31 GMT
           
        

            ↔️ Linha de requisição (método/caminho/versão)
            ↔️ O servidor desejado
            ↔️ A identificação do browser
            ↔️ O tipo de conteúdo esperado pelo browser
            ↔️ A codificação de caracteres esperada
            ↔️ O idioma esperado pelo browser
            ↔️ O browser envia os cookies armazenados
            ↔️ Browser envia site que originou a requisição
            ↔️ Faz uma requisição condicional
          

          POST /blog/cadastro.php HTTP/1.1
          Host: www.exemplo.com.br
          Accept: text/html
          Accept-Charset: UTF-8
          Accept-Language: pt-br
          Content-Type: application/x-www-form-urlencoded
          Content-Length: 35
          Cookie: Variant=1; Theme=blue;

          name=John+Darling&address=Neverland
        
          
            
            
            
            
            ↔️ O tipo de conteúdo do corpo da requisição
            ↔️ O tamanho em bytes do corpo da requisição
            
            
            🔵️ O corpo da requisição
          

Leitura da Requisição em Java


      protected void doGet(HttpServletRequest request, HttpServletResponse response) {
          // Método da requisição: "GET", "POST", etc.
          String metodo = request.getMethod();

          // URI da requisição
          String uri = request.getRequestURI();

          // Query string, se houver
          String queryString = request.getQueryString();

          // Cabeçalhos
          String host       = request.getHeader("Host");
          String userAgent  = request.getHeader("User-Agent");
          String accept     = request.getHeader("Accept");
          String acceptLang = request.getHeader("Accept-Language");
          String cookie     = request.getHeader("Cookie");

          // Corpo da requisição
          BufferedReader reader = request.getReader();
      }
    

A resposta HTTP

Códigos de resposta HTTP

1xx Informativa
200 OK
A maioria dos sites devolvem essa resposta.
O corpo da resposta geralmente estará preenchido.
Veja outros códigos dessa classe
301 Moved Permanently (Movido Permanentemente)
Esta e todas as solicitações futuras devem ser redirecionadas para uma dada URI.
302 Found (Encontrado)
O site foi movido temporariamente para uma dada URI.
303 See Other (Veja Outro)
Normalmente os browsers, quando recebem essa resposta, tem o mesmo comportamento do código 302.
304 Not Modified (Não Modificado)
Indica que o recurso solicitado não foi modificado. Essa resposta é dada quando a requisição tem um cabeçalho If-Modified-Since.
307 Temporary Redirect (Redirecionamento Temporário)
Semelhante ao código 302, mas o método de requisição não deve mudar.
Veja outros códigos dessa classe
401 Unauthorized (Não autorizado)
O usuário não está autorizado e deve fornecer um usuário e senha.
Note que, nesses casos, o navegador vai abrir uma caixa para digitar usuário e senha.
403 Forbidden (Proibido)
Acesso a um certo recurso é proibido.
O servidor pode restringir acesso a todos ou a alguns usuários.
Diferente do código 401, não será solicitado autenticação.
404 Not Found (Não Encontrado)
O recurso solicitado não existe.
O segundo código de resposta mais comum, depois de 200.
405 Method Not Allowed (Método Não Permitido)
O método de requisição usado pelo cliente não é permitido para o recurso atual.
414 URI Too Long (URI Muito Longa)
A URI fornecida é muito longa.
Normalmente isso quer dizer que foi feito uma requisição GET, mas deveria ser feita uma requisição POST.
Veja outros códigos dessa classe
500 Internal Server Error (Erro Interno do Servidor)
Indica que houve um erro no servidor ao processar a requisição.
Por exemplo, uma exceção.
Veja outros códigos dessa classe

Elementos da resposta HTTP


          HTTP/1.1 200 OK
          Content-Type: text/html; charset=utf-8
          Content-Lenght: 27855
          Set-Cookie: Variant=1; Theme=blue;
          Cache-Control: max-age=3600

          <!DOCTYPE html>
          <html lang="pt-BR">
          …
        

            ↔ Código de estado da resposta
            ↔️ O tipo de conteúdo do corpo da resposta
            ↔️ O tamanho em bytes do corpo da resposta
            ↔️ O servidor envia cookies para o browser armazenar
            ↔️ O servidor indicando para o cliente fazer cache
            
            🔵️ Início do corpo da resposta
            🔵
            🔵
          

          HTTP/1.1 301 Moved Permanently
          Location: https://www.wikipedia.org/
          Content-Type: text/html; charset=iso-8859-1
          Content-Length: 234
          
          <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
          <html><head>
          <title>301 Moved Permanently</title>
          …
          
          
            ↔️ Local para onde o browser deve redirecionar
          

Escrita da Resposta em Java


      // Código de Estado
      response.setStatus(200);

      // Cabeçalhos da resposta
      response.setHeader("Content-Type", "text/html");
      response.setHeader("Content-Language", "pt-BR");
      response.setHeader("Content-Length", "37");
      response.setHeader("Set-Cookie", "Variant=1; Theme=blue;");
      response.setHeader("Expires", "Fri, 25 Aug 2017 13:45:42 GMT");

      // Corpo da resposta
      PrintWriter out = response.getWriter();
      out.println("<html><body>Hello World</body></html>");
    

O código abaixo pode não funcionar!


      PrintWriter conteudo = response.getWriter();
      conteudo.println("<html><body>Exemplo</body></html>");

      response.setStatus(200);
      response.setHeader("Content-Type", "text/html");
      response.setHeader("Content-Language", "pt-BR");
    

O código de estado e os cabeçalhos são enviados para o cliente antes do corpo da resposta.

Páginas de Erro

O método sendError emite uma página de erro.


      response.sendError(400);
    

Negociação de Conteúdo

MIME-type

Estrutura geral


          tipo/subtipo
        

Exemplos


          text/plain
          text/html
          text/css
          text/javascript
          image/jpeg
          image/png
          audio/mpeg
          audio/ogg
          audio/*
          video/mp4
          application/octet-stream
        

Redirecionamento HTTP

Principais Códigos de Redirecionamento

301 Moved Permanently (Movido Permanentemente)
Esta requisição e as próximas devem ir para uma dada URI.
302 Found (Encontrado)
O site foi movido temporariamente para uma dada URI.
303 See Other (Veja Outro)
Semelhante ao código 302.
304 Not Modified (Não Modificado)
Redirecionamento para o cache local do browser.
307 Temporary Redirect (Redirecionamento Temporário)
Semelhante ao código 302.

Se o lado servidor da Wikipédia fosse em Java, provavelmente teria o seguinte código.


      response.setStatus(301);
      response.setHeader("Location", "https://www.wikipedia.org/");
    

Atalho em Java para redirecionar


      response.sendRedirect("https://www.wikipedia.org/");
    

Cache HTTP

O protocolo HTTP especifica que o conteúdo da resposta do método GET pode ser mantido em cache.

Processo de Cache do Lado Cliente

  1. Cliente faz a primeira requisição:

        GET /index.html HTTP/1.1
        Host: www.exemplo.com.br
        …
      
  1. Servidor dá uma resposta normal:

        HTTP/1.1 200 OK
        Last-Modified: Fri, 25 Aug 2017 21:15:59 GMT
        …
      
  1. Nas próximas requisições, cliente se refere à data da última modificação:
    
                GET /index.html HTTP/1.1
                Host: www.exemplo.com.br
                If-Modified-Since: Fri, 25 Aug 2017 21:15:59 GMT
                …
              
  2. Caso o recurso não tenha sido modificado, retorna código 304.
    
                HTTP/1.1 304 Not Modified
                …
              

Se houve modificações, teremos uma nova resposta de código 200, a data de modificação atualizada, o ciclo reinicia!

Leitura recomendada 🔖

Os métodos HTTP: quais são e pra que servem
Como funcionam os métodos GET e POST
Lista de códigos de estado HTTP
Entendendo uma negociacao de conteúdo via cartas
MIME types

Dúvidas?

Este slide pode ser encontrado em:
http://prof.wagnermacedo.com/2018-1/PJW/3-fundamentos-programacao-web