Vous êtes sur la page 1sur 54

Java Server Pages

Sintaxe e Operao
Gleydson Lima
gleydson@farn.br
gleydson.lima@gmail.com


Introduo
Introduzida para substituir as Servlets

Tecnologia que introduziu o conceito de
Tag Libraries.

JSP so mais adequadas para
Separar HTML e cdigo
Utilizao em arquiteturas MVC



JSP
Gerao de Contedo


O Primeiro cdigo JSP
</body>
</html>
<% int i = 10;
out.println(i = + i); %>
<html>
<body>
<b>Codigo HTML...</b><br>


out.println("</body>");
out.println("</html>");
out.close();
}
}
int i = 10; out.println(i = + i);
public class servlet2 extends HttpServlet {
void service (HttpServletRequest request,
HttpServletResponse response) {
response.setContentType("text/html");
java.io.PrintWriter out =
response.getWriter();
out.println("<html>");
out.println("<body>");
out.println("<b>Codigo HTML...</b><br>);
O Primeiro Servlet-JSP


JSP vs Servlets
Todas as pginas JSP so
convertidas em Servlets?
Sim
Elas so semelhantes?
Sim

Resultados idnticos para o usurio
final

JSP um mdulo adicional do
Servlet Engine


Benefcios do JSP
JSP torna possvel:
Usar ferramentas de Autoria: HomeSite, FrontPage,
DreamWeaver, etc.

Equipes diferentes trabalhando em cdigos
diferentes.
Web Designer
Programador


JSP: Tecnologia Server Side
Questo comum.
No consigo fazer isso com HTML, poderei com JSP?
A pergunta no faz sentido...
JSP executa completamente no Servidor
No muda o que o browser pode/deve fazer
Questes similares:
Como por um Applet numa pgina JSP?
Use a tag <APPLET CODE=.... />
Como por uma Imagem numa pgina JSP?
Use a tag <IMG SRC=.... />
Como enviar documentos .doc, .ppt, .zip, etc
Usando HREF=....


Outras dvidas ...
O que acontece durante a traduo
A pgina JSP convertida num Servlet

O que acontece durante um pedido
de cliente
O cdigo do Servlet executado. No h
interpretao (de fonte) a cada pedido. A
pgina .jsp original ignorada durante esta
fase.



Outras dvidas ...
Quando ocorre a traduo.
Tipicamente, durante o primeiro acesso
pgina. Aps uma modificao (a depender
da configurao do servidor), uma nova
traduo pode ocorrer.
O fato ... traduo (em produo) um
caso raro.


Desenvolvendo em JSP
Cdigo a ser executado fica
dentro da prpria pgina JSP
Cdigo Java isolado em Beans, JSP
apenas os chama.
Uso de tags estilo JSP-XML
padronizadas para ativar Beans
(Modelo 1)
Desenvolvimento de Tags prprias
Uso de Servlets, JSP e Beans (MVC
ou Modelo2)
Uso de Frameworks MVC
Aplicaes
Simples
Aplicaes
Complexas


Expresses JSP
Expresses:



Semntica:
A expresso traduzida para um contexto onde esperada
Tipicamente resulta na traduo em algo como:
out.println(expr)

Exemplo (dentro de um arquivo .jsp):


<%= exprJava %>
<%= 2+3*4 %>
out.println(2+3*4);


Expresses - JSP/Servlet
Correspondentes
JSP Original



Possvel Servlet gerado
<H1>Um numero randomico</H1>
<%= Math.random() %>
public void _jspService(HttpServletRequest request,
HttpServletResponse response)
throws IOException, ServletException {
//..

out.write("<H1>Um numero randomico</H1>\r\n");
out.print( Math.random() );

//..
}


Uma pgina completa
<%@page contentType="text/html"%>
<HTML><BODY bgcolor="#BDBDBD">
<H2>Expressoes JSP</H2>
<UL>
<LI>Data Atual: <B><%= new java.util.Date() %></B>
<LI>Seu Hostname: <B><%= request.getRemoteHost() %></B>
<LI>ID da Sessao: <B><%= session.getId() %></B>
<LI>Parametro de Formulario:<B>
<%= request.getParameter("formPar") %></B>
</UL>
</BODY></HTML>


Variveis Predefinidas
request
Usada para ler atributos oriundos do Cliente
o primeiro parmetro do Servlet doGet(...)
response
Usada para enviar atributos ao Cliente
o segundo parmetro do Servlet doGet(...)
session
Usado para guardar variveis de sesso
O objeto HTTPSession associado com o cliente.
out
Obtido a partir de response para envio de dados
application
O contexto do Servlet. Permite troca de dados entre pginas
JSP


Scriptlets JSP
<% comandos %>
Comandos:



Semntica:
Os comandos so copiados para o mtodo service()

Exemplo (dentro de um arquivo .jsp):


<% Comandos %>
<% if (x>0) %>
positivo
<% else %>
negativo
if (x>0)
out.print (positivo);
else
out.print (negativo);


Scriplets - JSP/Servlet
Correspondentes
JSP Original




Possvel Servlet gerado
<%
String s = ame";
funcaoX();
%>
public void _jspService(HttpServletRequest request,
HttpServletResponse response)
throws IOException, ServletException {
//..
String s = ame";
funcaoX();
//..
}


Declaraes JSP
<% comandos %>
Comandos:



Semntica:
As declaraes so colocadas como variveis de instncia
do Servlet gerado
Muita ateno com o controle de concorrncia ...
Apenas um objeto criado a partir do Servlet da pgina,
mas cada request gera um novo thread.

Exemplo (dentro de um arquivo .jsp):

<%! Declaracoes %>
<%! private int TotalHits; %>


Declaraes - JSP/Servlet
Correspondentes
JSP Original
<%!
private String s = "abc";
private String cabecalho(String st){
return("<H1>"+st+"</H1>");
}
%>
<%= cabecalho("Pagina com Declaraes") %>


Declaraes - JSP/Servlet
Correspondentes
Possvel Servlet gerado
public class xxxxxxx implements HttpJspPage {

private String s = "abc";

private String cabecalho(String st){
return ("<H1>"+st+"</H1>");
}

public void _jspService(HttpServletRequest request,
HttpServletResponse response)
throws IOException, ServletException {
//..
out.println(cabecalho("Pagina com Daclaracoes"));
//..
}
}


+ Uma pgina completa
<HTML><HEAD><TITLE>Declaracoes JSP</TITLE></HEAD>
<BODY bgcolor="#2290B9">
<FONT color="#FFFFFF">
<H1>Declaracoes JSP</H1>
<%! private int accessCount = 0; %>
<H2>Numero de Acessos desde reboot do servidor:
<%= ++accessCount %>
</H2>
</FONT>
</BODY>
</HTML>
Depois de 46 visitas por
um nmero arbitrrio de
clientes


Comentrios
Comentrios HTML
Atravs de tags HTML <!-- e -->
Este comentrio ser enviado para o Browser

Comentrios JSP/Java
Atravs de tags JSP <%-- e --%>
O JSPEngine retirar este comentrio na Gerao do
Servlet.


<HTML><BODY>
Hello World
<%-- A ser convertido para Portugus --%>
</BODY></HTML>


A Diretiva Page
Um tag reservado na especificao JSP

Objetivos so controlar:
De que classe o JSP (Servlet Gerado) herda
Que classes so importadas para uso na classe
Que tipo de dados (MIME) gerado pela pgina
Como multithreading manipulado
Se o servlet vai usar o conceito de sesso
Qual o tamanho e o comportamento do buffer de sada
O mecanismo de sinalizao de erros


Sintaxe da Diretiva Page
<%@page [ language=java ]
[ extends=package.class ]
[ import=package.class ]
[ session=true | false ]
[ buffer=none|8kb|size kb ]
[ autoFlush=true | false ]
[ isThreadSafe=true|false ]
[ info=text ]
[ errorPage=relativeURL ]
[ contentType=mimeType ]
[ isErrorPage=true|false ]
%>


O atributo import
Objetivo:
Gerar comandos de import no incio do servlet gerado
Mltiplas importaes devem ser separadas por ,

Exemplo:



Classes devem ser alcanveis do CLASSPATH
Em geral, o diretrio WEB-INF/classes usado como
base de pacotes e/ou classes do usurio
<%@page import=java.util.Date,java.util.Vector %>
<%= new Date() %>


O atributo contentType
Objetivo:
Especificar com o browser deve interpretar o contedo
enviado pelo servidor
Dois parmetros so relevantes:
MIME-Type: Padres de encapsulamento de dados
charset: Conjunto de Fontes usado na pgina

MIME-Types padres (alguns):
text/html: Arquivo HTML normal
image/jpeg: Imagem JPEG
application/vnd.ms-excel Arquivo Excel

charset (alguns):
iso8859-1 Caracteres Ocidentais
US-ASCII ASCII de 7bits



Atributos
Content-type
Indica o tipo de contedo da pgina
session
Indica se Variveis de Sesso sero usadas nessa pgina
buffer
Especifica o tamanho do Buffer de Sada
Para pginas interativas (chats), buffer=none
autoFlush
Indica se o buffer deve ser esvaziado quando cheio
Em caso de false, uma exceo ocorrer quando o buffer estiver cheio.
Se buffer=none, autoFlush deve ser true
info
Uma informao genrica sobre a Pgina
Pode ser recuperada usando getServletInfo()


Tratamento de Erros
errorPage
Indica a pgina a ser chamada em caso de erro
isErrorPage
Se true, o objeto predefinido exception (da classe
ServletException) poder ser usado e conter um
valor vlido
<%@page isErrorPage=true %>
<%= exception.getMessage() %>
trataErro.jsp
<%@page errorPage=trataErro.jsp %>
<%= 30/0 %>
causaErro.jsp


Tratamento de Erros
Speed.jsp
<%@ page errorPage="PageError.jsp" %>
<HTML><HEAD><TITLE>Calcula Velocidade</TITLE></HEAD>
<BODY bgcolor="2290B9"><FONT COLOR="#FFFFFF">
<H1>Calcula Velocidade</TABLE>
<%!
private double toDouble(String value) {
return(Double.parseDouble(value));
} %>

<%
double d = toDouble(request.getParameter("distancia"));
double t = toDouble(request.getParameter("tempo"));
double v = d/t; %>

<UL><LI>Distancia: <%= d %> Km.
<LI>Tempo: <%= t %> h.
<LI>Velocidade: <%= v %> Km/h.
</UL>
</FONT></BODY></HTML>


Tratamento de Erros
PageError.jsp
<%@ page isErrorPage="true" %>
<HTML><HEAD><TITLE>Pagina de Erro</TITLE>
<BODY bgcolor="#FFF600">
<%
String msg = "";
if(exception instanceof java.lang.NumberFormatException){
msg = "Voce deve fornecer somente numeros!";
} else
if(exception instanceof java.lang.NullPointerException){
msg = "Voce deve fornecer os parametros necessarios!";
}
else
msg = exception.toString(); %>
<IMG src="erro.gif" width='100' height='100' align=left>
<H2>Erro Calculando a Velocidade</H2>
<H4>Ocorreu o seguinte erro em Speed.jsp:<br>
<B><I><%= msg %></I></B></H4>.
</BODY></HTML>


Tratamento de Erro
Com pgina de Erro
Interface amigvel
Identificao do Erro
Mapeamento para o
cliente
Sem Pgina de Erro
Interface no amigvel


Desenvolvendo em JSP
Cdigo a ser executado fica
dentro da prpria pgina JSP
Cdigo Java isolado em Beans,
JSP apenas os chama.
Uso de tags estilo JSP-XML
padronizadas para ativar Beans
(Modelo 1)
Desenvolvimento de Tags
prprias
Uso de Servlets, JSP e Beans
(MVC ou Modelo2)
Aplicaes
Simples
Aplicaes
Complexas


Interface JSP/Beans
JSP tm tags de suporte s seguintes
operaes com Beans:
Carga e instanciao:
Com tempo de vida varivel (Sesso/Aplic/...)
Leitura do contedo de Propriedades
Atualizao de Propriedades individuais
Vinculao de Propriedades (individuais) com campos de
formulrios HTML.
Vinculao mltipla de Propriedades com campos de
formulrios HTML

Todas as vinculaes confiam nas convenes
de nomes dos Beans
Lembre-se: getProperty/setProperty


Instanciao de Beans
Sintaxe:






Semntica:
Cria uma objeto da classe package.class
O nome da referncia ao objeto beanName
O tempo de vida do objeto ditado pelo parmetro scope

<jsp:useBean id=beanName
scope= page|request|
session|application
class=package.class />


O atributo Scope
page
Valor default. O objeto sobrevive apenas o tempo necessrio
para atender ao pedido corrente. Beans na mesma pgina
podem acess-lo.
request
Quase o mesmo que page, mas tambm pode ser acessado
por objetos nas pginas includas (com
<jsp:include>) pela corrente.
session
O objeto sobrevive toda uma sesso de converso com um
usurio particular. Cada usurio recebe uma instncia do
Bean.
application
Uma nica instncia criada para toda a aplicao. Todas as
pginas podem compartilh-lo.



O Processo de Criao
A criao de Beans condicional:
<jsp:useBean ...> resulta em um novo
Bean somente se um outro com mesmo escopo e
identificador j no foi criado.
Se um Bean com os mesmos atributos existe, ele
retornado pelo processo de criao.
Exemplo:

<jsp:useBean id=myDate
scope=page
class=java.util.Date()
/>
<%= myDate %>


O Processo de Criao
Definindo Comandos na Criao:
<jsp:useBean ...>comandos</jsp:useBean>
permite executar comandos quando um novo Bean for
criado.
Se um Bean com os mesmos atributos existe, comando
no executado.
Exemplo:
<HTML>
<BODY>
<jsp:useBean id="xxx" scope="session" class="XXX">
<H1>Criei um Bean</H1>
Valor Inicial de Prop1: <%= xxx.getProp1() %>
</jsp:useBean>
...


Leitura de Propriedades
Criado um Bean sempre possvel acess-lo
explicitamente atravs de seus mtodos sobre o
beanName, alternativamente:



Semntica:
Equivalente a: <%= beanName.getPropName() %>

Vantagem:
Ausncia de cdigo Java (explcito) dentro do JSP

<jsp:getProperty name=beanName
property=propName />


Atualizao de Propriedades
Criado um Bean sempre possvel atribuir
valores a propriedades explicitamente atravs de
seus mtodos sobre o beanName,
alternativamente:




Semntica (Equivalente a) :
<%= beanName.setPropName(valor) %>
Vantagem:
Ausncia de cdigo Java (explcito) dentro do JSP

<jsp:setProperty name=beanName
property=propName
value=valor/>


Propriedades vs Form Fields
Para associar um campo de formulrio
(nomef) a uma propriedade (nome) de
beanName poderemos:





Mais isso pouco, ainda teremos que:
Verificar se o parmetro est definido
Fazer converses de tipo necessrias entre o campo e a
Propriedade

<jsp:setProperty name=beanName
property=nome
value=<%= request.getParameter
(nomef) %>
/>


Propriedades vs Form Fields
Para evitar os dois problemas (converses e
definies de parmetros) poderemos utilizar a
Sintaxe alternativa de setProperty ...




Semntica:
Faz a atribuio valor de paramName propriedade
propName, fazendo a respectiva validao e converso
Se no existe o parmetro, nada atribudo.
<jsp:setProperty name=beanName
property=propName
param="paramName"/>


Propriedades vs Form Fields
A terceira forma de setProperty permite fazer
atribuies mltiplas a propriedades:




Semntica:
Para todos os campos do Formulrio que tm nomes iguais a
Propriedades do Bean, feita uma atribuio
Lembre-se, portanto, da importncia de ter nomes de
formulrios iguais a propriedades e estas respeitando as
convenes JavaBeans

<jsp:setProperty name=beanName
property=*/>


Exemplo Clssico - JavaBean
ClienteBean.java
Componente JavaBean
Propriedades: nome, endereco, fone, identidade
public class ClienteBean implements java.io.Serializable {

private String nome;
private String endereco;
private String fone;
private int identidade;

public ClienteBean() { }

public String getNome() {
return nome;
}
//... Implementa outros metodos getXX e setXX
//... Pode implementar quaisquer outros metodos
}


Exemplo Clssico - Formulrio
Cadastro.jsp (ou html)
Formulrio HTML
Nome dos campos tem que ser idntico ao nome das
propriedades equivalentes
<HTML>
<HEAD><TITLE>Cadastro de Cliente</TITLE></HEAD>
<BODY bgcolor="2290B9">
<FONT COLOR="#FFFFFF">
<H1>Cadastro de Cliente</H1>

<FORM ACTION="Cadastro2.jsp">
Identidade: <INPUT type="text" name="identidade"><BR>
Nome: <INPUT type="text" name="nome"><BR>
Endereo: <INPUT type="text" name="endereco"><BR>
Fone: <INPUT type="text" name="fone"><BR>
<INPUT type="submit" value="Submeter Cadastro">
</FORM>

</FONT></BODY></HTML>


Exemplo Clssico Manipulador
do Formulrio
Cadastro2.jsp
Manipula os dados do Formulrio
Utiliza as tags <jsp:useBean>, <jsp.setProperty> e
<js:getProperty>
<%@page contentType="text/html"%>
<jsp:useBean id="cliente" scope="session" class="ClienteBean" />
<jsp:setProperty name="cliente" property="identidade" />
<jsp:setProperty name="cliente" property="nome" />
<jsp:setProperty name="cliente" property="endereco" />
<jsp:setProperty name="cliente" property="fone" />

<HTML><HEAD><TITLE>Manipulando Cadastro</TITLE></HEAD>
<BODY bgcolor="2290B9"><FONT COLOR="#FFFFFF">
<H1>Dados para Aprovacao</H1>
Identidade: <jsp:getProperty name="cliente" property="identidade"/><BR>
Nome: <jsp:getProperty name="cliente" property="nome"/><BR>
Endereco: <jsp:getProperty name="cliente" property="endereco"/><BR>
Fone: <jsp:getProperty name="cliente" property="fone"/>
</FONT></BODY></HTML>


Exemplo Clssico Manipulador
do Formulrio
Cadastro2.jsp (outra forma)
Simplifica o cdigo utilizando apenas uma tag
<jsp.setProperty>
<%@page contentType="text/html"%>
<jsp:useBean id="cliente" scope="session" class="ClienteBean" />

<jsp:setProperty name="cliente" property="*" />

<HTML><HEAD><TITLE>Manipulando Cadastro</TITLE></HEAD>
<BODY bgcolor="2290B9"><FONT COLOR="#FFFFFF">
<H1>Dados para Aprovacao</H1>
Identidade: <jsp:getProperty name="cliente" property="identidade"/><BR>
Nome: <jsp:getProperty name="cliente" property="nome"/><BR>
Endereco: <jsp:getProperty name="cliente" property="endereco"/><BR>
Fone: <jsp:getProperty name="cliente" property="fone"/>
</FONT></BODY></HTML>


Exemplo Clssico Resultados
Como o scope do
Bean session, so
atualizados apenas
os dados passados
no formulrio


Diretiva <@include>
Sintaxe:



Semntica:
No momento da traduo o arquivo inserido na pgina.
Mudanas no arquivo includo no foram recompilao em
alguns servidores como o Tomcat
Exemplo:
<%@include file=nomearq.jsp %>
<%@include file=head.jsp %>
<%@include file=body.jsp %>
<%@include file=tail.jsp %>


Expression Language
Introduzida no JSP 2.0 (2003) para
facilitar a sintaxe de muita coisa
Exemplos:
${param.nome} => Gleydson
${param[nome"]} => Gleydson
\${param["foo"]} => ${param["foo"]}
${header["host"]} => localhost:8080
${header["accept"]} => */*
${header["user-agent"]} => Mozilla/5.0



Usando EL - Vetores
No Servlet:

String[] favoriteMusic = {Zero 7, Tahiti 80, BT}
request.setAttribute(musicList, favoriteMusic);


Usando EL - Listas
No Servlet:

ArrayList favoriteFood = new ArrayList();
favoriteFood.add(chai ice cream);
favoriteFood.add(fajitas);
favoriteFood.add(thai pizza);
request.setAttribute(favoriteFood, favoriteFood);


Usando EL - Mapas
No Servlet:

Map musicMap = new HashMap();
musicMap.put(Ambient, Zero 7);
musicMap.put(Surf, Tahiti 80);
request.setAttribute(musicMap, musicMap);


EL Alguns Objetos Implcitos


Exerccios
?

Vous aimerez peut-être aussi