Java Essencial: JDBC, Servlets, JSPs e Gerenciamento de Fluxos I/O

Classificado em Computação

Escrito em em português com um tamanho de 8,82 KB

Tipos de Drivers JDBC

Existem quatro tipos diferentes de drivers ou especificações de drivers JDBC definidos pelo padrão:

  • Driver Tipo 1: Drivers que utilizam o sistema como um gateway ou bridge (ex: JDBC-ODBC). Não é a melhor solução porque, em muitos casos, é necessário instalar software especial no cliente, além de ser um pouco lento no acesso ao banco de dados.
  • Driver Tipo 2: API Nativa. Este tipo de driver contém código Java que faz chamadas para métodos nativos do banco de dados em C ou C++ para acessar o banco de dados. Às vezes, é necessário instalar software cliente para usar esses drivers.
  • Driver Tipo 3: Drivers de Aplicação. Drivers JDBC ou drivers de aplicação que se comunicam com o servidor usando sockets intermediários que movem as solicitações do programa para uma API específica do driver no cliente. Este tipo de driver tem a vantagem de não exigir software no cliente.
  • Driver Tipo 4: Drivers de Rede. Drivers de rede usam protocolos incluídos no SGBD (Sistema de Gerenciamento de Banco de Dados) e, portanto, se comunicam diretamente com o banco de dados, também usando sockets Java. É o melhor tipo de driver, pois é escrito inteiramente em Java. A maioria desses drivers é fornecida pelo fabricante do SGBD.

O método createStatement() cria um canal aberto através do qual você pode executar consultas.

Método executeQuery()

O método executeQuery() retorna um objeto ResultSet, que pode ser usado para acessar cada um dos registros retornados.

Requisitos para Executar Servlets e JSPs

Para executar um Servlet (e também um JSP), você precisa de:

  1. Um servidor web HTTP (ex: Apache HTTP Server, IIS).
  2. Um servidor de aplicação que suporte Servlets (ex: Apache Tomcat, Jetty).
  3. As classes dos pacotes Servlet: javax.servlet e javax.servlet.http.

Uma aplicação web é uma coleção de servlets, páginas JSP, classes Java, arquivos de descrição da aplicação, documentos estáticos (HTML, XHTML, imagens, etc.) e outros recursos que podem ser empacotados e executados em diferentes servidores de diferentes fornecedores. Uma aplicação web pode ser definida como a camada web de qualquer aplicação.

O contêiner web é o ambiente que hospeda uma aplicação web. Ele é, essencialmente, a estrutura de diretórios onde todos os arquivos necessários para a execução da aplicação web são colocados.

Estágios de Evolução do Código JSP

Uma JSP passa por três estágios de evolução em seu código:

  • Código-Fonte JSP

    É escrito pelo programador ou desenvolvedor JSP em um arquivo de texto com a extensão .jsp. Consiste em uma mistura de HTML, instruções em linguagem Java, diretivas JSP e ações que descrevem como construir uma página para responder a uma solicitação do cliente.

  • Código-Fonte Java

    O contêiner JSP traduz o código-fonte JSP para o código-fonte de um servlet Java equivalente. Este código é armazenado em um espaço de trabalho e pode ser útil no processo de depuração.

  • Classe Java Compilada

    Como acontece com qualquer programa Java, o servlet gerado é compilado para bytecode, resultando em um arquivo .class que está pronto para ser carregado e executado pelo servidor.

Elementos JSP

Existem três tipos de elementos JSP:

  • Elementos de Script (Scriptlets, Expressões e Declarações).
  • Diretivas.
  • Ações.

Declarações JSP

Uma declaração notifica o interpretador Java que novas variáveis ou métodos serão definidos no arquivo de classe gerado. As declarações contêm instruções Java, com a seguinte sintaxe:

<%! declaração; [...] %>

Scriptlets JSP

Um scriptlet é um conjunto de instruções ou declarações Java contidas em uma página HTML. Essas instruções são diferentes do HTML porque são colocadas entre <% e %> para que o interpretador JSP saiba processar todo o código dentro dessas tags. Sua sintaxe é:

<% código_java; [...] %>

Objeto request

É uma instância de javax.servlet.ServletRequest e contém informações sobre os dados enviados ao servidor através de uma página web. Por exemplo, o método getParameter() do objeto request obtém valores enviados através de um formulário ou URL. Assim, podemos recuperar o valor ou o conteúdo dos campos de um formulário em uma página web, por exemplo:

<%
String nome = request.getParameter("nome");
%>

O que é um Fluxo (Stream)?

Um fluxo (stream) é um sistema de comunicação implementado no pacote java.io, que visa armazenar e recuperar informações em diversos dispositivos de armazenamento.

Fluxos Padrão (Standard Streams) em Java

Java, como qualquer outra linguagem de programação, possui seu próprio conjunto de métodos que permitem capturar entradas e saídas de informações enviadas pelos dispositivos padrão. Os fluxos padrão são:

  • Fluxo de Entrada de Dados (System.in)

    Representado pela classe System.in, geralmente recebe dados do teclado. Utiliza o método read() para ler caracteres do teclado.

  • Fluxo de Saída de Dados (System.out)

    Representado pela classe System.out, geralmente envia dados para a tela. Utiliza os métodos print() e println() para saída na tela.

  • Fluxo de Erro de Dados (System.err)

    Representado pela classe System.err. Garante que a saída de mensagens de erro seja redirecionada para o monitor do usuário.

Classes de Fluxo Oferecidas por java.io

Java oferece duas classes abstratas para gerenciar fluxos de dados de computadores remotos ou arquivos: java.io.InputStream e java.io.OutputStream. A hierarquia dessas classes será apresentada a seguir.

Fluxos de Acesso a Arquivos

Para ler ou escrever em um arquivo, esses fluxos são tratados com acesso a arquivos. Em Java, as classes FileInputStream (com os métodos necessários para abrir e interagir com um canal de comunicação para um arquivo de entrada para a nossa aplicação) e FileOutputStream (para o caso de um arquivo de saída) são utilizadas.

As classes FileInputStream e FileOutputStream possuem construtores que recebem como parâmetro o nome do arquivo a ser lido ou escrito. Existem duas alternativas: uma que recebe um objeto do tipo File e outra que recebe um objeto do tipo FileDescriptor. Na próxima seção, veremos a primeira alternativa, pois a classe File é comumente usada para essa finalidade.

Classe File

A classe File é usada para encapsular a interação de nossos programas com o sistema de arquivos. Com a classe File, não apenas lemos o conteúdo do arquivo (como acontece com FileInputStream), mas também podemos obter informações adicionais, como tamanho, tipo, data de criação, permissões de acesso, etc.

Classe DataOutputStream

A classe DataOutputStream é uma extensão da classe OutputStream, adicionando a este último a possibilidade de gravar dados "complexos" em um fluxo de saída. Quando falamos de dados "complexos", na verdade nos referimos a tipos de dados primitivos, mas não se restringe apenas a bytes e arrays de bytes, como no caso de OutputStream.

Com a classe DataOutputStream, podemos gravar dados dos tipos int, float, double, char, etc. Também podemos escrever alguns objetos, como String, em uma variedade de formatos.

Classe DataInputStream

Se podemos escrever dados formatados, então podemos lê-los confortavelmente. Esse recurso é possível graças à classe DataInputStream.

A classe DataInputStream é projetada para leitura de dados gerados por um objeto DataOutputStream. A especificação desta classe garante que qualquer arquivo escrito por um DataOutputStream em qualquer plataforma e sistema operacional poderá ser lido por um DataInputStream corretamente, sem a necessidade de se preocupar se as máquinas são "little-endian" ou "big-endian".

Entradas relacionadas: