Informações
| Tipo: | Tutorial |
|---|---|
| Data de Publicação: | 01/01/2004 |
| Revisado em: | 01/01/2004 |
Vote!
Tags Relacionadas
Comentários ( 2 )
Imprimir
Objetos Implícitos em JSP
por:
Ulisses Telemaco (ulisses@j2eebrasil.com.br)
Este tutorial trata do uso de objetos implícitos com JSP.
Introdução
Como já vimos anteriormente, podemos criar, dentro de scriptlets na página JSP, instâncias de uma classe Java e manipulá-las a fim de produzir conteúdo dinâmico. Por exemplo, podemos criar um objeto de uma classe que acessa uma base de dados e então usar métodos desse objeto para exibir na página uma consulta ou transação com a base de dados. Ou seja, através da manipulação desse objeto, quer seja acessando seus métodos e suas variáveis, podemos gerar conteúdo dinâmico para a página JSP.
Além de objetos como esses, que estão completamente sobre o controle do programador, o container JSP se encarrega de instanciar automaticamente, durante a execução de uma página JSP, alguns objetos. Tais objetos podem ser usados dentro da página JSP e são conhecidos como "Objetos Implícitos".
Assim como todo objeto em Java, cada objeto implícito é uma instância de uma classe ou interface e segue uma API correspondente. Abaixo segue um resumo dos objetos implícitos disponíveis em JSP, suas respectivas classes/interfaces e uma pequena descrição do objeto.
Objetos implícitos de JSP e suas APIS para aplicações de HTTP.
| Objeto | Classe ou Interface | Descrição |
| page | javax.servlet.jsp.HttpJspPage | Instância de servlet da página |
| config | javax.servlet.ServletConfig | Dados de configuração de servlet |
| request | javax.servlet.http.HttpServletRequest | Dados de solicitação, incluindo parâmetros |
| response | javax.servlet.http.HttpServletResponse | Dados de resposta |
| out | javax.servlet.jsp.JspWriter | Fluxo de saída para conteúdo da página |
| session | javax.servlet.http.HttpSession | Dados de sessão específicos de usuário |
| application | javax.servlet.ServletContext | Dados compartilhados por todas as páginas de aplicação |
| pageContext | javax.servlet.jsp.PageContext | Dados de contexto para execução da página |
| exception | javax.lang.Throwable | Erros não capturados ou exceção |
Os nove objetos implícitos fornecidos por JSP podem ser classificados da seguinte forma:
- Objetos relacionados ao servlet da página (page, config): Os dois objetos implícitos de JSP nesta categoria se baseiam na implementação da página JSP como um servlet.
- Objetos relacionados ao output e input da página (request, response, out): Os objetos classificados nessa categoria se concentram na entrada e saída (input/output) de uma página JSP.
- Objetos contextuais (application, session, request, pageContext): Os objetos implícitos dessa categoria fornece à página JSP acesso ao contexto dentro do qual ela está respondendo.
- objetos resultantes de erros (exception): Esta última categoria dos objetos implícitos fornece apenas um objeto que é usado no tratamento de erros dentro de uma página JSP.
Objetos Relacionados ao Servlet
Os objetos implícitos nesta categoria se baseiam na implementação da página JSP como um servlet. Os dois objetos classificados nessa categoria são:
- page
- config
Objeto page
O objeto page representa a própria página JSP ou, mais especificamente, uma instância da classe de servlet na qual a página foi traduzida. O objeto page implementa as interfaces javax.servlet.jsp.HttpJspPage e javax.servlet.jsp.JspPage. Abaixo estão os links para a API que define essas interfaces:
Exemplo utilizando o objeto implícito page:
<%@ page info="Página de Teste" %> ..... <%= ((javax.servlet.jsp.HttpJspPage)page).getServletInfo() %>
Objeto config
O objeto config armazena dados de configuração de servlet - na forma de parâmetros de inicialização - para o servlet na qual uma página JSP é compilada. Pelo fato das páginas JSP raramente serem escritas para interagir com parâmetros de inicialização, este objeto implícito raramente é usado na prática. O objeto config é uma intância da interface javax.servlet.ServletConfig. Os métodos fornecidos por esta interface para recuperar parâmetros de inicialização de servlet estão listados abaixo:
| Métodos | Descrição |
|---|---|
| Enumeration getInitParameterNames() | Recupera os nomes de todos os parâmetros de inicialização. |
| String getInitParameter(String name) | Recupera o valor do parâmetro de inicilização a partir de um nome. |
Abaixo estão os links para a API que define a interface javax.servlet.ServletConfig:
ServletConfig
Objetos Relacionados a OutPut/InPut da página
Os objetos classificados nessa categoria se concentram no input (entrada de dados) e output (saída de informação) de uma página JSP. Os três objetos classificados nessa categoria são:
- request
- response
- out
Objeto request
O objeto request representa a solicitação que requisitou a página. O objeto request implementa a interface javax.servlet.http.HttpServletRequest (subinterface de javax.servlet.ServletRequest). Esse objeto, que também é classificado como um objeto contextual (parte 3), é um dos mais complexos e mais utilizados na construção de páginas JSP. Podemos dividir os métodos desse objeto em quatro funcionalidades:
| Método | Descrição |
|---|---|
| void setAttribute(String key, Object value) | Associa um valor de atributo com um nome. |
| Enumeration getAttributeNames() | Recupera os nomes de todos os atributos associados com o objeto. |
| Object getAttribute(String key) | Recupera o valor de atributo associado com a chave. |
| void removeAttribute(String key) | Remove o valor de atributo associado com a chave. |
| Métodos | Descrição |
|---|---|
| Enumeration getParameterNames() | Retorna os nomes de todos os parâmetros de solicitação. |
| String getParameter(String name) | Retorna os primeiro valor (principal) de um único parâmetro de solicitação. |
| String[] getParameterValues(String name) | Recupera todos os valores para um único parâmetro de solictação. |
| Métodos | Descrição |
|---|---|
| Enumeration getHeaderNames() | Recupera os nomes de todos os cabeçalhos associados com a solicitação. |
| String getHeader(String name) | Retorna o valor de um único cabeçalho de solicitação, como uma cadeia. |
| Enumeration getHeaders(String name) | Retorna todos os valores para um único cabeçalho de solicitação. |
| int getIntHeader(String name) | Retorna o valor de um único cabeçalho de solicitação, com um número inteiro. |
| long getDateHeader(String name) | Retorna o valor de um único cabeçalho de solicitação, como uma data. |
| Cookies[] getCookies() | Recupera todos os cookies associados com a solicitação. |
| Métodos | Descrição |
|---|---|
| String getMethod() | Retorna o método de HTTP (e.g, POST, GET, etc) para a solicitação. |
| String getRequestURI() | Retorna o URL de solicitação (não inclui a cadeia de consulta). |
| String getQueryString() | Retorna a cadeia de consulta que segue o URL de solicitação, se houver algum. |
| HttpSession getSession() | Recupera os dados da sessão para a solicitação (i.e, o objeto implícito session). |
| HttpSession getSession(boolean flag) | Recupera os dados da sessão para a solicitação (i.e, o objeto implícito session), opcionalmente criando-o se ele ainda não existir. |
| RequestDispatcher getRequestDispatcher(String path) | Cria um dispatcher de solicitação para o URL local indicado. |
| String getRemoteHost() | Retorna o nome totalmente qualificado do host que enviu a solicitação. |
| String getRemoteAddr() | Retorna o endereço de rede (IP) do host que enviou a solicitação. |
| String getRemoteUser() | Retorna o nome do usuário que enviou a solicitação, se conhecido. |
Abaixo estão os links para a API que define essas interfaces:
ServletRequest
HttpServletRequest
O exemplo a seguir ilustra a utilização do objeto implícito request:
..... Seu IP é :<%= request.getRemoteAddr() %><br> Seu Host é :<%= request.getRemoteHost() %><br> .....
Objeto response
O objeto response representa a resposta que será enviada de volta para o usuário como resultado do processamento da página JSP. Este objeto implementa a interface javax.servlet.http.HttpServletResponse que é uma subinterface de javax.servlet.ServletResponse.
Podemos dividir os métodos desse objeto em quatro funcionalidades:
| Métodos | Descrição |
|---|---|
| void setContentType(String type) | Define o tipo MIME e, opcionalmente, a codificação de caracteres do conteúdo da resposta. |
| String getCharacterEncoding() | Retorna o conjunto de estilos de codificação de caracteres para o conteúdo da resposta. |
| Métodos | Descrição |
|---|---|
| void addCookies(Cookie cookie) | Adiciona o cookie especificado. |
| boolean containsHeader(String name) | Verifica se a resposta inclui o cabeçalho. |
| void setHeader(String name, String value) | Atribui o valor definido pela variável "value" ao cabeçalho especificado por "name" |
| void setIntHeader(String name, int value) | Atribui o valor de número inteiro especificado por "value" ao cabeçalho especificado por "name" |
| void setDateHeader(String name, long date) | Atribui o valor de data especificado por "value" ao cabeçalho especificado por "name" |
| void addHeader(String name, String value) | Adiciona o valor definido por "value" ao cabeçalho especificado por "name" |
| void addIntHeader(String name, int value) | Adiociona o valor de número inteiro especificado por "value" ao cabeçalho especificado por "name" |
| void addDateHeader(String name, long date) | Adiciona o valor de data especificado por "value" ao cabeçalho especificado por "name" |
| Métodos | Descrição |
|---|---|
| void setStatus(int code) | Define o código de status para a resposta (para cisrcuntâncias sem erro) |
| void sendError(int status, String msg) | Define o código de status e mensagem de erro para a resposta. |
| void sendRedirect(String url) | Envia uma resposta para o navegador indicando que ele deveria solicitar um URL alternativo (absoluto) |
| Métodos | Descrição |
|---|---|
| String encodeRedirectURL(String url) | Codifica um URL para uso com o método sendRedirect() para incluir informações de sessão. |
| String encodeURL(String url) | Codifica um URL usado em um link para incluir informações de sessão. |
Abaixo estão os links para a API que define essas interfaces:
ServletResponse
HttpServletResponse
O exemplo abaixo ilustra uma das utilidades desse objeto. Vários cabeçalhos são definidos para evitar que a página seja armazenada em cache por um navegador.
<%
response.setHeader("Expires", 0);
response.setHeader("Pragme, "no-cache");
if(request.getProtocol().equals("HTTP/1.1")){
response.setHeader("Cache-Control", "no-cache");
}
%>
Este script primeiro define o cabeçalho Expires para uma data no passado. Isto significa que o conteúdo da página já expirou, como uma dica que seu conteúdo não deve ser armazenado em cache.
Objeto out
Este objeto implícito representa o fluxo de saída para a página, cujo conteúdo será enviado para o navegador com o corpo de sua resposta. O objeto out é uma intância da classe javax.servlet.jsp.JspWriter.
Esse objeto implementa todos os métodos print() e println() definidos por java.io.Writer.
Por exemplo, o objeto out pode ser usado dentro de um script para adicionar conteúdo à página gerada. Veja o exemplo abaixo:
<%
int i = (int)(Math.random()*10);
if(i%2==0){
out.print("O Número escolhido "+ i +" é par!");
}
else {
out.print("O Número escolhido "+ i +" é impar!");
}
%>
Esse objeto é muito utilizado para para gerar conteúdo dentro do corpo de um script, sem ter que fechá-lo temporariamente para inserir conteúdo de página estático. Contudo, deve-se evitar usar os métodos print() ou println() para inserir cadeias de caracteres muito grandes. No próximo caso, é mais aconselhável fechar o script e inserir o conteúdo estático. Veja o exemplo abaixo:
Não Aconselhável:
<%
if(i == 1){
out.print("<h6>"+
"<font face='verdana'>"+
"Guga viaja nesta sexta"+
"para a Suíça para"+
"jogar"+
"</font>"+
"</h6>");
}
%>
Aconselhável:
<% if(i == 1) {%>
<h6>
<font face='verdana'>
Guga viaja nesta sexta
para a Suíça para
jogar
</font>
</h6>
<% } %>
O links abaixo refere-se a API que define a interfaces que o objeto out implementa:
JspWriter
Objetos Contextuais
Os objetos implícitos dessa categoria fornece à página JSP acesso ao contexto dentro do qual ela está respondendo. Os quatro objetos implícitos contextuais são:
- request;
- session;
- application;
- pageContext.
Todos eles têm a capacidade de armazenar e recuperar valores de atributos arbitrários. Os atributos de página, armazenados no objeto pageContext, duram apenas enquanto o processamento de uma única página ocorre. Os atributos de solicitação, armazenados no objeto request, também tem pouca duração, mas podem ser transferidos entre páginas quando for transferido o controle. Os atributos de sessão, armazenados no objeto session, duram enquanto o usuário continuar a interagir com o servidor da web. Os atributos de aplicação, armazenados no objeto application, são mantidos enquanto o container JSP mantiver uma ou mais páginas de uma aplicação carregada na memória - enquanto o container JSP estiver rodando. A tabela a seguir traz os métodos comuns aos quatro objetos e que são usados para armazenar e recuperar valores de atributos:
| Métodos | Descrição |
|---|---|
| void setAttribute(String key, Object value) | Associa um valor de atributo com um nome. |
| Enumeration getAttributeNames() | Recupera os nomes de todos os atributos associados com o objeto. |
| Object getAttribute(String key) | Recupera o valor de atributo associado com a chave. |
| void removeAttribute(String key) | Remove o valor de atributo associado com a chave. |
Objeto session
Este objeto representa a sessão atual de um usuário individual. Todas as solicitações feitas por um usuário são consideradas parte de uma sessão. Desde que novas solicitações por aqueles usuários continuem a ser recebidas pelo servidor, a sessão persiste. Se, no entanto, um certo período de tempo passar sem que qualquer nova solicitação do usuário seja recebida, a sessão expira.
O objeto session armazena informações a respeito da sessão. Um dos principais usos para o objeto session é armazenar e recuperar valores de atributos, a fim de transmitir as informações específicas de usuários entre as páginas. Abaixo segue um exemplo que armazena dados na sessão, na forma de um objeto que é instância de uma classe hipotética "Usuario":
<%
Usuario u = new Usuario(nome, senha);
session.setAttribute("usuario", u);
%>
Uma vez que um objeto tenha sido armazenado através do método setAttibute(), ele pode ser recuperado - na mesma página ou em outra acessada pelo usuário. O código abaixo ilustra a recuperação do objeto armazenado no código anterior:
<%
Usuario u = (Usuario)session.getAttribute("usuario");
.....
%>
Perceba que o método getAttribute() retorna um objeto da classe Object, portanto, é necessário fazermos um cast para converter o objeto retornado em uma instância da classe desejada.
O objeto session implementa a interface javax.servlet.http.HttpSession. A tabela abaixo traz os principais métodos utilizados por esse objeto, além daqueles descritos anteriormente na tabela 1:
| Métodos | Descrição |
|---|---|
| Object getAttibute(String nome) | Recupera o objeto identificado por "nome". |
| String getId() | Retorna o Id da sessão. |
| long getCreationTime() | Retorna a hora na qual a sessão foi criada. |
| long getLastAccessedTime() | Retorna a última vez que uma solicitação associada com a sessão foi recebida. |
| int getMaxInactiveInterval() | Retorna o tempo máximo (em segundos) entre solicitações pelo qual a sessão será mantida. |
| void setMaxInactiveInterval(int time) | Define o tempo máximo (em segundos) entre solicitações pelo qual a sessão será mantida. |
| boolean isNew() | Retorna se o navegador do usuário ainda não tiver confirmado o ID de sessão. |
| boolean invalidate() | Descarta a sessão, liberando quaisquer objetos armazenados como atributos. |
O link abaixo exibe a API completa da interface que implementa o objeto session:
HttpSession
Objeto application
Este objeto representa a aplicação à qual a página JSP pertence. Ele é uma instância da interface javax.servlet.ServletContext. Os containers JSP tipicamente tratam do primeiro nome de diretório em um URL como uma aplicação. Exemplo:
- http://server/jspbrasil/index.jsp
- http://server/jspbrasil/principal.jsp
- http://server/jspbrasil/forum/forum.jsp
- http://server/jspbrasil/tutorial/tutorial.jsp
São todos considerados parte da mesma aplicação jspbrasil.
Além dos métodos descritos na tabela 1, os métodos do objeto application podem ser divididos em quatro funcionalidades:
| Métodos | Descrição |
|---|---|
| String getServerInfo() | Retorna o nome e versão do container servlet. |
| int getMajorVersion() | Retorna a versão principal da API do servlet para o container servlet. |
| int getMinorVersion() | Retorna a versão secundária da API do servlet para o container servlet. |
| Métodos | Descrição |
|---|---|
| String getMimeType(String filename) | Retorna o tipo MIME para o arquivo indicado, se conhecido pelo servidor. |
| URL getResource(String path) | Traduz uma cadeia especificando um URL em um objeto que acessa os conteúdos dos URLs, localmente ou na rede. |
| InputStream getResourceAsStream(String path) | Traduz uma cadeia especificando um URL em um fluxo de entrada para ler seu conteúdo. |
| String getRealPath(String path) | Traduz um URL local em um nome de caminho no sistema de arquivo local. |
| ServletContext getContext(String path) | Retorna o contexto de aplicação para o URL local especificado. |
| RequestDispatcher getRequestDispatcher(String path) | Cria um dispacher de solicitação para o URL local indicado. |
| Métodos | Descrição |
|---|---|
| void log(String message) | Grava a mensagem o arquivo de log. |
| void log(String message, Exception e) | Grava a mensagem no aqrquivo de log, junto com a trilha de pilha para a exceção especificada. |
| Métodos | Descrição |
|---|---|
| Enumerations getInitParameterNames() | Recupera os nomes de todos os parâmetros de inicialização. |
| String getInitParameter(String name) | Recupera o valor do parâmetro de inicilização como o nome dado. |
O link abaixo exibe a API completa da interface que implementa o objeto application:
ServletContext
Objeto pageContext
O objeto pageContext fornece várias facilidades como gerenciamento de sessões, atributos, páginas de erro, inclusões e encaminhamento de requisições de fluxo de resposta.
O objeto pageContext é uma instância da classe javax.servlet.jsp.PageContext. Além dos métodos descritos na tabela 1, os principais métodos desse objeto podem ser divididos em três categorias:
| Métodos | Descrição |
|---|---|
| Object getPage() | Retorna a instância de servlet para a página atual (objeto implícito page). |
| ServletRequest getRequest() | Retorna a solicitação que iniciou o processamento da página (objeto implícito request). |
| ServletResponse | Retorna a respota para a página (objeto implícito response). |
| JspWriter getOut | Retorna o fluxo de saída atual para a página (objeto implícito out). |
| HttpSession getSession() | Retorna a sessão associada com a solicitação da página atual, se houver alguma (objeto implícito session). |
| ServletConfig getServletConfig() | Retorna o objeto de configuração de servlet (objeto implícito config). |
| ServletContext getServletContext() | Retorna o contexto no qual o servlet da página roda (objeto implícito application). |
| Exception getException() | Para páginas de erro, retorna a exceção passada para a página (objeto implícito exception). |
| Métodos | Descrição |
|---|---|
| void forward(String path) | Encaminha o processamento para um outro URL local dado pela String path. |
| void include(String path) | Inclui o output do processamento de um outro URL local. |
| Métodos | Descrição |
|---|---|
| void setAttribute(String key, Object obj, int scope) | Associa o valor do atributo "obj" com a chave "key" no escopo "scope". |
| Enumeration getAttributeNamesInScope(int scope) | Recupera os nomes de todos os atributos associado com "key" no escopo "scope". |
| Object getAttribute(String name, int scope) | Recupera o valor de tributo associado com "name" no escopo "scope" |
| removeAttribute(String name, int scope) | Remove o valor de atributo associado com "name" no escope "scope" |
| Object findAttribute(String name) | Procura em todos os escopos pelo atributo associado com "name". |
| int getAttributesScope(String name) | Retorna o escopo no qual o atributo associado com "name" está armazenado. |
Os últimos dois métodos listados na tabela anterior permitem a procura, através de todos os escopos definidos, por um atributo associado com uma String passada como parâmetro. Nos dois casos, o objeto pageContext irá realizar uma busca através dos escopos na seguinte ordem: pageContext, request, session e application.
A tabela anterior traz métodos que recebe parâmetros para especificar o escopo. A classe javax.servlet.jsp.PageContext fornece variáveis estáticas para representar estes quatro escopos diferentes. A tabela a seguir resume estas variáveis:
| Variável | Descrição |
|---|---|
| PAGE_SCOPE | Escopo para atributos armazenados no objeto pageContext. |
| REQUEST_SCOPE | Escopo para atributos armazenados no objeto request. |
| SESSION_SCOPE | Escopo para atributos armazenados no objeto session. |
| APPLICATION_SCOPE | Escopo para atributos armazenados no objeto application. |
O exemplo abaixo ilustra o uso do método "getAttribute" e das variáveis estáticas descritas na tabela anterior:
<%
User uPag=(User)pageContext.getAttibute("user",pageContext.PAGE_SCOPE)
//Recupera o object "usuario" do escopo pageContext
User uReq=(User)pageContext.getAttibute("user",pageContext.REQUEST_SCOPE)
//Recupera o object "usuario" do escopo request
User uSes=(User)pageContext.getAttibute("user",pageContext.SESSION_SCOPE)
//Recupera o object "usuario" do escopo session
User uApp=(User)pageContext.getAttibute("user",pageContext.APPLICATION_SCOPE)
//Recupera o object "usuario" do escopo application
%>
O link abaixo exibe a API completa da interface que implementa o objeto pageContext:
PageContext
Tratamento de Erros
Esta última categoria dos objetos implícitos tem apenas um membro, o objeto exception. Este objeto implícito é fornecido com o propósito de tratamento de erros dentro de uma página JSP.
Objeto Exception
O objeto exception não está automaticamente disponível em todas as páginas JSP.
Este objeto está disponível apenas nas páginas que tenham sido designadas como páginas
de erro, usando o atributo isErrorPage configurado com true na diretiva
page. O objeto exception é uma instância da classe java.lang.Throwable
correspondente ao erro não capturado que fez com que o controle fosse transferido para
a página de erro. Os principais métodos da classe java.lang.Throwable que
são utilizados dentro das páginas JSP são listados na tabela abaixo:
| Método | Descrição |
|---|---|
| String getMessage() | Retorna a mensagem de erro descritiva associada com a exceção quando ela foi lançada. |
| void printStackTrace(PrintWriter out) | Imprime a pilha de execução em funcionamento quando a exceção foi lançada para o fluxo de saída especificado pelo parâmetro out. |
| String toString() | Retorna uma cadeia combinando o nome da classe da exceção com sua mensagem de erro, se houver alguma. |
O trecho abaixo ilustra o uso do objeto exception em uma página de erro JSP:
<@ page isErrorPage=true %> <h1>Erro Encontrado</h1> O seguinte erro foi eoncontrado:<br> <b><%= exception %></b><br> <% exception.printStackTrace(out); %>
Criando funções que manipulam Objetos Implícitos
Como foi visto em módulos anteriores, é possível definir funções na própria página JSP através das tags <%! e %>. Veja o exemplo abaixo:
<%!
String jogueMoeda(){
String retorno = "";
int i = (int)(Math.random()*10); //um número entre 0 e 10
i = i%2; //resto da divisao de i por 2
if(i==0){
retorno = "cara";
} else {
retorno = "coroa";
}
return retorno;
}
%>
<html>
<body>
<h1>O resultado foi <%= jogueMoeda() %>!</h1>
</body>
</html>
Nesse trecho de código, uma função é definida dentro de uma página JSP. Essa função é bastante simples: simula o lançamento de uma moeda para cima e escolhe, aleatoriamente, entre cara ou coroa.
Imagine agora que queremos que a função simule o lançamento da moeda várias vezes seguidas. Podemos alterar o código anterior e chamarmos a função várias vezes:
.... <html> <body> <h1>O(s) resultado(s) foi(ram) <%= jogueMoeda() %>, <%= jogueMoeda() %> ... <%= jogueMoeda() %>!</h1> </body> </html>
Essa, solução, apesar de funcionar, não é a mais adequada. Podemos reescrever a função para receber como parâmetros a quantidades de jogadas que deverão ser efetuadas e fornecer um meio para que a função possa escrever o conteúdo na página JSP:
<%!
void jogueMoeda(int numeroJogadas, javax.servlet.jsp.JspWriter o){
try{
for(int k=1; k <= numeroJogadas; k++){
int i = (int)(Math.random()*10); //número entre 0 e 10
i = i%2;
if(i==0){
o.print("cara");
} else {
o.print("coroa");
}
if(k==numeroJogadas){
o.print("!");
} else {
o.print(", ");
}
}
} catch(Exception e){}
}
%>
<html>
<body>
<h1>Deu <% jogueMoeda(10,out); %></h1>
</body>
</html>
Essa segunda versão, apesar de ter uma funcionalidade bem parecida com a anterior traz algumas novidades:
- Passamos como parâmetro um objeto da interface javax.servlet.jsp.JspWriter. É através desse objeto que iremos enviar para a página JSP o resultado da "jogada".
- Na chamada da função passamos, além do número de jogadas desejadas, uma referência ao objeto implícito out. É através dessa referência que a função irá imprimir na saída da página JSP o resultado de sua jogada.
É importante aprender que não podemos chamar o objeto out (ou qualquer outro objeto implícito) diretamente em uma função declarada dentro de uma página JSP. Portanto, o seguinte código está errado e apresentará um erro em tempo de compilação:
<%!
void jogueMoeda(int numeroJogadas){
for(int k=1; k <= numerovezes; k++){
int i = Math.random();
i = i*10;
i = i%2;
if(i==0){
out.print("cara");
} else {
out.print("coroa");
}
if(k==numeroJogadas){
out.print("!");
} else {
out.print(", ");
}
}
}
%>
<html>
<body>
<h1>Deu <% jogueMoeda(50) %></h1>
</body>
</html>
A tabela a seguir exibe como criar e chamar funções que usam os nove objetos implícitos:
| Objeto | Assinatura da Função: | Chamada da Função na página JSP: |
|---|---|---|
| page |
void f(javax.servlet.jsp.HttpJspPage p){
...
p.algumaFuncaoDoObjetoPage();
...
} |
<% f(page); %> |
| config |
void f(javax.servlet.Config c){
...
c.algumaFuncaoDoObjetoConfig();
...
} |
<% f(config); %> |
| request |
void f(javax.servet.http.HttpServletRequest rq){
...
rq.algumaFuncaoDoObjetoRequest();
...
} |
<% f(request); %> |
| response |
void f(javax.servet.http.HttpServletResponse rp){
...
rp.algumaFuncaoDoObjetoResponse();
...
} |
<% f(response); %> |
| out |
void f(javax.servet.jsp.JspWriter o){
...
o.algumaFuncaoDoObjetoOut();
...
} |
<% f(out); %> |
| session |
void f(javax.servet.http.HttpSesseion s){
...
s.algumaFuncaoDoObjetoSession();
...
} |
<% f(session); %> |
| application |
void f(javax.servet.ServletContext a){
...
a.algumaFuncaoDoObjetoApplication();
...
} |
<% f(application); %> |
| pageContext |
void f(javax.servet.jsp.PageContext pc){
...
pc.algumaFuncaoDoObjetoPageContext();
...
} |
<% f(pageContext); %> |
| exception |
void f(java.lang.Throwable e){
...
e.algumaFuncaoDoObjetoException();
...
} |
<% f(exception); %> |
| Obs.: As funções acima exemplificadas recebem apenas um parâmetro e não têm valor de retorno. Contudo, podemos criar funções que recebem vários parâmetros e tenham algum tipo de retorno. | ||
Conclusão
Sem dúvida esse foi um dos maiores módulos do tutorial de JSP. O tema mereceu (e merece) atenção para aqueles que estão estudando JSP. As vantagens desses objetos são mais perceptíveis para aqueles que já programam com Servlet (onde todos os objetos devem ser declarados explicitamente). No momento em que o JSP é traduzido para Servlet (tipicamente durante o primeiro acesso ao JSP), algumas variáveis - os objetos implícitos - são criados pelo tradutor. O Servlet gerado automaticamente contém todas as variáveis implícitas dentro do JSP.
É aconselhável para aqueles que pretendem trabalhar com JSP conhecer um pouco da API dos objetos implícitos (os links estão distribuídos pelo texto). Esse módulo não tratou com exautão todos os métodos disponíveis nas classes que regem esses objetos.
Comentários (2)
- Gostei muito! Tirando alguns errinhos de português, achei o documento muito bom. Eu que sabia superficialmente sobre JSP, consegui compreender bem o que são os objetos implícitos.
- postado por Daniel Machado de Faria em 11/06/2007 às 23:21
- Perfeito a explicação. Parabéns.
- postado por alexandre piazza de oliveira em 29/02/2008 às 23:21
