Nessa aula, vamos aprender a complementar o uso de servlets com Java Server Pages (JSP).
Ao final da aula, poderemos simplificar o trabalho de construir respostas à requisições HTTP e realizar a separação da apresentação da nossa interface (View) da lógica de controle e obtenção de informações (Controller).
Programar servlets nos permite responder requisições HTTP, mas escrever documentos usando métodos de um servlet é trabalhoso e torna o código Java poluído com elementos de marcação, violando a separação entre os componentes View e Controller do MVC.
Por essas razões, os servlet containers oferecem um recurso que permite a composição de documentos dinamicamente no servidor, através de uma combinação linguagem de marcação e Java.
Esse recurso é chamado de Java Server Pages (JSP).
Para usar o JSP, escrevemos um documento de marcação que contém tags especiais onde podemos colocar código Java que vai conduzir a construção do documento HTML (ou outro formato) que será enviado como resposta a uma requisição.
Escrevemos esse documento em um arquivo .jsp no servidor, no diretório de documentos Web do servlet container. O JSP será compilado para um servlet quando o servidor HTTP for iniciado, ou quando o arquivo for modificado.
Podemos incluir o código java das seguintes formas:
Scriptlet: inclusão de um fragmento de código Java sem consequência explícita na resposta. Se quisermos escrever algo na resposta precisamos imprimir usando um dos métodos do PrintWriter out. As linhas devem ser terminadas com ponto-e-vírgula como no código Java normal.
Expressão JSP: fragmento Java que escreve uma saída na resposta. A expressão Java deve resultar em um valor e não deve ser terminada com ponto-e-vírgula.
Declaração JSP: fragmento Java que declara uma ou mais variáveis, que podem ser utilizadas nos outros fragmentos Java ao longo do JSP. As linhas devem ser terminadas com ponto-e-vírgula como no código Java normal.
Diretivas JSP: marcações que passam instruções para o compilador JSP, definindo como outras partes do documento serão processadas.
Podem ser usadas para definir configurações da página, tags adicionais e importar classes.
<html>
<head>
<title>Exemplo JSP</title>
</head>
<body>
<p>A data de hoje é: <% out.print((new java.util.Date()).toLocaleString()); %></p>
</body>
</html>
<html>
<head>
<title>Exemplo JSP</title>
</head>
<body>
<p>A data de hoje é: <%= (new java.util.Date()).toLocaleString() %></p>
</body>
</html>
<html>
<head>
<title>Exemplo JSP</title>
</head>
<body>
<%!
HashMap<Integer, String> itens = new HashMap<>();
%>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" import="java.util.*" %>
<html>
<head>
<title>Exemplo JSP</title>
</head>
<body>
<%!
HashMap<Integer, String> itens = new HashMap<>();
%>
</body>
</html>
Como um JSP é um tipo de Servlet, dentro dos fragmentos de código podem ser acessados alguns objetos implícitos, como request (HTTPServletRequest), response (HTTPServletResponse), out (PrintWriter), entre outros.
Consulte o material de apoio para ver a lista completa de objetos implícitos.
<html>
<head>
<title>Exemplo JSP</title>
</head>
<body>
<p>O endereço IP do requisitante é: <%= request.getRemoteAddr() %></p>
</body>
</html>
Vejamos então um exemplo usando um loop para preencher uma tabela:
A declaração de variáveis, inicialização e composição da resposta são feitos em fragmentos separados.
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" import="java.util.*" %>
<html>
<head>
<title>Exemplo JSP</title>
<style>
table, th, td {
border: 1px solid black;
border-collapse: collapse;
}
</style>
</head>
<body>
<%!
HashMap<Integer, String> itens = new HashMap<>();
%>
<%
itens.put(1, "Primeiro");
itens.put(2, "Segundo");
itens.put(3, "Terceiro");
%>
<table>
<thead>
<tr>
<td>Chave</td>
<td>Valor</td>
</tr>
</thead>
<tbody>
<%
for (Map.Entry<Integer, String> item: itens.entrySet()) {
out.print("<tr>");
out.print("<td>");
out.print(item.getKey());
out.print("</td>");
out.print("<td>");
out.print(item.getValue());
out.print("</td>");
out.print("</tr>");
}
%>
</tbody>
</table>
</body>
</html>
Sabemos agora como compor um documento em resposta a uma requisição usando JSP.
Leia o material de apoio e experimente escrever JSPs que respondem à formulários HTML.
Na próxima aula aprenderemos a facilitar ainda mais a composição das respostas usando a biblioteca de tags padrão JSP (JSTL).
Pergunta:
Exercício:
Até a próxima aula!