Criando uma aplicação Java Web com Servlet

(Last Updated On: 1 de junho de 2017)

Todas as vezes que desenvolvemos uma aplicação Java, criamos os nossos arquivos .java, compilamos e executamos os arquivos .class, porém sempre fazemos isso dentro de um computador que precisa ter o Java instalado! Além disso, na maioria das vezes são aplicações que a interface gráfica é um terminal, nada atrativo para o usuário…

E como poderíamos melhorar essa situação? Criando uma aplicação Web! Ou seja, uma aplicação que eu consiga rodar em qualquer plataforma, seja computador, celular ou qualquer dispositivo que rode um navegador qualquer… Mas como podemos fazer isso? Para rodar uma aplicação web nós precisamos de um servidor de aplicação que será responsável em manter a nossa aplicação funcionando!

Atualmente, existem diversos servidores de aplicação e linguagens de programação que podemos utilizar para a nossa aplicação, porém, iremos criar uma aplicação Java Web e o nosso servidor de aplicação será o Tomcat.

Para desenvolver essa aplicação utilizaremos o eclipse IDE que facilitará a nossa vida durante o desenvolvimento! Caso não tenha o eclipse, faça o download da versão para Java EE, descompacte o arquivo .zip e execute o eclipse:

home-eclipse

Precisamos criar um projeto para Java Web! Mas como fazemos isso no eclipse? Simples! Vá em no menu “File > New > Dynamic Web Project”:

nomeando-projeto

Dê um nome ao projeto, nesse caso, eu coloquei como minha-biblioteca, pois será uma aplicação que vai cadastrar e listar todos os meus livros. Após colocar o nome clique em “Next”:

definindo-source

Essa janela serve para configuração de build do projeto. Deixaremos essa configuração padrão, então clique em “Next” novamente:

janela-modulo-web

Essa janela é para a configuração de modulo, marque apenas a opção “Generate web.xml deployment descriptor” para criar o arquivo web.xml padrão que usaremos daqui a pouco, então clique em “Finish”:

projeto-criado

Observe que o nosso projeto foi criado! O que precisamos fazer agora? Como podemos rodar a nossa aplicação? Precisamos, de alguma forma, configurar alguma classe para atender as requisições para a nossa a aplicação, porém, como podemos configurar essa classe?

Existem diversas formas para configurar essa classe e, nesse post, utilizaremos a API de Servlet do Java pra resolver isso!

Baixe a biblioteca Servlet 3.0 e descompacte o arquivo. Agora precisamos adicionar a Servlet ao nosso projeto que é justamente o arquivo .jar.

Vá até o eclipse e observe que existe uma pasta chamada lib dentro da pasta “WebContent/WEB-INF/”. Copie o arquivo .jar e cole nessa pasta:

adicionando-jar

Clique com o botão direito em cima do .jar e escolha a opção “Build Path > Add to Build Path”. Agora vá até a pasta “Java Resource” e observe que o nosso .jar foi adicionado à nossa lista de bibliotecas do projeto!

jar-no-build-path

Quando adicionamos uma biblioteca dentro de uma pasta do nosso projeto, como foi o caso da “WebContent/WEB-INF/lib/”, temos a vantagem de exportar o nosso projeto junto com as dependências para o seu funcionamento, ou seja, todas as bibliotecas necessárias para que ele funcione caso seja reutilizado em qualquer lugar!

Já podemos configurar nossa primeira Servlet! Então vamos criar uma classe nova que representará a nossa Servlet, vamos chama-lá de MainServlet:

package br.com.caelum.alura.biblioteca.servlet;

public class MainServlet {

}

Para transformarmos uma classe em uma Servlet, precisamos estender a classe HttpServlet:

package br.com.caelum.alura.biblioteca.servlet;

import javax.servlet.http.HttpServlet;

public class MainServlet extends HttpServlet {

}

Agora precisamos implementar o método que será responsável em receber uma requisição via HTTP, que é o doGet():

package br.com.caelum.alura.biblioteca.servlet;

import java.io.IOException;

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

public class MainServlet extends HttpServlet {

     @Override
     protected void doGet(HttpServletRequest req, HttpServletResponse resp) 
               throws ServletException, IOException {
		
     }

}

Criamos a nossa primeira Servlet! Vamos rodar a nossa aplicação? Clique com o botão direito em cima do projeto “Run as > 1 Run On Server”:

tela-lista-server

Observe que agora precisamos configurar o servidor de aplicação! Dentro do campo “Select the server type:” digite Tomcat para que seja filtrado o servidor de aplicação. Procure e selecione a versão “Tomcat v7.0 server” e clique em “Next”:

configurand-tomcat

Clique em “Browse” e busque a pasta descompactada do Tomcat. Após encontrar clique em “Finish”:

apos-instalacao-do-tomcat

Agora o Tomcat está configurado! Perceba que foi criado o projeto Servers que é justamente o local onde o eclipse adicionou o nosso Tomcat e também apareceu uma aba de Servers indicando que o Tomcat está funcionando:

tomcat

Além disso, se verificarmos a aba console, veremos o log do Tomcat que exibe se, no momento que ele foi iniciado, ocorreu algum problema ou não:

log-tomcat

Apenas log de INFO, então, aparentemente, está tudo bem! Se clicarmos em cima do Tomcat na view “Servers” ele abrirá o painel de configuração do nosso servidor de aplicação:

painel-tomcat

Observe que temos diversas opções para configurar, porém, as que nos interessa no momento é justamente o port name HTTP/1.1 que é justamente a porta que o Tomcat está tratando requisições do protocolo HTTP, ou seja, para acessar a nossa aplicação via URL do protocolo HTTP precisará utilizar a porta 8080!

Agora podemos testar a nossa aplicação! Vá no navegador copie e cole a seguinte URL http://localhost:8080/minha-biblioteca/ (caso o seu projeto tiver um nome diferente, substitua apenas o minha-biblioteca para o nome do seu projeto) que significa que estamos acessando uma URL via HTTP em localhost (sua própria máquina) e na porta 8080. Por fim, aperte Enter para fazer a chamada para a aplicação:

erro404

Erro 404? Ele não achou nada do meu projeto! O que será que aconteceu? Além de criar uma Servlet, nós precisamos registrá-la no arquivo web.xml que é o arquivo responsável em descrever todas as informações de deploy da aplicação! Então vamos registrar a nossa Servlet:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://java.sun.com/xml/ns/javaee"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
        http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
	id="WebApp_ID" version="3.0">
	<display-name>minha-biblioteca</display-name>

	<servlet>
		<servlet-name>Main Servlet</servlet-name>
		<servlet-class>br.com.caelum.alura.biblioteca.servlet.MainServlet</servlet-class>
	</servlet>

	<welcome-file-list>
		<welcome-file>index.html</welcome-file>
		<welcome-file>index.htm</welcome-file>
		<welcome-file>index.jsp</welcome-file>
		<welcome-file>default.html</welcome-file>
		<welcome-file>default.htm</welcome-file>
		<welcome-file>default.jsp</welcome-file>
	</welcome-file-list>

</web-app>

Observe que tivemos que utilizar a tag servlet-name para dar um nome para a nossa Servlet e a tag servlet-class para especificar qual é a classe que representa essa Servlet que estamos registrando! Perceba também que o nome que precisamos especificar é justamente o nome completo da classe, ou seja, o nome do pacote inteiro e depois a classe.

Se testássemos novamente, a nossa aplicação não responderia com a mesma URL, pois não definimos que iremos atender aquela URL! Para configurarmos o endereço que a nossa Servlet atenderá, basta adicionar a tag servlet-mapping informando o nome da nossa Servlet e a URL que ela vai atender, nesse caso a barra (“/”):

<servlet-mapping>
	<servlet-name>Main Servlet</servlet-name>
	<url-pattern>/</url-pattern>
</servlet-mapping>

o nosso XML fica assim:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://java.sun.com/xml/ns/javaee"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
	id="WebApp_ID" version="3.0">
	<display-name>minha-biblioteca</display-name>

	<servlet>
		<servlet-name>Main Servlet</servlet-name>
		<servlet-class>br.com.caelum.alura.biblioteca.servlet.MainServlet</servlet-class>
	</servlet>

		<servlet-mapping>
			<servlet-name>Main Servlet</servlet-name>
			<url-pattern>/</url-pattern>
		</servlet-mapping>

	<welcome-file-list>
		<welcome-file>index.html</welcome-file>
		<welcome-file>index.htm</welcome-file>
		<welcome-file>index.jsp</welcome-file>
		<welcome-file>default.html</welcome-file>
		<welcome-file>default.htm</welcome-file>
		<welcome-file>default.jsp</welcome-file>
	</welcome-file-list>

</web-app>

Vamos testar novamente a nossa aplicação? Mas antes, vamos adicionar uma mensagem para que seja impressa no momento que for executada:

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) 
          throws ServletException, IOException {
     System.out.println("Meus livros");
}

Clique com o botão direito em cima do projeto “Run as > 1 Run on Server”, agora que o Tomcat já estava iniciado, o eclipse vai perguntar se você deseja reiniciá-lo, marque a opção para reiniciar para garantir que todas as nossas alterações funcionem. Agora, se testarmos a URL http://localhost:8080/minha-biblioteca/:

tela-em-branco

Página em branco? Vamos verificar o nosso console:

log-apos-execucao

O nosso sysout foi impresso! Mas o ideal seria imprimir essa mensagem no navegador! Como podemos fazer isso? Observe que recebemos dois parâmetros no método doGet() o HttpServletRequest req e o HttpServletResponse resp:

  • HttpServletRequest é o parâmetro que representa as requisições à nossa aplicação, ou seja, tudo que o cliente manda será recebido por meio desse parâmetro
  • HttpServletResponse é o parâmetro que representa as respostas da nossa aplicação, ou seja, tudo que mandamos para o cliente será enviado por meio desse parâmetro

Isso significa que podemos o HttpServletResponse para mandar uma mensagem! E faremos isso utilizando o método getWriter() que devolve um objeto do tipo PrintWriter:

@Override
protected void doGet(HttpServletRequest req, 
          HttpServletResponse resp) throws ServletException, IOException {
     PrintWriter writer = resp.getWriter();
}

Agora basta apenas imprimir utilizando o método print():

package br.com.caelum.alura.biblioteca.servlet;

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;

public class MainServlet extends HttpServlet {

     @Override
     protected void doGet(HttpServletRequest req, 
               HttpServletResponse resp) throws ServletException, IOException {
     PrintWriter writer = resp.getWriter();
     writer.print("Meus livros");
     }

}

Vamos testar novamente! Clique com o botão direto em cima do Tomcat e escolha a opção “Restart” para reiniciá-lo, então teste novamente o link http://localhost:8080/minha-biblioteca/:

imprimindo-primeira-mensagem

Conseguimos enviar uma mensagem! Além de só imprimir um texto puro, podemos enviar tags em HTML também, basta informar que a resposta será em HTML por meio do método setContentType(), por exemplo, para listar os meus livros:

package br.com.caelum.alura.biblioteca.servlet;

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;

public class MainServlet extends HttpServlet {

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) 
                  throws ServletException, IOException {

		resp.setContentType("text/html");

		PrintWriter writer = resp.getWriter();
		
		writer.print("Meus livros");

		writer.print("<ul>");

		writer.print("<li>");
		writer.print("Livro de Java Web");
		writer.print("</li>");

		writer.print("<li>");
		writer.print("Livro de Android");
		writer.print("</li>");

		writer.print("</ul>");

	}
}

lista-de-livros-inicial

Excelente! Agora já podemos imprimir as mensagens que desejamos no nosso navegador! E melhor ainda, utilizando HTML!

Nesse post aprendemos a criar uma aplicação Java Web básica utilizando o eclipse para Java EE e a API de Servlet do Java. Vimos como podemos criar um projeto para Java Web e como podemos adicionar a biblioteca de Servlet no projeto por meio do Build Path. Além disso, aprendemos que para criar uma Servlet, precisamos estender a classe HttpServlet, implementar o método doGet() e registrar a nossa Servlet no arquivo web.xml que será responsável em descrever todas as informações de deploy da nossa aplicação! Por fim, vimos como enviar uma resposta em texto ou em HTML todas as vezes que alguém faz uma requisição à nossa aplicação.

E aí, o que achou da API de Servlet? Quer aprender mais sobre Servlets? Pensando nisso, o instrutor Guilherme Silveira criou o curso de Servlets e os fundamentos de Java na Web no Alura, onde é abordado diversos assuntos sobre Servlets e os principais fundamentos sobre a programação de aplicações para Java Web!

Fique por dentro

Content Editor at Alura and Software Developer

Próximo ArtigoDesmistificando o protocolo HTTP - parte 1