• Nenhum resultado encontrado

Servlets

No documento Ivan Luiz Marques Ricarte (páginas 91-95)

O resultado acima foi obtido a partir da execução da seguinte aplicação, acessando um gerencia- dor de banco de dados PostgreSQL:

1 import java.sql.*;

2 public class PoojavaDB {

3 public static void main(String[] args) {

4 try {

5 // carrega driver

6 Class.forName("postgresql.Driver");

7 // estabelece conexao com banco de dados

8 Connection c =

9 DriverManager.getConnection("jdbc:postgresql:poojava",

10 "ricarte","");

11 // monta e executa consulta

12 Statement s = c.createStatement();

13 ResultSet r = s.executeQuery("Select * from notas");

14 // apresenta estrutura da tabela

15 ResultSetMetaData m = r.getMetaData();

16 int colCount = m.getColumnCount();

17 for (int i=1; i<=colCount; ++i)

18 System.out.print(m.getColumnName(i) + "\t\t");

19 System.out.println();

20 // apresenta resultados da consulta

21 while (r.next()) 22 System.out.println(r.getString(1) + " " + 23 r.getString(2) + " " + 24 r.getInt(3) + "\t\t" + 25 r.getInt(4)); 26 r.close();

27 // fecha conexao com banco de dados

28 c.close(); 29 } 30 catch (Exception e) { 31 System.err.println(e); 32 } 33 } 34 }

5.3 Servlets

Servletsoferecem uma maneira alternativa a CGI para estender as funcionalidades de um servidor

Web. Na verdade, a API de servlet de Java oferece mecanismos adequados à adaptação qualquer servidor baseado em requisições e respostas, mas é em aplicações Web que servlets têm sido mais utilizados.

Programação orientada a objetos com Java 5.3. Servlets

CGI (Common Gateway Interface) é a especificação de uma interface que permite que servidores Web tenham acesso a funcionalidades oferecidas por programas executando no ambiente da máquina servidora. Através de programas conectados a essa interface é possível por exemplo conectar uma base de dados à Web ou gerar dinamicamente o conteúdo de uma página HTML.

O servidor Web reconhece uma requisição CGI quando o URL especificado na solicitação iden- tifica um arquivo executável (programa ou script) localizado em um diretório específico dentro do espaço Web de recursos disponibilizados aos clientes. Parâmetros podem ser repassados ao programa CGI especificando-os no URL, separados do nome do recurso pelo caráter ’?’.

Tipicamente um programa CGI pode ser desenvolvido em qualquer linguagem de programação que tenha acesso à leitura de variáveis de ambiente e à manipulação dos streams padrões de entrada e saída de dados do sistema operacional (stdin, System.in; stdout, System.out).

Com o uso de servlets, a arquitetura da Web torna-se um base atrativa para o desenvolvimento de aplicações distribuídas em Java. A utilização de browsers HTML simplifica o desenvolvimento das aplicações cliente. Servidores Web suportam os mecanismos básicos de conexão ao cliente. Assim, o desenvolvimento irá se concentrar na extensão dos serviços através dos servlets.

5.3.1 Ciclo de vida de um servlet

A execução de um servlet não difere muito de uma aplicação CGI em sua forma de interação com o servidor. As quatro principais etapas nessa interação são:

1. cliente envia solicitação ao servidor;

2. servidor invoca servlet para a execução do serviço solicitado; 3. servlet gera o conteúdo em resposta à solicitação do cliente; e 4. servidor envia resultado do servlet ao cliente.

Quando um servlet é carregado pela primeira vez para a máquina virtual Java do servidor, o seu método init() é invocado. Esse método tipicamente prepara recursos para a execução do serviço (por exemplo, abrir arquivos ou ler o valor anterior de um contador de número de acessos) ou estabelece conexão com outros serviços (por exemplo, com um servidor de banco de dados). O método destroy() permite liberar esses recursos (fechar arquivos, escrever o valor final nessa sessão do contador de acessos), sendo invocado quando o servidor estiver concluindo sua atividade.

Uma diferença fundamental entre um servlet e uma aplicação CGI é que a classe que implementa o servlet permanece carregada na máquina virtual Java após concluir sua execução. Um programa CGI, ao contrário, inicia um novo processo a cada invocação — por este motivo, CGI deve utilizar mecanismos adicionais para manter o estado entre execuções, sendo a forma mais comum a utilização de arquivos em disco. Com um servlet, tais mecanismos são necessários apenas na primeira vez que é carregado e ao fim da execução do servidor, ou eventualmente como um mecanismo de checkpoint.

Servletstambém oferecem como vantagem o fato de serem programas Java. Assim, eles permitem

a utilização de toda a API Java para a implementação de seus serviços e oferecem adicionalmente portabilidade de plataforma.

Programação orientada a objetos com Java 5.3. Servlets

5.3.2 Fundamentos da API de servlets

O suporte a servlets é uma extensão padronizada ao pacote Java, não sendo parte da distribuição básica do Java SDK. Assim, quem quiser desenvolver servlets deve obter o JSDK, o Java Servlet

Development Kit. Adicionalmente, o servidor Web deve suportar o acesso a servlets, o que pode

ocorrer de forma nativa (como no caso do Java Web Server) ou através de módulos add-on (como no caso de apache).

O JSDK inclui as classes que implementam a API de servlets organizadas em pacotes, dos quais os principais são javax.servlet e javax.servlet.http. Adicionalmente, uma aplicação servletrunner permite desenvolver e testar servlets antes de integrá-los a servidores.

Os três mecanismos alternativos básicos para criar um servlet são:

1. Estender a classe javax.servlet.GenericServlet, quando o servlet não for imple- mentar nenhum protocolo específico de comunicação;

2. Estender a classe javax.servlet.HttpServlet, para servlets que manipulam dados específicos do protocolo HTTP; ou

3. Implementar a interface javax.servlet.Servlet.

Na primeira forma básica de implementar um servlet, estendendo a classe GenericServlet, o método service() deve ser definido. Esse método descreve o serviço que o servlet estará ofere- cendo.

Esse exemplo ilustra o código de um servlet que responde à solicitação de serviço com uma mensagem fixa:

1 import javax.servlet.*;

2 import java.io.*;

3 public class OiServlet extends GenericServlet {

4 public void service(ServletRequest solicitacao,

5 ServletResponse resposta)

6 throws ServletException, IOException {

7 resposta.setContentType("text/plain");

8 PrintWriter saida = resposta.getWriter();

9 saida.println("Oi!");

10 }

11 }

Nesse exemplo, o método getWriter() é utilizado para estabelecer o canal de envio de dados desde o servlet — no caso, um objeto PrintWriter, permitindo o envio de textos. Alternati- vamente, dados binários poderiam ser enviados através de um OutputStream, obtido através do método getOutputStream().

A classe HttpServlet é uma extensão de GenericServlet especificamente projetada para a conexão de servlets a servidores HTTP. Assim, métodos dedicados a lidar com solicitações HTTP, tais como doGet(), doPost() e doPut(), são definidos. A implementação padrão do método service() reconhece qual o tipo de solicitação recebida e invoca o método correspondente.

Programação orientada a objetos com Java 5.3. Servlets

Este exemplo ilustra a utilização de um servlet que envia uma mensagem fixa no corpo de uma página HTML em resposta a uma requisição GET ao servidor Web, usando para tal o método do- Get():

1 import javax.servlet.*;

2 import javax.servlet.http.*;

3 import java.io.*;

4 public class OiHttpServlet extends HttpServlet {

5 public void doGet(HttpServletRequest solicitacao,

6 HttpServletResponse resposta)

7 throws ServletException, IOException {

8 resposta.setContentType("text/html");

9 PrintWriter saida = resposta.getWriter();

10 saida.println("<HTML>"); 11 saida.print("<HEAD><TITLE>"); 12 saida.print("Resposta do servlet"); 13 saida.println("</TITLE></HEAD>"); 14 saida.println("<BODY><P>Oi!</P></BODY>"); 15 saida.println("</HTML>"); 16 } 17 }

Outros métodos que suportam a interação do servlet através de solicitações HTTP incluem ge- tLastModified(), que é invocado pelo servidor para obter a data da última modificação do “do- cumento” (um número negativo se não houver informação ou long com o número de segundos desde 1 de janeiro de 1970 GMT); e getServletInfo(), que retorna uma string de documentação sobre o servlet, tal como nome, autor e versão.

A passagem de dados de um formulário do cliente para o servlet pode se dar através do método getParameter(), que permite obter uma string com o valor do campo especificado. Por exemplo, se um formulário HTML especificasse um campo de texto para entrada do nome do usuário, como em

<INPUT type="text" name="username" size=20>

esse valor poderia ser obtido no código do servlet do exemplo anterior através da invocação String nome = solicitacao.getParameter("username");

Além de getParameter(), o método getParameterValues() retorna um arranjo de

stringscom todos os valores de um determinado parâmetro. Outros métodos são oferecidos para ob-

ter informação das aplicações que estão invocando o servlet, tais como getRemoteHost(), get- ServerName(), getServerPort() e, especificamente para HTTP, getHeaderNames() e getHeader().

A forma de integrar o servlet ao servidor Web é dependente da implementação; por exemplo, alguns servidores especificam um diretório (tal como servlet) onde as classes servlets são con- centradas e a invocação dá-se pela invocação direta da URL, como em

No documento Ivan Luiz Marques Ricarte (páginas 91-95)

Documentos relacionados