terça-feira, 25 de junho de 2013

Descobrindo a poderosa engenharia de aplicações Java Web - Parte 3

Dando continuidade aos nossos estudos, hoje falo um pouco sobre os Servlets. Os Servlets são classes Java que nos auxiliam no tratamento das solicitações HTTP antes de enviarmos a resposta para o servidor. Primeiramente, uma rápida olhada na hierarquia de classes e interfaces:

O que vem abaixo de HttpServlet são os nossos próprios Servlets. Eles DEVEM estender HttpServlet. Por que? Se olharmos na documentação, veremos que a classe HttpServlet possui um método chamado service que conta com dois parâmetros: HttpServletRequest e HttpServletResponse. O objeto HttpServletRequest cuida da solicitação (requisição), já o HttpServletResponse cuida da resposta. Precisamos desses dois objetos para podermos, por exemplo, pegar os parâmetros de entrada da requisição, pegar parâmetros iniciais do Servlet, setar atributos (de requisição ou de sessão, por exemplo). O método service é chamado quando o container recebe a primeira solicitação do cliente. Ele aloca uma Thread específica para este Servlet e processa a requisição.Além do método service, dois métodos importantíssimos a classe HttpServlet possui:
  • doPost(HttpServletRequest, HttpServletResponse)
  • doGet(HttpServletRequest, HttpServletResponse)
Vamos voltar um pouco a fita, lá para os nossos formulários HTML. Quando criamos uma página, geralmente há um FORM onde o usuário preencherá algumas informações, e na sequência apertará um botão como "enviar dados" para obter algum tipo de resposta. Pois bem, quando estamos criando nossos formulários, precisamos dizer qual é o método que será executado no servidor, se é POST ou GET. Bem, qual a diferença dos dois? O método GET envia todos os parâmetros informados no preenchimento do formulário, os anexa na URL e envia a requisição para o servidor. O que isso significa? Significa que você terá uma URL gigante com cada um dos parâmetros separados pelo caractere "&". Exemplo: http://www.minhapagina.com.br?usuario=Eduardo&senha=123 Consegue enxergar o potencial problema nisso? Os dados são expostos na URL, como senhas e outras coisas importantes. Além disso, o método GET tem uma limitação de caracteres. Isso quer dizer que em um dado momento, alguma informação pode ser enviada incompleta pois ultrapassou o limite de caracteres. 
O método POST trabalha um pouco diferente. Os dados não são enviados na URL da página, e sim no corpo da solicitação (alguns chamam isso de payload). Além do mais, o POST não tem limite. 
Quando usar o método GET?
Use-o quando quer somente OBTER coisas, como uma foto ou uma música no servidor, ou uma página específica. Nunca use o GET que cause algum efeito colateral. No exemplo da autenticação, o uso do GET não é apropriado pois os dados ficariam visíveis na URL enviada. Ele não deve ser usado, por exemplo, para inserir novos valores no banco de dados.
Quando usar o método POST?
Quando você for fazer alguma operação mais criteriosa, como por exemplo, diminuir o saldo de uma conta, ou fazer uma autenticação de usuário. 

E você não vai falar dos métodos doPost() e doGet()?
Não há como não falar, visto que eles são essenciais. O doGet() é chamado quando, adivinha? O método do seu formulário é GET! E o doPost()... bom, vou deixar que você complete. Você nunca pode ter os dois métodos! Na prática isso quer dizer o seguinte, você nunca pode ter metade de uma lógica implementada no doGet() e a outra metade no doPost(). Caso seu formulário seja GET mas você queira chamar o doPost(), sem problemas, apenas delegue para que o doGet() chame o doPost(), como no exemplo abaixo:

public void doGet(HttpServletRequest request, HttpServletResponse response) {
    doPost(request,response);
} 


E o que eu vou colocar no doPost() ou no doGet()?
É aqui que a brincadeira começa. Sua lógica será processada aqui. Você pode chamar outros métodos de outras classes normalmente, trabalhar os seus dados e devolver a resposta. É tão simples quanto descrevi. Mas e a resposta... como eu devo enviá-la? 
Bom, esse é um assunto que vai ter que ficar para a próxima postagem, pois entraremos no mundo dos JSP's!

Por hoje é só, até a próxima!

Nenhum comentário:

Postar um comentário