Fundamentos e Funcionamento do Java Server Pages (JSP)

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ícito exception.
  • 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 .java traduzido, 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):

  1. Page Scope: Acessível apenas na página atual.
  2. Request Scope: Disponível durante o ciclo de uma requisição (sobrevive a encaminhamentos/forwards).
  3. Session Scope: Mantido enquanto a sessão do usuário estiver ativa.
  4. 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>

Tags: jsp java Servlets JakartaEE WebDevelopment

Publicado em 7-18 18:51