Entendendo os Escopos dos Objetos – Parte 01

dezembro 9, 2008 by admin
Filed under: Java, Programação 

A linguagem Java usa fortemente o conceito de orientação a objetos. Com ela, é possível implementar softwares em diversas áreas, desde controlar aparelhos de microondas, sistemas WEB, até aplicações para celulares.

No desenvolvimento dos sistemas web, você pode criar aplicações dinâmicas e inteligentes, utilizando o máximo das vantagens que a linguagem tem a oferecer. Exemplos como exibir o resultado de uma consulta sobre um certo cliente, receber dados de um formulário, armazenar um carrinho de compras do usuário… Ou seja, existem milhares de situações que podem ser implementadas.

Neste artigo comentarei sobre alguns objetos implícitos nas páginas jsp e descrever em quais escopos os objetos podem estar durante o processamento da página. Este é meu primeiro artigo aqui no iMasters, e espero que gostem e que as informações passadas sejam úteis.

Estes são alguns dos objetos implícitos que você usará com mais freqüência.

  • request
  • pageContext
  • session
  • context
  • out
  • response

A partir de agora, vou descrever cada objeto e criar uma situação de utilização.

Antes de iniciar, vou comentar sobre scriptlets, pois vou utilizá-los na implementação dos exemplos.

<% %> – acessar algum escopo.

<%= %> – escreve algum conteúdo na resposta.

Obs: utilizar scriptlets nas paginas jsp não é uma boa prática de programação, pois mistura código java com html, deixando o código bastante confuso. Para resolver essa questão criaram JSTL, EL (Expression Language). Assunto esse para próximos artigos.

Request

O request representa uma solicitação do browser para o servidor, e o ciclo de vida é marcado pelo recebimento da requisição e montagem da resposta para o cliente.

Ele trata todas as informações que o browser passou para o servidor, exemplo: sabe qual o tipo do método HTTP que deu origem à requisição, possui todos os parâmetros da requisição criados via formulário ou passados via url, também tem referência aos cookies do browser.

Esses são alguns métodos disponíveis:

getParameter(java.lang.String name) – este método retorna o valor de algum parâmetro que está na requisição do browser. “name” é o identificador do parâmetro e caso não encontre o valor retorno é null.

Exemplo: um input text de nome “meuNome”:

 <input type="text" name="meuNome">

Na página que trata a requisição do browser:

<%
String nmCliente = request.getParameter("meuNome");
%>

getParameterValues(java.lang.String name) – este é semelhante ao metodo anterior, a diferença é que ele retorna um array de String. É utilizado nas páginas que possuem elementos com mesmo nome.

Geralmente é utilizado quando é necessário implementar um lista de inputs do tipo checkbox, hidden,.. na página jsp.

Exemplo:

<form action="treatRequest.jsp" method="post">
<ul>
<li><input type="checkbox" name="arrCheckBox" value="radio1"></li>
</ul>
<ul>
<li><input type="checkbox" name="arrCheckBox" value="radio2"></li>
</ul>
<ul>
<li><input type="checkbox" name="arrCheckBox" value="radio3"></li>
</ul>
<ul>
<li><input type="checkbox" name="arrCheckBox" value="radio4"></li>
</ul>
<input type="submit" value="Salvar">
</form>

Código da página que tratará a requisição.

<%
String[] arrCheckBox = request.getParameterValues("arrCheckBox");
%>

setAttribute(java.lang.String name, java.lang.Object o) – Armazena o objeto “o” passado no escopo do request, o parâmetro “name” é um identificador do objeto dentro do request.

getAttribute(java.lang.String name) – retorna uma referência do objeto que está no request, onde “name” é o identificador do objeto.

Os métodos setAttribute(String) e getAttribute(String) são utilizados quando você precisa trafegar objetos entre as páginas jsp, não os parâmetros da requisição HTTP. Exemplo: salvar um objeto Cliente para outra página utilizá-lo.

Para realizar a navegação entre páginas jsp, utilize a tag <jsp:forward page=”nomePagina.jsp”/>. Utilizando esta tag, você passa a requisição para outra página tratar, encaminhando junto todos os parâmetros e objetos salvos no request.

Exemplo:

Criar um formulário de cadastros de nomes.

Classe Pessoa.

package vo;

public class Pessoa {
private String nome;

public final String getNome() {
return nome;
}
public final void setNome(String nome) {
this.nome = nome;
}
}

Fonte do formulário (exRequest.jsp)

Utilizei o mesmo formulário dos exemplos anteriores, então criei uma função javascript que invoca a página para cadastrar uma pessoa.


<script type="text/javascript">
function cadastrarPessoa() {
var meuNome = document.getElementById("meuNome");
window.location = "/Orion/request/cadastrarPessoa.jsp?meuNome=" + meuNome.value;
}
</script>
<p>
Digite seu nome: <input type="text" id="meuNome" name="meuNome">
 <a href="javascript:void(0)" onclick="javascript:cadastrarPessoa();">Cadastrar Pessoa </a>
</p>

Fonte cadastrarPessoa.jsp: esta página será responsável por pegar o valor do parâmetro “meuNome” e criar o objeto Pessoa, logo após o método “setAttribute(´pessoa´, pessoa)” salva o objeto pessoa no request. Agora é só encaminhar a requisição para a página “logicCadastrarPessoa.jsp” tratar.


<%@page import="vo.Pessoa"%>
<%
String nome = request.getParameter("meuNome");
Pessoa pessoa = new Pessoa();
pessoa.setNome(nome);
/* aqui salva objeto no request */
request.setAttribute("pessoa", pessoa);
%>
<jsp:forward page="logicCadastrarPessoa.jsp"/>

Fonte logicCadastrarPessoa.jsp: esta página é responsável por aplicar algum de tipo de regra de negócio* com o objeto Pessoa que está salvo no request.

Também é necessário adicionar um cast implícito para o objeto que você quer utilizar, pois o método

“getAttribute(String)” retorna um Object.


<%@page import="vo.Pessoa"%>
<%
Pessoa pessoa = (Pessoa) request.getAttribute("pessoa");
if(pessoa != null){
%>
<p>Ola <%= pessoa.getNome() %> - agora poderia cadastrar você no banco de dados</p>
<% } %>

PageContext

Este também possui os métodos setAttribute(java.lang.String name, java.lang.Object o) e getAttribute(java.lang.String name) comentados no assunto anterior. A lógica do funcionamento destes dois métodos é igual ao request.

Uma diferença deste objeto é que ele possui a funcionalidade para adicionar ou pegar uma referência a um objeto em qualquer escopo da aplicação.

getAttribute(java.lang.String name, int scope) e setAttribute(java.lang.String name, java.lang.Object o, int scope) – onde “name” é o identificador do objeto, e o int “scope” indica qual o escopo que será utilizado, pode ser as seguintes constantes:

  • PageContext.PAGE_SCOPE
  • PageContext.REQUEST_SCOPE
  • PageContext.SESSION_SCOPE
  • PageContext.APPLICATION_SCOPE

Agora criei um exemplo onde não é definido implicitamente o escopo dos objetos:


<%@page import="java.util.ArrayList"%>
<%@page import="java.util.List"%>
<%
List<Integer> arrNumeros = new ArrayList<Integer>(10);
for (Integer i = 0; i < 10; i++) {
arrNumeros.add(i);
}
%>
<p>Lista de Números - total de números: <%=arrNumeros.size()%></p>
<%
for (Integer i = 0; i < arrNumeros.size(); i++) {
%>
<ul>
<li><%=arrNumeros.get(i)%></li>
</ul>
<%
}
%>

No exemplo acima, criei um coleção de Integer e logo após mostro a listagem completa dos objetos. E você descobriu em qual escopo a variável “arrNumeros” está armazenada? Vamos viajar um pouco: durante o ciclo de vida da página alguns métodos são invocados na inicialização (jspInit()), logo após é invocado o método jspService() que é o responsável por escrever todo o conteúdo html para o cliente, e toda a fonte de scriptlets ficam armazenados dentro deste método… Concluindo, todas as variáveis são locais, existindo apenas durante a execução do método.

Utilizei a diretiva @page para realizar os imports da interface java.util.List e a coleção java.util.ArrayList.

Referência

http://java.sun.com/javaee/5/docs/api/

Comments

Tell me what you're thinking...
and oh, if you want a pic to show with your comment, go get a gravatar!





SEO Powered by Platinum SEO from Techblissonline