aula4-web/
├── pom.xml → configuração Maven (dependências, plugins, empacotamento WAR)
├── src/
│ ├── main/
│ │ ├── java/com/exemplo → código Java (Servlets, classes)
│ │ └── webapp/ → páginas web (HTML, JSP, CSS, JS)
│ │ └── WEB-INF/ → configs internas (web.xml, não acessível direto pelo browser)
└── target/
└── aula4-web.war → pacote final gerado para deploy no Tomcat
mvn clean package
.war gerado em target/aula4-web.war.tomcat/webapps/.cd /opt/tomcat/bin
(ou onde você extraiu, ex.: ~/apache-tomcat-10.1.x/bin) ./startup.sh
./shutdown.sh
C:\tomcat\bin).cmd e rode: bin\startup.bat)http://localhost:8080/
tomcat/webapps/
http://localhost:8080/nome-do-war/
http://localhost:8080/aula4-web/
http://localhost:8080/aula4-web/
src/main/webapp/index.html:<!DOCTYPE html>
<html lang="pt-br">
<head>
<meta charset="UTF-8">
<title>Página Estática</title>
<style>
body { font-family: system-ui, sans-serif; max-width: 720px; margin: 2rem auto; }
header, footer { padding: .8rem; background: #f4f4f4; border-radius: 12px; }
main { margin: 1rem 0; }
</style>
</head>
<body>
<header><h1>Bem-vindo(a) à Página Estática</h1></header>
<main>
<p>Este conteúdo é fixo e não depende do servidor para mudar.</p>
</main>
<footer><small>© 2025 Aula 4</small></footer>
</body>
</html>
#) e estilize.HelloServlet.java em src/main/java/com/exemplo:package com.exemplo;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.*;
import java.io.IOException;
@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
resp.setContentType("text/html; charset=UTF-8");
resp.getWriter().println("""
<!DOCTYPE html>
<html lang="pt-br">
<head><meta charset="UTF-8"><title>Hello Servlet</title></head>
<body style="font-family: system-ui; max-width:720px; margin:2rem auto;">
<h1>Olá do Servlet!</h1>
<p>Este HTML foi gerado no servidor.</p>
<p><a href="/aula4-web/">Voltar à estática</a></p>
</body></html>
""");
}
}
http://localhost:8080/aula4-web/hello.req.getHeader("User-Agent").hello.jsp em webapp/:<%@ page contentType="text/html; charset=UTF-8" %>
<!DOCTYPE html>
<html lang="pt-br">
<head><meta charset="UTF-8"><title>Hello JSP</title></head>
<body style="font-family: system-ui; max-width:720px; margin:2rem auto;">
<h1>Olá, ${usuario}!</h1>
<p>Agora é: ${agora}</p>
<p><a href="/aula4-web/">Home</a></p>
</body>
</html>
HelloServlet:@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
req.setAttribute("usuario", "Aluno");
var agora = java.time.LocalDateTime.now()
.format(java.time.format.DateTimeFormatter.ofPattern("dd/MM/yyyy HH:mm:ss"));
req.setAttribute("agora", agora);
req.getRequestDispatcher("/hello.jsp").forward(req, resp);
}
}
"Aluno" pelo nome passado na query string (/hello?nome=Ana).form.jsp:<%@ page contentType="text/html; charset=UTF-8" %>
<!DOCTYPE html>
<html lang="pt-br">
<head><meta charset="UTF-8"><title>Formulário</title></head>
<body style="font-family: system-ui; max-width:720px; margin:2rem auto;">
<h1>Cadastro Rápido</h1>
<form method="post" action="${pageContext.request.contextPath}/cadastro">
<label>Nome: <input name="nome" required></label><br><br>
<label>Email: <input type="email" name="email" required></label><br><br>
<button type="submit">Enviar</button>
</form>
</body>
</html>
CadastroServlet.java:@WebServlet("/cadastro")
public class CadastroServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
String nome = req.getParameter("nome");
String email = req.getParameter("email");
req.setAttribute("msg", "Cadastro recebido para " + nome + " (" + email + ")");
req.getRequestDispatcher("/resultado.jsp").forward(req, resp);
}
}
resultado.jsp:<%@ page contentType="text/html; charset=UTF-8" %>
<!DOCTYPE html>
<html lang="pt-br">
<head><meta charset="UTF-8"><title>Resultado</title></head>
<body style="font-family: system-ui; max-width:720px; margin:2rem auto;">
<h2>${msg}</h2>
<p><a href="${pageContext.request.contextPath}/form.jsp">Voltar</a></p>
</body>
</html>
form.jsp com mensagem de erro.CursosServlet.java:@WebServlet("/cursos")
public class CursosServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
var cursos = java.util.List.of("HTML & CSS", "Java Web", "Banco de Dados", "JS Avançado");
req.setAttribute("cursos", cursos);
req.getRequestDispatcher("/cursos.jsp").forward(req, resp);
}
}
cursos.jsp:<%@ page contentType="text/html; charset=UTF-8" %>
<%@ taglib uri="http://jakarta.ee/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html lang="pt-br">
<head><meta charset="UTF-8"><title>Cursos</title></head>
<body style="font-family: system-ui; max-width:720px; margin:2rem auto;">
<h1>Cursos Disponíveis</h1>
<ul>
<c:forEach var="c" items="${cursos}">
<li>${c}</li>
</c:forEach>
</ul>
</body>
</html>
?filtro=java.VisitasServlet.java:@WebServlet("/visitas")
public class VisitasServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
HttpSession sess = req.getSession(true);
Integer contador = (Integer) sess.getAttribute("contador");
if (contador == null) contador = 0;
contador++;
sess.setAttribute("contador", contador);
req.setAttribute("contador", contador);
req.getRequestDispatcher("/visitas.jsp").forward(req, resp);
}
}
visitas.jsp:<%@ page contentType="text/html; charset=UTF-8" %>
<!DOCTYPE html>
<html lang="pt-br">
<head><meta charset="UTF-8"><title>Visitas</title></head>
<body style="font-family: system-ui; max-width:720px; margin:2rem auto;">
<h1>Sessão</h1>
<p>Você visitou esta página <strong>${contador}</strong> vez(es) nesta sessão.</p>
<p><a href="${pageContext.request.contextPath}/visitas">Recarregar</a></p>
</body>
</html>
sess.invalidate().index.html, adicione links: Hello, Formulário, Cursos, Visitas./aula4-web/).header.jsp e footer.jsp e inclua em todas as páginas com <jsp:include>.@WebServlet("/rota") está correta e se usou o método GET/POST certo.jakarta.servlet.jsp.jstl no pom.xml e use a URI correta.charset=UTF-8 em HTML/JSP e resp.setContentType("text/html; charset=UTF-8") no Servlet.jakarta.*.<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<!-- Identificação do projeto -->
<groupId>com.exemplo</groupId>
<artifactId>aula4-web</artifactId>
<version>1.0.0</version>
<packaging>war</packaging>
<!-- Propriedades -->
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.release>17</maven.compiler.release>
</properties>
<!-- Dependências -->
<dependencies>
<!-- Servlet API (fornecida pelo Tomcat em tempo de execução) -->
<dependency>
<groupId>jakarta.servlet</groupId>
<artifactId>jakarta.servlet-api</artifactId>
<version>6.0.0</version>
<scope>provided</scope>
</dependency>
<!-- JSTL (Jakarta EE) para uso de <c:forEach>, <c:if> etc. -->
<dependency>
<groupId>org.glassfish.web</groupId>
<artifactId>jakarta.servlet.jsp.jstl</artifactId>
<version>3.0.1</version>
</dependency>
</dependencies>
<!-- Plugins -->
<build>
<finalName>aula4-web</finalName>
<plugins>
<!-- Compilador configurado para Java 17 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.11.0</version>
<configuration>
<release>${maven.compiler.release}</release>
</configuration>
</plugin>
<!-- Plugin WAR atualizado (evita o erro do 2.2 antigo) -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>3.3.2</version>
</plugin>
<!-- Resources para garantir UTF-8 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>3.3.1</version>
</plugin>
</plugins>
</build>
</project>
<packaging>war</packaging> → indica que o projeto será empacotado como WAR (Web Application Archive).provided..war (versão atual evita erros de compatibilidade).pom.xml, basta rodar:mvn clean package
src/main/webapp).target/aula4-web.war.aula4-web/ ← Pasta raiz do projeto
├── pom.xml ← AQUI fica o arquivo POM (configuração do Maven)
│
├── src/
│ └── main/
│ ├── java/
│ │ └── com/
│ │ └── exemplo/
│ │ ├── HelloServlet.java
│ │ ├── CadastroServlet.java
│ │ ├── CursosServlet.java
│ │ └── VisitasServlet.java
│ │
│ └── webapp/ ← Raiz dos recursos web
│ ├── index.html
│ ├── form.jsp
│ ├── resultado.jsp
│ ├── hello.jsp
│ ├── cursos.jsp
│ ├── visitas.jsp
│ └── WEB-INF/
│ └── web.xml (opcional)
│
└── target/ ← Pasta gerada automaticamente após `mvn package`
├── aula4-web/ ← Versão expandida para testes locais
└── aula4-web.war ← Arquivo final para deploy no Tomcat
pom.xml Fica na raiz (aula4-web/pom.xml). É o “cérebro” do Maven: define dependências (Servlet API, JSTL), plugins (war-plugin, compiler) e propriedades do projeto.src/main/java/ Onde ficam os Servlets e classes Java. Exemplo: HelloServlet.java.src/main/webapp/ Onde ficam os recursos web visíveis: HTML, JSP, CSS, JS, imagens. O Tomcat serve esses arquivos direto no navegador.src/main/webapp/WEB-INF/ Área interna do app (não acessível direto pelo browser). Aqui fica o web.xml (caso use configuração manual, não obrigatória quando se usa @WebServlet).target/ Gerada automaticamente pelo Maven. Aqui aparece o .war que você copia para o tomcat/webapps/.pom.xml/home/luiz/projetos/aula4-web/pom.xml






import jakarta.servlet.*;
import jakarta.servlet.http.*;
public class MeuServlet extends HttpServlet {
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<html><body>");
out.println("<h1>Olá do Servlet!</h1>");
out.println("</body></html>");
}
}

<%= variavel %> (para exibir valores)<% código Java %> (para lógica)<%! declarações %> (para métodos/variáveis)<%@ page ... %> (para configurações)<c:forEach> (bibliotecas como JSTL)import jakarta.servlet.*;
import jakarta.servlet.http.*;
import jakarta.servlet.annotation.*;
import java.io.*;
import java.util.Date;
@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
protected void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
// Obtém parâmetro da URL
String nome = request.getParameter("nome");
if (nome == null) nome = "Visitante";
// Define data atual
Date dataAtual = new Date();
// Armazena dados para a JSP
request.setAttribute("usuario", nome);
request.setAttribute("data", dataAtual);
// Encaminha para JSP
RequestDispatcher dispatcher =
request.getRequestDispatcher("/WEB-INF/hello.jsp");
dispatcher.forward(request, response);
}
}
<%@ page contentType="text/html;charset=UTF-8" %>
<%@ taglib prefix="c" uri="jakarta.tags.core" %>
<!DOCTYPE html>
<html>
<head>
<title>Exemplo Dinâmico</title>
<link rel="stylesheet" href="estilos.css">
</head>
<body>
<h1>Olá, ${usuario}!</h1>
<p>Bem-vindo à nossa página dinâmica.</p>
<p>Data e hora atual: ${data}</p>
<form method="get" action="hello">
<label>Seu nome:</label>
<input type="text" name="nome">
<button type="submit">Enviar</button>
</form>
</body>
</html>