Introdução

O objetivo principal de JSP é escrever facilmente HTML junto ao conteúdo dinâmico do lado servidor.

Em vez de usar trechos de código como

out.println("<p>" + variavel + "</p>");

escrevemos algo mais amigável

<p><%= variavel %></p>

Arquivo JSP

<%@ page language="java" contentType="text/html"
         pageEncoding="UTF-8"
         import="java.util.Date" %>
<html>
<head>
    <title>Página Legal</title>
</head>
<body>
    <p>Hoje é <%= new Date() %></p>
</body>
</html>
<html>
<head>
    <title>Página Legal</title>
</head>
<body>
    <p>Hoje é Mon Aug 28 10:58:56 BRT 2017</p>
</body>
</html>

Usando arquivos JSP

Arquivos JSP são criados na pasta de conteúdo web com a extensão .jsp.

Projeto de aplicação web no NetBeans

Compilação do arquivo JSP

O arquivo JSP, na verdade, é um servlet, mas a compilação é feita automaticamente pelo container.

Scriptlet

Os arquivos JSP permitem a introdução de código Java em um ambiente chamado scriptlet.

<h1>Exemplo de Scriptlet</h1>

<%
    String[] lista = request.getParameterValues("lista");

    boolean achou = false;
    for (int i = 0; i < lista.length; i++) {    
        if ("nome".equals(lista[i])) {
            achou = true;
            break;
        }
    }
%>

<p>Resultado da busca: <%= achou %></p>
<h1>Exemplo de Scriptlet</h1>


<p>Resultado da busca: true</p>

Expressões scriptlets

Uma expressão scriptlet consiste em escrever na resposta o valor de uma variável ou expressão Java.

O exemplo abaixo escreve o conteúdo da variável achou.

<%= achou %>

Variáveis implícitas

Dentro do ambiente scriptlet, algumas variáveis vem previamente declaradas automaticamente:

<%
    String nome = request.getParameter("nome");

    if (nome != null) {
        out.print("A requisição contém o parâmetro 'nome'");
    }
%>

Lista das principais variáveis implícitas

Variável Descrição
request Objeto com os dados da requisição do cliente.
response Objeto para escrever informações da resposta do servidor.
out Similar ao objeto obtido por response.getWriter().
session Informações da sessão do usuário.
config Informações de configuração da aplicação web.
application Informações da aplicação web.
pageContext Informações da página atual.

Comentários em arquivos JSP

<%-- Isto é um comentário JSP --%>
<!--
    A diferença para os comentários HTML é que os
    comentários JSP não aparecem no lado cliente
-->

Diretiva page

Esta diretiva permite definir informações da página ao gerar a resposta para ser enviada ao cliente.

Além disso, serve para fazer a importação de classes Java a serem usadas na página.

<%@ page language="java" contentType="text/html"
         pageEncoding="UTF-8"
         import="java.util.Date" %>

JavaBeans

JavaBeans são classes sem construtor ou possui ao menos um construtor sem argumentos.

Usamos um ou mais JavaBeans no JSP para reduzir a quantidade de código scriptlet e ter uma descrição dos dados usados na página.

package meupacote;

public class MeuPrimeiroBean {
    private String mensagem = "Bem vindo";

    public String getMensagem() {
        return mensagem;
    }

    public void setMensagem(String mensagem) {
        this.mensagem = mensagem;
    }
}
<%@ page language="java" contentType="text/html;charset=UTF-8" %>
<!DOCTYPE html>
<html>
<body>
  <jsp:useBean id="primeirobean" class="meupacote.MeuPrimeiroBean"/>
  <p>
    A mensagem atual é
    <strong><jsp:getProperty name="primeirobean" property="mensagem"/></strong></p>

  <jsp:setProperty name="primeirobean" property="mensagem" value="JavaBean é legal"/>
  <p>
    A mensagem depois de adicionada é
    <strong><jsp:getProperty name="primeirobean" property="mensagem"/></strong></p>
</body>
</html>
<!DOCTYPE html>
<html>
<body>
  <p>
    A mensagem atual é
    <strong>Bem vindo</strong></p>
  
  <p>
    A mensagem depois de adicionada é
    <strong>JavaBean é legal</strong></p>
</body>
</html>

Expression Language (EL)

Forma de trabalhar com beans de forma mais simplificada.

<jsp:useBean id="primeirobean" class="meupacote.MeuPrimeiroBean"/>
A mensagem atual é ${primeirobean.mensagem}
A mensagem atual é Bem vindo

Constantes

Booleanos: ${true} ou ${false}
Strings: ${"Seja bem vindo!"}
Inteiros: ${102}
Reais: ${34.17}
Nulo: ${null}
Booleanos: true ou false
Strings: Seja bem vindo!
Inteiros: 102
Reais: 34.17
Nulo: 

Expressões

Booleanas: ${7 + 3 == 10}
Numéricas: ${102 * 2} e ${34.17 + 3}
Booleanas: true
Numéricas: 204 e 37.17

Expressões Facilitadoras

Alguns recursos estão disponíveis diretamente com o uso da Expression Language.

${param['nome']}          <!-- valor de parâmetro  -->
${paramValues['valor']}   <!-- array de parâmetros -->
${cookie['acesso']}       <!-- valor de cookie     -->
${header['User-Agent']}   <!-- valor de cabeçalho  -->

JavaServer Pages Standard Tag Library (JSTL)

A programação JSP é muito mais suave utilizando a biblioteca JSTL.

Instalação da biblioteca

Antes de usar o JSTL, é preciso ter a biblioteca.

Com a IDE NetBeans, este é um simples passo.

Utilizando a biblioteca

JSTL, na verdade, é uma coleção de bibliotecas.

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql"%>

Exemplos de uso

Criação de variáveis <c:set> e saída segura <c:out>

<c:set var="email" value="${param['email']}"/>

Seu e-mail é <b><c:out value="${email}"/></b>

Se o cliente requisitar com a query string email=joao@exemplo.com, receberá:

Seu e-mail é <b>joao@exemplo.com</b>

Remoção de variáveis <c:remove>, condicional com <c:if> e <c:choose>

<c:if test="${param['nome'] != null}">
    <c:set var="nome" value="${param['nome']}"/>
    Seu nome é: <c:out value="${nome}"/>
</c:if>

<c:remove var="nome"/>

<c:choose>
    <c:when test="${nome != null}">
        A variável &dollar;{nome} contém o valor ${nome}
    </c:when>
    <c:otherwise>
        A variável &dollar;{nome} foi removida
    </c:otherwise>
</c:choose>

<form action="${pageContext.request.requestURI}" method="post">
    Nome: <input type="text" name="nome"><br>
    <input type="submit">
</form>

Requisição para /WebApplication1/exemplo.jsp?nome=Florentina+de+Jesus:

Seu nome é: Florentina de Jesus

A variável &dollar;{nome} foi removida    

<form action="/WebApplication1/exemplo.jsp" method="post">
    Nome: <input type="text" name="nome"><br>
    <input type="submit">
</form>

Loops <c:forEach>

<c:forEach var="pal" items="${paramValues['palavras']}">
    <c:out value="${pal}"/><br>
</c:forEach>

Com a query string palavras=Sapato&palavras=Bolsa&palavras=Festa:

Sapato<br>
Bolsa<br>
Festa<br>

URL relativa ao contexto

A tag <c:url> aponta para recursos dentro da aplicação, independente do contexto escolhido no container.

Por exemplo, se foi feito deploy da aplicação para /AppLoja, então o seguinte código

<c:url value="/imagem/banner.jpg"/>

se tornará

/AppLoja/imagem/banner.jpg

Referenciando recursos com <c:url>

<img src='<c:url value="/imagem/banner.jpg"/>'>
<img src='/AppLoja/imagem/banner.jpg'>

Leitura Recomendada

Capítulos 9, 10, 12, 13, 16 e 17