- sobre a rede ;
- sobre arquitetura de software ;
- sobre protocolos HTTP/HTTPS ;
- sobre noções básicas do Maven .
O que é um servlet
Primeiro, vamos descobrir o que é um servlet e por que você ouve falar dele com tanta frequência. Java Servlet API é uma API padronizada projetada para implementação no servidor e trabalho com o cliente usando um esquema de solicitação-resposta. Um servlet é uma classe que pode receber solicitações de um cliente e retornar respostas a ele. Sim, os servlets em Java são precisamente os elementos com os quais a arquitetura cliente-servidor é construída. Se você lembra, já falamos sobre isso em uma das matérias da série. Não vamos fazer rodeios: vamos escrever algum código imediatamente.O que você precisa para criar um aplicativo web
Para trabalhar confortavelmente com servlets em Java, você precisará do Intellij IDEA Ultimate Edition. É pago, mas você pode ativar um período de teste de 30 dias ou usar a versão de acesso antecipado – é sempre gratuito. Instale também nosso servidor de aplicativos - Apache Tomcat. Tomcat é um contêiner de servlet: é aquele que processa solicitações externas e as repassa para nossa aplicação. Você pode baixar o Tomcat neste link .Criando a primeira aplicação web
Se tudo estiver pronto, vamos criar um projeto Maven. Se você não conhece o Maven, preste atenção ao artigo anterior . Vamos começar!-
Em pom.xml, adicione a dependência javax.servlet-api e defina o war de empacotamento:
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>org.example</groupId> <artifactId>servlets</artifactId> <version>1.0-SNAPSHOT</version> <packaging>war</packaging> <dependencies> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>4.0.1</version> </dependency> </dependencies> </project>
Classe de servlet simples:
import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter; @WebServlet("/hello") public class MainServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.setContentType("text/html"); PrintWriter printWriter = resp.getWriter(); printWriter.write("Hello!"); printWriter.close(); } }
-
Para executar a aplicação você precisa criar uma configuração do Tomcat:
-
A seguir indicamos qual versão do Tomcat utilizaremos, a URL pela qual podemos acessar o servidor e a porta. Você deve obter algo assim:
-
Resta apenas especificar o artefato (o projeto montado em um arquivo jar), que será implantado no contêiner. Você pode clicar no botão Corrigir e selecionar guerra explodida : isso significa que após a reconstrução do projeto, o artefato será automaticamente colocado no contêiner do servlet.
-
O contexto do Aplicativo é definido como servlets_war_exploded por padrão , o que significa que o aplicativo deve ser acessado em: http://localhost:8080/servlets_war_exploded .
Por que precisamos de texto extra? Vamos remover coisas desnecessárias. Agora o endereço do nosso aplicativo é: http://localhost:8080 .
-
Clique OK. Vemos que agora temos a oportunidade de lançar o aplicativo:
Agora, ao iniciar o aplicativo, o navegador deverá abrir e exibir um erro 404. Isso é lógico, pois no endereço http://localhost:8080/ deve haver um servlet com o mapeamento “/”, e nosso único servlet possui o mapeamento “/hello” .
-
Entramos em contato com ele em http://localhost:8080/hello e obtemos a resposta esperada - a string “Hello”!
Trabalhando com parâmetros e sessão
Vamos melhorar nosso servlet para que ele possa processar parâmetros de solicitação e trabalhar com a sessão:
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet("/hello")
public class MainServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
HttpSession session = req.getSession();
Integer visitCounter = (Integer) session.getAttribute("visitCounter");
if (visitCounter == null) {
visitCounter = 1;
} else {
visitCounter++;
}
session.setAttribute("visitCounter", visitCounter);
String username = req.getParameter("username");
resp.setContentType("text/html");
PrintWriter printWriter = resp.getWriter();
if (username == null) {
printWriter.write("Hello, Anonymous" + "<br>");
} else {
printWriter.write("Hello, " + username + "<br>");
}
printWriter.write("Page was visited " + visitCounter + " times.");
printWriter.close();
}
}
O servlet está atualmente executando a sessão, incrementando o visitCounter cada vez que a página é visitada. Se o atributo visitCounter ainda não tiver sido criado (na primeira vez que você visitar a página), o método getAttribute() retornará nulo, então você precisa verificar se há nulo. O mesmo se aplica aos parâmetros de solicitação. Se o usuário não passou o parâmetro nome de usuário, seu valor será nulo. Neste caso, cumprimentaremos o usuário como anônimo. Para passar um parâmetro em uma requisição GET são utilizadas path-variables, ou seja, é necessário acessar o link http://localhost:8080/hello?username=Pavel . Você pode ler mais sobre solicitações http no artigo anterior da série. Agora nosso aplicativo tem lógica mínima, mas o erro 404 no caminho raiz é um pouco chato. Para consertar, vamos criar outro servlet e mapeá-lo para a página inicial @WebServlet("/"). A função deste servlet é redirecionar as solicitações para o caminho “/hello”. Existem duas maneiras de fazer isso: usando encaminhamento ou redirecionamento. Talvez valha a pena entender qual é a diferença entre eles. forward - delega o processamento da solicitação para outro servlet no servidor, o cliente não está envolvido. Para fazer isso, você precisa adicionar o seguinte código ao método doGet() do novo servlet:
getServletContext().getRequestDispatcher("/hello").forward(req, resp);
Neste código, acessamos o contexto do servlet, obtemos dele o gerenciador de solicitações do servlet desejado e solicitamos que ele processe uma solicitação específica com os parâmetros especificados (req, resp). redirecionamento - retorna ao cliente o endereço para o qual ele precisa entrar em contato para processar sua solicitação. A maioria dos navegadores acessa o link transmitido automaticamente. Para implementar o redirecionamento você precisa adicionar este código:
resp.sendRedirect(req.getContextPath() + "/hello");
Em HttpServletResponse chamamos o método redireccionamento() e passamos-lhe o endereço que o cliente necessita contactar. Um detalhe importante: os parâmetros http também devem ser adicionados no final do caminho completo de redirecionamento, o que não é muito conveniente. Na nossa situação é preferível usar forward, mas acontece que é melhor usar redirecionamento. Se você entender a diferença no trabalho deles, não errará em sua escolha. O código do novo servlet é assim:
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/")
public class IndexServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// getServletContext().getRequestDispatcher("/hello").forward(req, resp);
resp.sendRedirect(req.getContextPath() + "/hello");
}
}
GO TO FULL VERSION