Fundamentos de JSP e Servlets para Desenvolvimento Web

Tags de Scriptlet em JSP

As tags de scriptlet permitem incorporar código Java diretamente nas páginas JSP. Existem três variações principais:

  • <%! %> - Utilizada para declarar variáveis de instância, métodos e classes a nível global.
  • <% %> - Permite definir variáveis locais e executar comandos Java.
  • <%= %> - Serve para exibir o resultado de uma expressão ou variável na página.

Diretivas de Inclusão no JSP

Existem duas formas de incluir conteúdo de outras páginas JSP:

  • <%@ include file="..." %> - Inclusão estática: o conteúdo é combinado antes da compilação.
  • <jsp:include page="..."> - Inclusão dinâmica: cada arquivo é compilado separadamente e depois unido. Recomendada para desenvolvimento moderno.

Encaminhamento de Requisições no JSP

A tag <jsp:forward> permite redirecionar a requisição internamente no servidor, podendo incluir parâmetros:

<jsp:forward page="destino.jsp">
    <jsp:param value="admin" name="usuario"/>
    <jsp:param value="senha123" name="senha"/>
</jsp:forward>

No arquivo destino.jsp, os parâmetros podem ser recuperados assim:

<body>
  Página após redirecionamento interno<br>
  Usuário: <%= request.getParameter("usuario") %>
  Senha: <%= request.getParameter("senha") %>
</body>

Outra alternativa é usar response.sendRedirect("destino.jsp"), que funciona de maneira diferente.

Diferenças entre Forward e SendRedirect

jsp:forward: O redirecionamento ocorre totalmente no servidor. O navegador mantém a URL original na barra de endereços. Ambas as páginas compartilham o mesmo objeto request, pois apenas uma requisição HTTP é feita pelo cliente.

response.sendRedirect: O servidor envia uma resposta HTTP insrtuindo o navegador a fazer uma nova requisição para a URL especificada. São geradas duas requisições distintas, cada uma com seu próprio objeto request.

Objetos Implícitos e Escopos no JSP

O JSP disponibiliza nove objetos implícitos: pageContext, request, response, session, application, config, out, page e exception.

Os Quatro Escopos de Atributos

1. Escopo Page

Dados disponíveis apenas na página atual. Utiliza javax.servlet.jsp.PageContext.

<body>
<%
    pageContext.setAttribute("nomeCompleto", "Maria Silva");
    pageContext.setAttribute("idadeUsuario", 28);
    
    String nomeRecuperado = (String) pageContext.getAttribute("nomeCompleto");
    int idadeRecuperada = (Integer) pageContext.getAttribute("idadeUsuario");
%>
<p>Nome: <%= nomeRecuperado %></p>
<p>Idade: <%= idadeRecuperada %></p>
</body>

2. Escopo Request

Dados persistem durante uma única requisição HTTP. Utiliza javax.servlet.http.HttpServletRequest.

<body>
<%
    request.setAttribute("funcionario", "João Pereira");
    request.setAttribute("departamento", "TI");
%>
<jsp:forward page="resultadoReq.jsp"/>
</body>

No arquivo resultadoReq.jsp:

<body>
<%
    String func = (String) request.getAttribute("funcionario");
    String dept = (String) request.getAttribute("departamento");
    
    java.util.Enumeration<String> cabecalhos = request.getHeaderNames();
    while (cabecalhos.hasMoreElements()) {
        String nomeCabecalho = cabecalhos.nextElement();
        String valorCabecalho = request.getHeader(nomeCabecalho);
%>
    <h4><%= nomeCabecalho %>: <%= valorCabecalho %></h4>
<%  } %>
<p>Funcionário: <%= func %></p>
<p>Departamento: <%= dept %></p>
</body>

3. Escopo Session

Dados mantidos durante uma sessão de navegador. Utiliza javax.servlet.http.HttpSession.

<body>
<%
    session.setAttribute("clienteAtual", "Ana Costa");
    session.setAttribute("nivelAcesso", 3);
%>
<h2>Dados da sessão armazenados com sucesso!</h2>
</body>

Em outra página da mesma sessão:

<body>
<%
    String cliente = (String) session.getAttribute("clienteAtual");
    Integer nivel = (Integer) session.getAttribute("nivelAcesso");
%>
<p>Cliente: <%= cliente %></p>
<p>Nível de Acesso: <%= nivel %></p>
</body>

4. Escopo Application

Dados compartilhados por todos os usuários do servidor. Utiliza javax.servlet.ServletContext.

<body>
<%
    application.setAttribute("versaoSistema", "2.5.1");
    application.setAttribute("totalUsuarios", 1500);
%>
<h2>Informações globais configuradas!</h2>
</body>

Para recuperar em qualquer página:

<body>
<%
    String versao = (String) application.getAttribute("versaoSistema");
    Integer total = (Integer) application.getAttribute("totalUsuarios");
%>
<p>Versão do Sistema: <%= versao %></p>
<p>Usuários Cadastrados: <%= total %></p>
</body>

Objeto Response

O objeto response (javax.servlet.HttpServletResponse) é responsável por enviar respostas ao cliente. Entre suas funcionalidades estão: atualização automática da página, redirecionamento e manipulação de cookies.

Atualização Automática

<body>
<%
    response.setHeader("refresh", "2");
    java.util.Date dataAtual = new java.util.Date();
%>
<p>Data e hora atual: <%= dataAtual.toLocaleString() %></p>
</body>

Exemplo Prático: Login com Cookies

Página de login (loginForm.jsp):

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%@ page import="javax.servlet.http.Cookie" %>
<html>
<head>
<title>Página de Login</title>
<script>
    function limparCampos() {
        document.getElementById("campoUser").value = "";
        document.getElementById("campoSenha").value = "";
    }
</script>
<%
    String usuarioSalvo = "";
    String senhaSalva = "";
    Cookie[] listaCookies = request.getCookies();
    
    if (listaCookies != null) {
        for (Cookie ck : listaCookies) {
            if ("credenciais".equals(ck.getName())) {
                String[] partes = ck.getValue().split("\\|");
                usuarioSalvo = partes[0];
                senhaSalva = partes[1];
            }
        }
    }
%>
</head>
<body>
<form action="processarLogin.jsp" method="POST">
    <label>Usuário:</label>
    <input type="text" id="campoUser" name="campoUser" value="<%= usuarioSalvo %>" /><br>
    
    <label>Senha:</label>
    <input type="password" id="campoSenha" name="campoSenha" value="<%= senhaSalva %>" /><br>
    
    <input type="checkbox" id="manterConectado" name="manterConectado" value="sim" />
    <label for="manterConectado">Manter conectado</label><br>
    
    <input type="submit" value="Entrar" />
    <input type="button" value="Limpar" onclick="limparCampos()" />
</form>
</body>
</html>

Processamento do login (processarLogin.jsp):

<html>
<body>
<%
    String usuario = request.getParameter("campoUser");
    String senha = request.getParameter("campoSenha");
    String manter = request.getParameter("manterConectado");
    
    if ("sim".equals(manter)) {
        Cookie cookieCredenciais = new Cookie("credenciais", usuario + "|" + senha);
        cookieCredenciais.setMaxAge(7 * 24 * 60 * 60);
        response.addCookie(cookieCredenciais);
    }
    
    response.sendRedirect("loginForm.jsp");
%>
</body>
</html>

Objeto Out

O objeto out (javax.servlet.jsp.JspWriter) é utilizado para enviar dados ao navegador e gerenciar o buffer de saída do servidor.

<body>
<%
    out.print("<h2>");
    out.print("Bem-vindo ao Sistema JSP");
    out.println("</h2>");
    
    int tamanhoTotal = out.getBufferSize();
    int espacoDisponivel = out.getRemaining();
    int espacoUtilizado = tamanhoTotal - espacoDisponivel;
    
    out.println("Tamanho total do buffer: " + tamanhoTotal + " bytes<br>");
    out.println("Espaço disponível: " + espacoDisponivel + " bytes<br>");
    out.println("Espaço utilizado: " + espacoUtilizado + " bytes<br>");
%>
</body>

Objeto Config

O objeto config (javax.servlet.ServletConfig) permite acessar parâmetros de inicialização configurados no arquivo web.xml.

Configuração no web.xml:

<servlet>
    <servlet-name>configDB</servlet-name>
    <jsp-file>/configBD.jsp</jsp-file>
    <init-param>
        <param-name>driverJdbc</param-name>
        <param-value>com.mysql.cj.jdbc.Driver</param-value>
    </init-param>
    <init-param>
        <param-name>urlConexao</param-name>
        <param-value>jdbc:mysql://localhost:3306/meu_banco</param-value>
    </init-param>
</servlet>

<servlet-mapping>
    <servlet-name>configDB</servlet-name>
    <url-pattern>/configurar</url-pattern>
</servlet-mapping>

Acessando os parâmetros em configBD.jsp:

<body>
<%
    String driver = config.getInitParameter("driverJdbc");
    String url = config.getInitParameter("urlConexao");
%>
<h2>Driver do Banco: <%= driver %></h2>
<h2>URL de Conexão: <%= url %></h2>
</body>

Objeto Exceptoin

O objeto exception (java.lang.Throwable) captura exceções que ocorrem durante a execução de uma página JSP. É necessário configurar a página de erro.

Página que gera o erro (paginaCalculo.jsp):

<%@ page errorPage="paginaErro.jsp" %>
<html>
<body>
<%
    int numerador = 100;
    int denominador = 0;
    out.println("Resultado: " + (numerador / denominador));
%>
</body>
</html>

Página de tratamento de erro (paginaErro.jsp):

<%@ page isErrorPage="true" %>
<html>
<body>
<h2>Ocorreu um problema durante o processamento</h2>
<%
    if (exception != null) {
        out.println("<p>Detalhes do erro: " + exception.getMessage() + "</p>");
    }
%>
</body>
</html>

Objeto PageContext

O pageContext atua como um facilitador centralizado, permitindo acessar todos os outros objetos implícitos e seus respectivos escopos a partir de uma única referrência.

<body>
<%
    pageContext.setAttribute("dadoPage", "Valor no escopo page");
    request.setAttribute("dadoRequest", "Valor no escopo request");
    session.setAttribute("dadoSession", "Valor no escopo session");
    application.setAttribute("dadoApp", "Valor no escopo application");
    
    out.println("Acessando via pageContext:<br><br>");
    out.println("Page: " + pageContext.getAttribute("dadoPage") + "<br>");
    out.println("Request: " + pageContext.getRequest().getAttribute("dadoRequest") + "<br>");
    out.println("Session: " + pageContext.getSession().getAttribute("dadoSession") + "<br>");
    out.println("Application: " + pageContext.getServletContext().getAttribute("dadoApp") + "<br>");
%>
</body>

Tags: jsp servlet Java EE PageContext Request

Publicado em 6-27 07:18