JSP JSTL
JSP Standard Tag Library (JSTL) Esforço de padronização do JCP: JSR-152 Baseado no Jakarta Taglibs (porém bem menor) Oferece dois recursos Conjunto padrão de tags básicos (Core, XML, banco de dados e internacionalização) Linguagem de expressões do JSP 1.3 Oferece mais controle ao autor de páginas sem necessariamente aumentar a complexidade Controle sobre dados sem precisar escrever scripts Estimula a separação da apresentação e lógica Estimula o investimento em soluções MVC
Como usar JSTL Incluir em cada página que usa os tags: <%@ taglib uri="uri_da_taglib" prefix="prefixo" %> Usar os tags da biblioteca com o prefixo definido no passo anterior <prefixo:nometag atributo="...">... </prefixo:nometag>
Cinco bibliotecas de tags Core library: tags para condicionais, iterações, urls,... <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> Exemplo: <c:if test="..."... >...</c:if> XML library: tags para processamento XML <%@ taglib prefix="x" uri="http://java.sun.com/jsp/jstl/xml" %> Exemplo: <x:parse>...</x:parse> Internationalization library <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> Exemplo: <fmt:message key="..." /> SQL library <%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %> Exemplo: <sql:update>...</sql:update> Function library <%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> Exemplo: ${fn:length(...)}
Linguagem de expressões (EL) Permite embutir em atributos expressões dentro de delimitadores ${...} Em vez de request.getattribute("nome") ${nome} Em vez de bean.getpessoa().getnome() ${bean.pessoa.nome} Suporta operadores aritméticos, relacionais e binários Converte tipos automaticamente <tag item="${request.valornumerico}" /> Valores default <tag value="${abc.def}" default="todos" />
Linguagem de expressões (EL) A primeira variável na expressão é um OBJETO IMPLÍCITO ou um ATRIBUTO $ { primeiro.segundo) Objetos: pagescope, requestscope, sessioscope,applicationscope param, paramvalues header, headervalues cookie initparam pageconext Atributo: Único que não é mapeamento (Map); é um bean Em qualquer um dos escopos: page, request, session, application
Linguagem de expressões (EL) Se a expressão possuir um avariável seguida por um ponto, a variável a esquerda TEM QUE ser um MAP ou um BEAN O que estiver do lado direito do ponto TEM QUE ser uma chave de MAP ou uma propriedade do BEAN Deve seguir regras normais do Java para nomenclatura dos identificadores Operador [] é similar ao ponto, mas melhor ${pessoa[ nome ]} idem a ${pessoa.nome} Se pessoa for List ou Array? Só funciona com [] : ${listmusic[ Take ] } ou ${listmusic[0]} O que vem dentro dos colchetes é uma String: Chave Map Propriedade Bean Índice de um List ou Array
Principais ações Suporte à impressão da linguagem expressões <c:out value="${pessoa.nome}" /> Expressões condicionais <c:if test="${pessoa.idade >= 18}"> <a href="adultos.html">entrar</a> </c:if> <c:choose> <c:when test="${dia.hora == 13}"> <c:out value="${mensagemespecial}" /> </c:when> <c:otherwise> <c:out value="${mensagempadrao}" /> </c:otherwise> </c:choose> Iteração <c:foreach items="${pessoas}" var="p" varstatus="s"> <c:out value="${s.count}"/>. <c:out value="${p}"/> </c:foreach>
PageContext Objeto que permite a tag acessar informações sobre o contexto da aplicação para leitura de valores de formularios (request), variaveis de sessao e gerar conteudo de saida (response)
PageContext Acesso facil a parametros de entrada vindos de get/post, variaveis de sessoes e cookies $session:minhavariaveldesessao $cookie:meucookie $param:email $param:nome Dados vindos de forms
set Atribui valor a uma variável Sintaxe 1 <c:set value="valor" var= nomevariavel [scope= {page request session application} ] /> Sintaxe 2 <c:set var= nomevariavel [scope= {page request session application} ]> Corpo do Conteúdo </c:set>
Exemplo <c:set var="nome" value="${param.nome}" /> Olá ${nome} <c:set var="nome"> ${param.nome} </c:set> Olá ${nome}
remove Remove uma variável <c:remove var="nomevar" [scope="{page...}"]/> Se o escopo for omitido a variável é removida do escopo mais interno Exemplo <c:remove var="nome" scope="page" />
out Avalia e exibe uma expressão Sintaxe <c:out value="valor [escapexml="{true false}"] [default="valordefault"] /> Exemplo Olá <c:out value="${nome}" />
if Avalia o conteúdo se a condição for verdadeira <c:if test="condição"> Conteúdo </c:if> Exemplo <c:if test="${usuario.visitas eq 1}"> Esta é a sua Primeira Visita. </c:if>
choose... when... otherwise Avalia várias condições semelhante a um if aninhado de Java <c:choose> <c:when test="condição"> </c:when>... <c:otherwise> </c:otherwise> </c:choose>
Exemplo Situação Parcial: <c:choose> <c:when test="${nota lt 30}"> Reprovado </c:when> <c:when test="${nota lt 70}"> Recuperação </c:when> <c:otherwise> Aprovado </c:othewise> </c:choose>
Exemplo : choose = if... else Situação Final: <c:choose> <c:when test="${nota lt 70}"> Reprovado </c:when> <c:otherwise> Aprovado </c:otherwise> </c:choose>
foreach (1/2) Percorre uma coleção (lista, array ou mapeamento) de objetos <c:foreach var= variavel itens= colecao varstatus= variavelstatus /> conteúdo </c:foreach>
Exemplo foreach Exemplo: <c:foreach var= livro itens= ${livros} varstatus= status /> ${status.count} ${livro.titulo} </c:foreach> 1 - Java Como Programar 2 - Java Servlets 3 - HTML & XHTML
foreach (2/2) Laço com início e fim <c:foreach var= variavel begin= inicio end= fim step= passo varstatus= variavelstatus /> conteúdo </c:foreach>
Construindo uma Tabela <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <html> <head><title>função Quadrado</title></head> <body> <table border="1"> <tr><th>x</th><th>x^2</th></tr> <c:foreach var="counter" begin="1" end="10"> <tr> <td>${counter}</td> <td>${counter*counter}</td> </tr> </c:foreach> </table> </body> </html>
fortokens Semelhante ao foreach mas os elementos estão em um único String. <c:fortokens items="stringoftokens" delims="delimitadores" [var= nomevar"] [varstatus= nomevarstatus"] [begin= inicio"] [end= fim"] [step= passo"]> Conteúdo </c:fortokens>
Exemplo Imprimir as letras do string "a,b/c,d/e,f" onde, e / são delimitadores <c:fortokens items="a,b/c,d/e,f" delims=",/" var= letra"> <p>${letra}</p> </c:fortokens>
Arquitetura de Sistemas Web
Modelo 2 Camadas Camada de Apresentação com Regras de Negócio Juntas. Camada de Persistência. Problemas para o usuário, que não tem os programas funcionando como deveriam; Problemas para a equipe de desenvolvimento que não tem o seu trabalho reconhecido e, normalmente, tem que trabalhar apenas "apagando incêndios"; e Problemas para a Administração/Gerência da rede que não consegue gerar os resultados esperados pela Administração da empresa, apesar dos elevados valores já investidos. Maior TCO Custo Total de Propriedade
Modelo 2 Camadas
Modelo 3 Camadas Modelo e códigos construídos para representar as camadas. Os servidores não precisam estar necessariamente em máquinas diferentes, podem estar na mesma máquina. Porem questões de performance são relevantes. Camada de Apresentação Camada de Negócios Camada de Persistência
Modelo 3 Camadas
Modelo 3 Camadas c/ MVC APRESENTAÇÃO NEGÓCIO OU LÓGICA PERSISTÊNCIA (INTEGRAÇÃO) Helper classes C NAVEGADOR WEB V M SGDB CLIENTE CLIENTE - SERVIDOR SERVIDOR SERVIDOR WEB
MVC - FLUXOS
MVC
Modelo 4 Camadas
Modelo 4 Camadas CLIENTE (APRESENTAÇÃO) GERENCIA DE APRESENTAÇÃO NEGÓCIO PERSISTÊNCIA NAVEGADOR WEB SERVIDOR WEB SERVIDOR APLICAÇÃO EJB in MVC SGDB V C M CLIENTE CLIENTE - SERVIDOR CLIENTE - SERVIDOR SERVIDOR
J2EE - 4 TIER