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>