Descansando a Cabeça

Saturday, September 17, 2011

Servlets

Servlets são classes que estendem um servidor web.

Em java, são herdados das classes javax.servlet e javax.servlet.http.

As respostas são geralmente fornecidas em XHTML.

Os servlets são geralmente utilizados para clientes magros, que fornecem apenas apresentação, sem processamento desses dados.

O servidor que executa um servlet é chamado de contêiner servlet

Todos os servlets devem implementar a interface Servlet, disponível no pacote javax.servlet.

Ciclo de vida

1- Durante a primeira solicitação do servlet, ele é carregado na memória.
2- Para poder tratar essa solicitação, o contêiner chama init( )
3- Depois disso, o contêiner chama o método service( ServletRequest rq, ServletResponse rs )
4- Caso o contêiner do Servlet esteja cheio e precise liberar os recursos de um servlet então chama-se o método destroy( ), para liberar recursos.

Quando a chamada Init( ) é realizada, é passada para está um objeto chamado ServletConfig, que fornece ao servlet informação sobre parâmetros de iniciação especificados no arquivo de configuração web.xml

Existem duas classes abstratas dentro do pacote javax.servlet que implementam a interface Servlet, são elas: GenericServlet e HTTPServlet.

GerenicServlet está em javax.servlet e HTTPServlet está em javax.servlet.http.

Como podemos deduzir, o GenericServlet é independente de protocolo e o HTTPServlet utiliza o protocolo HTTP. 

Métodos da classe javax.servlet.http.HTTPServlet

(mais comuns)
doGet ( ) => Aceitam requisições do tipo GET
doPost( ) => Aceitam requisições do tipo POST

(quase nunca é utilizado)
doDelete( ) => utilizada em solicitações HTTP de exclusão de arquivo
doPUT( ) => utlizada em solicitações de envio de arquivos
doTrace( ) => Utilizado na depuração
doHead( ) => recupera apenas o cabeçalho do documento HTTP
doOptions( ) => Como se fosse o man do shell, mostrando as opções disponíveis no HTTP.

HTTPServletRequest

A interface HTTPServletRequest fornece alguns métodos para se obter os parâmetros da requisição:

String getParameter( String parametro ), para se obter um parâmetro enviado por GET ou POST.

Para se obter todos os parâmetros enviados pelo cliente podemos utilizar

Enumeration getParameterNames( )

Se o nome dos parâmetros não interessa e sim os seus múltiplos valores então podemos utilizar o método:

String[ ]  getParametersValues(  ) que retorna um array com todos os valores.

Cookie[ ] getCookies( ) recupera todos os cookies enviados do cliente.

HTTPSession getSession( ) recupera a sessão do cliente.

String getLocalName( ) retorna o host pelo qual a solicitação foi atendida.

String getLocalAddr( ) retorna o endereço IP do LocalName

String getLocalPort ( ) a porta pelo qual a requisição foi recebida.

HTTPServletResponse

addCookie ( ) => adiciona um cookie ao cliente

Note que o java dispõe de fluxos de bytes ( InputStream e OutputStream) e um fluxo de caracteres ( Reader e Writer )

O HTTPServletResponse dispõe dos métodos ServletOutputStream getOutputStream( ) e o método
PrintWriter getWriter( )

O método setContentType ( String type ) serve para definir o mimetype do documento.

Cada servlet deve ser mapeado no descritor de aplicação, chamado web.xml, para que possa ser enxergado pelo servidor de aplicação.

Arquivo de Mapeamento do Servlet

<web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4">

<!-- descrição do aplicativo -->
<display-name>
O nome do aplicativo aqui
</display-name>

<description>
Aplicativo sem futuro
</description>

<!-- aqui o que interessa -->
<!-- definições do servlet -->
<servlet-name>Aplicacao1</servlet>

<servlet-class>Aplicacao1Servlet</servlet-class> <!-- o exato nome da classe -->

<!-- e agora temos a flexibilidade se saber onde esse servlet irá rodar, o endereço que ele estará acessível -->

<servlet-mapping>
<servlet-name>Aplicacao1</servlet-name>
<url-pattern>/diretorio/subdiretorio/versao1/aplicacao</url-pattern>
</servlet-mapping>

Ou podemos por exemplo fazer que para qualquer arquivo acessado em /diretorio, seja direcionado para esse servlet.

<servlet-mapping>
<servlet-name>Aplicacao1</servlet-name>
<url-pattern>/diretorio/*</url-pattern>
</servlet-mapping>

E para finalizar, uma declaração completa de um Servlet.

import javax.servlet.http.HTTPServlel;
import javax.servlet.http.HTTPResponse;
import javax.servlet.http.HTTPRequest;
import javax.servlet.ServletException
import java.io.IOException;
import java.io.PrintWriter;

public class Aplicacao1 extends HTTPServlet throws ServletException, IOException{
        protected void doGet ( HTTPServletRequest requisicao, HTTPServletResponse resposta){
                //definindo o tipo de arquivo a ser retornado
                response.setContentType("text/html");
                PrintWriter out =  response.getWriter ( ); // fluxo de caracteres
                out.println("<h1> Olá Você </h1>");
                out.close( ) //se você não fechar o fluxo então não vai aparecer nada
        }
}

No comments:

Post a Comment