O Java Server Pages (JSP) é uma tecnologia baseada em Java que simplifica a criação de páginas web dinâmicas. Ao contrário dos Servlets tradicionais, onde o HTML é inserido dentro de código Java (o que torna a manutenção complexa), o JSP permite que o código Java seja inserido diretamente em arquivos HTML, invertendo a lógica de desenvolvimento e facilitando a separação entre apresentação e lógica de negócios.
1. A Natureza do JSP
Fundamentalmente, um arquivo JSP é um Servlet. Na primeira vez que um arquivo .jsp é requisitado, o container web (como o Apache Tomcat) o traduz para um arquivo fonte Java (extensão .java), que herda de uma classe base (geralmente HttpJspBase, que por sua vez estende HttpServlet). Posteriormente, esse arquivo é compilado em um bytecode (.class) para execução.
2. Diretivas de Página
As diretivas são instruções que configuram o ambiente da página. A mais comum é a diretiva page:
<%@ page contentType="text/html;charset=UTF-8" language="java" import="java.util.*" %>
- contentType: Define o tipo de MIME e o conjunto de caracteres da resposta.
- import: Importa classes Java necessárias para a lógica da página.
- errorPage: Define uma URL para a qual o usuário será redirecionado em caso de exceção.
- isErrorPage: Se definido como
true, permite que a página acesse o objeto implícitoexception. - session: Controla se a página deve criar automaticamente uma
HttpSession.
3. Elementos de Script
Existem três formas principais de inserir código Java em uma página JSP:
A) Declarações
Usadas para definir membros (variáveis e métodos) na classe do Servlet gerado. O código inserido aqui fica fora do método _jspService().
<%!
private int contadorAcesso = 0;
public String formatarNome(String str) {
return str != null ? str.toUpperCase() : "";
}
%>
B) Expressões
Utilizadas para exibir valores diretamente na saída HTML. Elas são convertidas internamente para out.print() e não devem terminar com ponto e vírgula.
<p>O resultado da soma é: <%= 10 + 20 %></p>
<p>Usuário logado: <%= request.getParameter("user") %></p>
C) Scriptlets
Permitem a execução de blocos lógicos complexos (if, for, while) dentro da página. O código é inseriod dentro do método _jspService().
<%
List<String> itens = Arrays.asList("Java", "Spring", "JSP");
for (String item : itens) {
if (item.startsWith("J")) {
%>
<li>Tecnologia: <%= item %></li>
<%
}
}
%>
4. Comentários no JSP
É importante distinguir os tipos de comentários, pois eles afetam a visibilidade do código:
<!-- Comentário HTML -->: Enviado ao navegador e visível no código-fonte da página.<%-- Comentário JSP --%>: Removido durante a fase de tradução; não aparece no Servlet nem no navegador.<% // Comentário Java %>: Presente no arquivo.javatraduzido, mas não enviado ao cliente.
5. Objetos Implícitos e Escopos
O container disponibiliza nove objetos pré-definidos para uso imediato:
request,response,pageContext,session,application,out,config,page,exception.
Os dados podem ser armazenados em quatro níveis de escopo (do menor para o maior):
- Page Scope: Acessível apenas na página atual.
- Request Scope: Disponível durante o ciclo de uma requisição (sobrevive a encaminhamentos/forwards).
- Session Scope: Mantido enquanto a sessão do usuário estiver ativa.
- Application Scope: Compartilhado por toda a aplicação web enquanto o servidor estiver rodando.
6. Inclusão de Arquivos e Encaminhamento
Existem duas formas de incluir conteúdos exetrnos:
- Inclusão Estática (
<%@ include file="..." %>): O conteúdo do arquivo é copiado para o JSP principal no momento da tradução (tempo de compilação). - Inclusão Dinâmica (
<jsp:include page="..." />): A inclusão ocorre durante a execução, permitindo passar parâmetros via<jsp:param>.
Para navegação entre páginas no servidor, utiliza-se a tag de forward:
<jsp:forward page="/destino.jsp" />
7. Exemplos de Implementação
Gerando uma Tabuada Dinâmica
<table border="1">
<%
for (int multiplicador = 1; multiplicador <= 10; multiplicador++) {
%>
<tr>
<%
for (int base = 1; base <= 5; base++) {
%>
<td><%= base %> x <%= multiplicador %> = <%= base * multiplicador %></td>
<% } %>
</tr>
<% } %>
</table>
Exibição de Lista de Objetos (Simulação de Cadastro)
Considerando uma classe Colaborador com atributos id, nome e setor:
<%
// Simulação de dados vindos de um Servlet através do Request Scope
List<Colaborador> lista = (List<Colaborador>) request.getAttribute("colaboradores");
%>
<table>
<thead>
<tr>
<th>ID</th>
<th>Nome</th>
<th>Setor</th>
</tr>
</thead>
<tbody>
<% if (lista != null) {
for (Colaborador c : lista) { %>
<tr>
<td><%= c.getId() %></td>
<td><%= c.getNome() %></td>
<td><%= c.getSetor() %></td>
</tr>
<% }
} %>
</tbody>
</table>