Informações

Tipo: Tutorial
Data de Publicação: 01/01/2004
Revisado em: 01/01/2004

Vote!

  • Currently 4,8/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Tags Relacionadas

jsp

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:

  • Armazenar e Recuperar valores de atributos:
    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.
  • Recuperar parâmetros de solicitação e cabeçalho de HTTP:
    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.
  • Recuperar cabeçalhos de solicitação e cabeçalhos de HTTP:
    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.
  • Diversos métodos da interface que javax.servlet.hhtp.HttpServletRequest:
    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:

  • Especificar o tipo de conteúdo e codificação da resposta:
    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.
  • Definir cabeçalhos 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"
  • Definir códigos de resposta:
    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)
  • Reescrita da URL:
    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 comuns a esses 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:

  • Recuperar informações de versão do container servlet:
    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.
  • Interagir com arquivos e caminhos no servidor:
    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.
  • Suporte para log de mensagens:
    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.
  • Acessar parâmetros de inicialização:
    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:

  • Acessar outros objetos implícitos de JSP:
    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).
  • Envio de solicitações de uma página JSP para outra:
    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.
  • Acessar atributos através de múltiplos escopos:
    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
    Comente!

    Observações

    Os campos em negrito são obrigatórios.

    Para evitar problemas, este espaço é moderado. Após o envio do comentário será necessário aguardar pela sua aprovação.