Você está na página 1de 5

Tutorial por: Robson Baum

Olá pessoal!

Percebi que existem alguns artigos que falam sobre o básico para aplicações web, mas
nenhum fala sobre um básico de Servlet!
O objetivo deste artigo é exatamente isto, fazer um HelloWorld em Servlet!

Sugiro como leituras complementares os artigos de Web Application Deployment Descriptor


e de Estrutura de uma aplicação WEB que estão presentes aqui no JavaFree!

Para realizar os testes, eu estou com jsdk 1.4.2 e o TomCat 4.1.29 e parto do
princípio de que o leitor já os tenha instalados.

Nota: para poder compilar as classes você precisa que o pacote do Servlet esteja em seu
classpath. Este pacote se encontra em TOMCAT_HOME/common/lib/servlet.jar

Vamos lá!

Estou partindo de um contexto zerado, então criaremos a estrutura do diretório da aplicação,


a classe do Servlet, o deployment descriptor e por último colocaremos a configuração do contexto.

Primeiramente, crie um diretório onde estarão os arquivos de sua aplicação, por ex:
/HelloWorldInServlet;
Dentro deste diretório cire um subdiretório chamado source e outro deploy;
Dentro do diretório deploy cire um subdiretório chamado WEB-INF, e dentro do WEB-INF crie um
outro chamado classes;

Após feito isto, sua estrutura deve estar assim:


/HelloWorldInServlet
|-source
|-deploy
| |-WEB_INF
| | |-classes

Crie um arquivo chamado HelloWorld.java dentro do diretório /HelloWorldInServlet/source e


vamos escrever!
Code:
import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
* O método padrão invocado em um servlet é doGet.
* A especificação 2.3 de servlet (que é a que estou trabalhando) implementa
* os 7 métodos do HTTP 1.1 (get, head, post, options, put, delete, trace).
* Os métodos mais comumente utilizados em aplicações web são get e post.
*/
public class HelloWorld extends HttpServlet {

   /**
    * É executado quando é feita uma requisição com método GET pelo cliente.
  *
    * @param request Objeto com as informações pertinentes a requisição
    * @param response Objeto com as informações pertinentes a reposta para o cliente
    */
   protected void doGet(HttpServletRequest request, HttpServletResponse response)
         throws ServletException, IOException {
      PrintWriter pw = response.getWriter(); // pega o 'escritor' da resposta
      pw.println("<HTML>");
      pw.println("<TITLE>Olá Mundo em Servlet!</TITLE>");
      pw.println("<BODY>");
      pw.println("Olá Web!");
      pw.println("</BODY>");
      pw.println("</HTML>");
      pw.flush(); // descarrega as informações. não é obrigatória a chamda deste método
   }
}

Após escrito o arquivo, salve e compile-o.


Nota: Os objetos devem estar dentro do diretório WEB-INF/classes.
Os pacotes ficam em WEB-INF/lib. Isto é melhor explicado em Estrutura de uma aplicação WEB
Para compilar pode-se fazer da seguinte forma:
Entre no diretório /HelloWorldInServlet/source e digite
'javac HelloWorld.java -classpath $CATALINA_HOME/common/lib/servlet.jar -d ../deploy/WEB-
INF/classes'
Isso irá compilar o seu fonte e criar o .class no diretório
/HelloWorldInServlet/deploy/WEB-INF/classes
Obs.: no comando acima eu utilizei a váriavel de ambiente CATALINA_HOME, que é o que o
tomcat exige no linux...
talvez no windows não seja a mesma variável... verifique!

Pronto! Feito isso o servlet está acabado, agora falta o deployment descriptor...
Vamos ao mesmo:

Entre no diretório /HelloWorldInServlet/WEB-INF e crie um arquivo com o nome web.xml;


No arquivo criado, coloque o seguinte texto:

Code:
<?xml version="1.0" encoding="ISO-8859-1"?>

<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app>

<display-name>Olá Mundo em Servlet!</display-name>


<description></description>

<servlet>
<servlet-name>hello</servlet-name> <!-- nome do servlet dentro do web.xml -->
<servlet-class>HelloWorld</servlet-class> <!-- nome da classe do servlet -->
</servlet>

<servlet-mapping>
<servlet-name>hello</servlet-name> <!-- servlet a ser mapeado -->
<url-pattern>/servlet/hello</url-pattern> <!-- url que está mapeada para o servlet responder --
>
</servlet-mapping>

</web-app>

Salve o arquivo e feche o editor.


Não vou entrar em detalhes sobre o deployment descriptor pois o mesmo é explicado
em detalhes Web Application Deployment Descriptor.

Após isso só falta a configuração do contexto para o TomCat.


Edite o arquivo TOMCAT_HOME/conf/server.xml.
Nota: Faça uma cópia de segurança do arquivo para não ter problemas.
Acrescente a seguinte tag ao arquivo:
Esta tag deve estar dentro de <Server><Service><Engine><Host> que já devem estar
previamente declaradas
em seu server.xml. Se não colocar no lugar certo não roda!
Code:
<Context path="/hello" docBase="/HelloWorldInServlet/deploy" debug="0"
reloadable="true"/>

Substitua o /HelloWorldInServlet pelo diretório que você criou!

Reinicie o TomCat e pronto! Está terminado!


Para testar acesse http://localhost:8080/hello/servlet/hello

Deverá aparecer 'Ola Web!' no seu browser...

Este tava bem simples... mais que simples... podemos fazer agora um exemplo com entrada de
dados!
Uma calculadora... dois campos na tela + um botão; o servlet soma e traz o resultado.
Tá bom, tá bom... não chega a ser uma calculadora... mas 1+1 ela faz!
Ao invés de recriar a estrutura descrita acima, somente criaremos a outra servlet.

Entre em /HelloWorldInServlet/source e crie um arquivo Calc.java;


Este arquivo terá o seguinte código:
Code:
import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
* Neste servlet, o método GET chama o método que 'desenha' o formulário para o
* usuário preencher. O formulário está chamando o método POST, o qual desenha o
* formulário novamente com os valores informados e dá uma resposta ao usuário;
*/
public class Calc extends HttpServlet {

   /**
    * É executado quando é feita uma requisição com método GET pelo cliente.
  *
    * @param request Objeto com as informações pertinentes a requisição
    * @param response Objeto com as informações pertinentes a reposta para o cliente
    */
   protected void doGet(HttpServletRequest request, HttpServletResponse response)
         throws ServletException, IOException {
      writeHeader(response);
      writeForm(request, response);
      writeFooter(response);
   }
  
   /**
    * É executado quando é feita uma requisição com método POST pelo cliente.
    * No nosso caso será executado quando o cliente submitar o formulário, o qual
    * está indicado com METHOD="POST"
  *
    * @param request Objeto com as informações pertinentes a requisição
    * @param response Objeto com as informações pertinentes a reposta para o cliente
    */
   protected void doPost(HttpServletRequest request, HttpServletResponse response)
   throws ServletException, IOException {
      writeHeader(response);
      writeForm(request, response);
      PrintWriter pw = response.getWriter();
      pw.println("<BR>");
      
      // o getParameter retorna o valor informado para o parâmetro no formulário, ou passado
diretamente pela URL
      // neste caso, o parâmetro é o FIRSTVALUE
      String first = request.getParameter("FIRSTVALUE");
      int vlr1 = 0;
      try {
         vlr1 = Integer.parseInt(first);
      } catch (Exception e) {
         pw.println("Não foi possível converter o 1º valor para inteiro!");
         writeFooter(response);
         return;
      }

      String second = request.getParameter("SECONDVALUE");


      int vlr2 = 0;
      try {
         vlr2 = Integer.parseInt(second);
      } catch (Exception e) {
         pw.println("Não foi possível converter o 2º valor para inteiro!");
         writeFooter(response);
         return;
      }
      
      pw.println("O resultado da soma é: " +(vlr1 +vlr2));
      writeFooter(response);
   }
  
   private final void writeHeader(HttpServletResponse response) throws IOException {
      response.getWriter().println("<HTML><TITLE>Calculadora</TITLE><BODY>");
   }
   private final void writeFooter(HttpServletResponse response) throws IOException {
      response.getWriter().println("</BODY></HTML>");
   }
  
   /**
    * 'Desenha' o formulário para o usuário preencher;
    * Seta ação que será chamada para este mesmo servlet (ACTION="calc");
    * Seta o método para post (METHOD="POST");
    */
   private final void writeForm(HttpServletRequest request, HttpServletResponse response)
   throws IOException {
      String first = request.getParameter("FIRSTVALUE");
      String second = request.getParameter("SECONDVALUE");
      
      PrintWriter pw = response.getWriter();
      pw.println("<FORM ACTION=\"calc\" METHOD=\"POST\">");
      pw.println("<INPUT TYPE=\"TEXT\" NAME=\"FIRSTVALUE\" VALUE=\"" +((first !
= null) ? first : "") +"\"/>");
      pw.println(" + ");
      pw.println("<INPUT TYPE=\"TEXT\" NAME=\"SECONDVALUE\" VALUE=\"" +
((second != null) ? second : "") +"\"/>");
      pw.println("<INPUT TYPE=\"SUBMIT\" VALUE=\"SOMAR\"/>");
      pw.println("</FORM>");
   }
}

Salve o arquivo e compile da mesma forma que o Hello.


Adicione a declaração da nova servlet no web.xml logo abaixo da declaração da primeira e o
mapeamento
do novo logo abaixo do mapeamento da primeira.

Code:
<servlet>
...
</servlet>

<servlet>
<servlet-name>calc</servlet-name>
<servlet-class>Calc</servlet-class>
</servlet>

<servlet-mapping>
...
</servlet-mapping>

<servlet-mapping>
<servlet-name>calc</servlet-name>
<url-pattern>/servlet/calc</url-pattern>
</servlet-mapping>

Salve o arquivo. Reinicie a aplicação pelo manager do tomcat ou reinicie o próprio tomcat.
Pronto! Estará calculando!

Este artigo apresentou apenas o básico do básico! Há muito mais o que estudar e fazer!

valeu
té+

Tutorial por: Robson Baum

Você também pode gostar