# JavaServer Pages

JavaServer Pages (JSP) é uma tecnologia que ajuda os desenvolvedores de software a criarem páginas web geradas dinamicamente baseadas em HTML, XML ou outros tipos de documentos. Lançada em 1999 pela Sun Microsystems, JSP é similar ao PHP, mas usa a linguagem de programação Java.
Para implantar e executar JavaServer Pages, um servidor web compatível com um container servlet, como Apache Tomcat, Jetty ou Glassfish, é requerido.
Por ser baseada na linguagem de programação Java, tem a vantagem da portabilidade de plataforma, que permite a sua execução em diversos sistemas operacionais, como o Windows da Microsoft, Unix e Linux.
Esta tecnologia permite ao desenvolvedor de páginas para Internet produzir aplicações que acessem o banco de dados, manipulem arquivos no formato texto, capturem informações a partir de formulários e captem informações sobre o visitante e sobre o servidor.
Uma página criada com a tecnologia JSP, após instalada em um servidor de aplicação compatível com a tecnologia Java EE, é transformada em um Servlet.

## Visão geral

Arquitetonicamente, a JSP pode ser vista como uma abstração de alto nível de servlets Java. JSPs são traduzidas em servlets em tempo de execução. Cada servlet JSP é armazenado em cache e reutilizado até que a JSP original seja modificada.
JSP pode ser usada independentemente ou como o componente de visão de um projeto modelo-visão-controlador do lado do servidor, normalmente com JavaBeans como modelo e servlets Java (ou um framework como o Apache Struts) como o controlador. Este é um tipo de arquitetura Modelo 2.
JSP permite que o código Java e algumas ações pré-definidas sejam intercalados com conteúdo de marcação web estático, com a página resultante sendo compilada e executada no servidor que irá entregar um documento. As páginas compiladas, assim como as bibliotecas Java dependentes, utilizam o bytecode Java em vez de um formato de software nativo. Como qualquer outro programa Java, elas devem ser executadas em uma máquina virtual Java (JVM), que se integra com o sistema operacional do host servidor para fornecer um ambiente de plataforma neutra abstrato.
JSPs são normalmente utilizadas para entregar documentos HTML e XML, mas através do uso de OutputStream, elas também podem proporcionar outros tipos de dados.
O recipiente web cria objetos JSP implícitos como pageContext, servletContext, session, request & response.

## A linguagem

Em relação a arquitetura, JSP pode ser visto como uma abstração de alto nível dos Java servlets. Páginas JSP são carregadas dentro do servidor e processado a partir de uma estrutura especial do servidor Java, chamada Java EE Web Application, muitas vezes como um arquivo .war .ear.
JSP permite que código Java e certas ações pré-definidas sejam intercaladas com conteúdo de marcação estático, resultando na página sendo compilada e executada no servidor para ser entregue num documento HTML ou XML. As páginas compiladas e qualquer dependência de biblioteca Java usa os bytecodes primeiro que o formato nativo de software, e deve assim ser executado com uma JVM, a máquina virtual Java, integrada com o host do sistema operacional para prover um ambiente de abstração de plataforma.
A sintaxe de JSP é uma mistura de dois tipos básicos de conteúdo: scriptlet elements e markup. Markup é tipicamente um padrão HTML ou XML, enquanto os elementos scriptlet são blocos de código Java os quais podem ser unidos com o tipo de marcação, markup. Quando a página é requisitada o código Java é executado e sua saída é adicionada, in loco, com o ambiente de marcação para gerar a página final. Códigos JSP devem ser compiladas para criação das classes bytecodes antes de serem executadas, mas essa compilação é necessária apenas quando é feita uma mudança no código.

## Sintaxe

Páginas JSP utilizam vários delimitadores para funções de script. A mais básica é <% ... %>, que delimita um scriptlet JSP. Um scriptlet é um fragmento de código Java que é executado quando o usuário solicita uma página. Outros delimitadores comuns incluem <%= ... %> para expressões, onde o valor da expressão é colocado na página entregue ao usuário, e diretivas, denotadas com <%@ ... %>.
O código Java não é necessário ser completo ou auto-contido dentro de seu bloco de elemento scriptlet, mas pode abranger conteúdos de marcação fornecendo a página como um todo é sintaticamente correto. Por exemplo, qualquer bloco Java if/for/while aberto em um elemento scriptlet deve ser corretamente fechado em um elemento posterior para que a página seja compilada com sucesso. A marcação que cai dentro de um bloco de código quebrado está sujeito aquele código, desta forma a marcação dentro do bloco if aparecerá apenas na saída quando a condição if for avaliada como verdadeira (true). Do mesmo modo, a marcação dentro de uma construção de loop pode aparecer várias vezes na saída dependendo de quantas vezes o corpo do loop for executado.
O código seguinte seria um loop for válido em uma página JSP:
A saída mostrada no navegador web do usuário seria:
    Contando até três:
    Este número é 1.
    Este número é 2.
    Este número é 3.
    Contagem concluída.

### Comentários JSP

O JSP tem um tipo de comentário próprio, por exemplo: <%-- comentário --%>
Nota: este comentário só aparece do lado do servidor, não aparecendo por isso no código-fonte do navegador.

### Tags JSP

No JSP existem 5 tags:
1 - Declaration tag
Esta tag permite declarar variáveis e métodos. A sua sintaxe é: <%! …mais alguma coisa.. %> Um exemplo,
2 - Expression tag
Esta tag permite mostrar algum resultado. A sua sintaxe é: <%=..algo para mostrar…%> Por exemplo, para mostrar o valor da variável contador bastava apenas:
<%=contador %>
3 - Directive tag
Esta tag permite dar informação sobre a página ao motor JSP. Existe 3 tipos de directivas:
page - processa informação para esta página. Existem 11 atributos opcionais. Sintaxe: <%@ page atributo=”valor” %>
Include – arquivos para serem incluidos. Sintaxe: <%@ include file=”pagina.jsp” %>
Taglib- Define uma biblioteca a ser usada. Precisa de um prefixo e de um url: Sintaxe: <%@ taglib prefix = "prefixo" uri = "taglib.tld" %>
4 - Scriptlet tag
Todo o código entre <% %> é chamado de scriptlet. Sintaxe: <% …código %>
5 - Action tag
Esta tag tem como principais funcionalidades:
* Acessar e alterar propriedades de JavaBeans (jsp:useBean, jsp:getProperty e jsp:setProperty);
* Redirecionar a requisição para outra página JSP (jsp:forward);
* Uma única tag para a inclusão de applets Java em páginas, independentemente do browser cliente (jsp:plugin e jsp:fallback).