Fórum Atributos com escopo de sessão, request e aplicação. Como utilizar? #566239

10/09/2011

0

Boa noite. Sou um iniciante em Java EE e estou com dificuldades para entender como posso utilizar os atributos citados no título acima. Olha, até entendi que os atributos com escopo de request só são mantidos por uma requisição apenas. Por tanto se alguém clicar no botão voltar(back) do navegador após ter feito uma requisição os dados inseridos naquela página não serão mantidos - Pelo menos foi o que eu entendi. Por favor, me corrijam se eu estiver errado. Mas, e os atributos com escopo de sessão e aplicação. O que representam? Como posso utilizá-los? Será que alguém pode postar qual é o código correto para setar e recuperar valores armazenados em atributos com escopo de sessão e aplicação? Faço este apelo porque preciso desenvolver uma aplicação WEB e não estou compreendendo bem como trabalhar com atributos de Java para WEB. Desde já, agradeço pela força... André
André Barroso

André Barroso

Responder

Posts

13/09/2011

Diogo Souza

Cara, com relação ao escopo de request, está correto, eles duram apenas o tempo de uma requisição; ao término da mesma todos os dados setados no objeto que representa o escopo terão sido apagados. No escopo de sessão, quando um usuário acessar o sistema web, ele estabelece com o servidor uma sessão. Os dados setados no objeto que representa este escopo existem desde o instante inicial, quando o usuário acessa a aplicação, até que essa expire por inatividade, seja voluntariamente ou finalizada pela aplicação. Já no escopo de aplicação, os objetos vivem desde a inicialização do servidor de aplicação até que ele seja finalizado. Além destes caras, também temos um escopo chamado [b]page[/b] que se aplica somente ao ciclo de vida das JSP's da sua aplicação. Nele os objetos são definidos em e para cada página e existem apenas para elas mesmas. Os três objetos funcionam como mapas (chave-valor) que guardam "principalmente" atributos a serem manipulados pela aplicação:
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
   // Setando atributos...
   request.setAttribute("nome", "valor");
   request.getSession().setAttribute("nome", "valor");
   getServletContext().setAttribute("nome", "valor");

   // Recuperando valores
   Object valorRequest = request.getAttribute("nome");
   Object valorSession = request.getSession().setAttribute("nome");
   Object valorApplication = getServletContext().setAttribute("nome");
}
Não esqueça de fazer o cast para o objeto que o [b]getAttribute[/b] retorna! :!:
Responder

Gostei + 0

13/09/2011

Marcelo Henrique

É interessante mencionar outra característica importantes dos escopos que é a visibilidade da informação. No escopo de sessão cada usuário abre uma sessão com o servidor e somente esse usuário tem acesso a essa sessão. Desta forma, ficam várias sessões abertas no servidor para cada usuário que acessa o mesmo. Já o escopo de aplicação é compartilhado para todos os usuários. Fazendo uma pequena analogia com orientação a objetos onde também temos escopos bem definidos. [b]escopo de página = variável de um loop.[/b] Aquele int i que você cria como primeiro parâmetro de um loop for. Ele só existe durante a execução do loop. No escopo de página existe objetos que só estão disponíveis no momento da tradução da página de JSP para HTML que é o que o browser entende no fim das contas. [b]escopo de requisição = variável de um método.[/b] Os atributos no escopo de requisição seriam como aquela variável String retorno que você cria no começo do método usa pra armazenar o valor durante a execução e retorna o valor armazenado nessa variável no fim do método. O escopo de requisição é assim só existe enquanto a requisição está sendo processada. [b]escopo de sessão = atributo de classe.[/b] Desde o momento em que o objeto é criado ele existe. Você pode passar o objeto pra outros métodos. Ir e voltar de todo jeito e o atributo ainda estará lá existindo. Mas se você instanciar um outro objeto será um novo atributo que poderá armazenar um novo valor. Da mesma forma é a sessão, é como se cada usuário que acessa o servidor instancie um novo objeto de sessão ao qual somente ele tem acesso. [b]escopo de aplicação = atributo estático.[/b] Aquele atributo que não importa a quantidade de objetos ele sempre será o mesmo para todos os objetos. Compartilhado. Acho que essa é a forma mais simples de entender os escopos web, entendendo os escopos OO. Lembrando que a diferença entre os escopos web são semelhantes aos escopos de orientação a objetos. Diferenças entre eles em tempo de vida e visibilidade dos objetos que fazem parte do escopo.
Responder

Gostei + 0

18/09/2011

Andre Barroso

Srs. Marcelo Henrique e Metal Java Full, boa tarde. Desculpe pela demora em respondê-los, é que eu estava em semana de prova, aí não consegui entrar no forum. Muito obrigado pela informação. Me ajudou bastante. Fico grato pela ajuda. Tenham uma boa semana!
Responder

Gostei + 0

18/09/2011

André Barroso

Srs. Só uma pergunta. Como é que eu especifico o escopo? No corpo da página, no form.................
Responder

Gostei + 0

24/09/2011

Marcelo Henrique

Olá desculpe a demora em responder também =P Tava resolvendo uns pro no cliente essa semana e fiquei meio ausente do fórum. O código que o Diogo postou já cobria a maioria dos casos.
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
   // Setando atributos...  
   request.setAttribute("nome", "valor"); // Setando no escopo de requisição
   request.getSession().setAttribute("nome", "valor"); // Setando no escopo de sessão.
   getServletContext().setAttribute("nome", "valor"); // Setando no escopo de aplicação.
  
   // Recuperando valores  
   Object valorRequest = request.getAttribute("nome"); // Pegando no escopo de requisição
   Object valorSession = request.getSession().setAttribute("nome"); // Pegando no escopo de sessão.
   Object valorApplication = getServletContext().setAttribute("nome"); // Pegando no escopo de aplicação.
}
Responder

Gostei + 0

24/09/2011

André Barroso

Boa noite Marcelo. Então me diz, como fazer para que quando o usuário clicar no botão voltar do browser a página retorne em sem os dados preenchidos na ultima requisição? Sabe eu lio algo sobre Struts 2 que diz que há um forma de definir que uma página pertence a um determinado escopo, daí, se a pessoa der um voltar no browser e esta página estiver no escopo de request a página voltará com o forme em branco. Como faço isto sem usar este framework? Grato pela atenção. [quote="marcelohenrique"]Olá desculpe a demora em responder também =P Tava resolvendo uns pro no cliente essa semana e fiquei meio ausente do fórum. O código que o Diogo postou já cobria a maioria dos casos.
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
   // Setando atributos...  
   request.setAttribute("nome", "valor"); // Setando no escopo de requisição
   request.getSession().setAttribute("nome", "valor"); // Setando no escopo de sessão.
   getServletContext().setAttribute("nome", "valor"); // Setando no escopo de aplicação.
  
   // Recuperando valores  
   Object valorRequest = request.getAttribute("nome"); // Pegando no escopo de requisição
   Object valorSession = request.getSession().setAttribute("nome"); // Pegando no escopo de sessão.
   Object valorApplication = getServletContext().setAttribute("nome"); // Pegando no escopo de aplicação.
}
Responder

Gostei + 0

24/09/2011

Marcelo Henrique

Isso depende muito do que você está utilizando. Servlet, JSP e JSTL + EL? Se for só isso o objeto que é utilizado pra popular a página não pode ser um objeto de sessão ou aplicação. Se ele tiver que ser um objeto de sessão ou aplicação você terá que limpá-lo sempre que a página for chamada. O problema disso é que ao voltar a página você teria que colocar um evento, muito provavelmente, no onload da página com uma requisição ajax pra ir no servidor limpar o objeto da sessão.
Responder

Gostei + 0

24/09/2011

Marcelo Henrique

Você acertou em cheio, são justamente estas tecnologias que tenho utilizado. Mas, então, como faço isto? Cemo especificar que tal objeto será de request e não de sessão ou aplicação? [quote="marcelohenrique"]Isso depende muito do que você está utilizando. Servlet, JSP e JSTL + EL? Se for só isso o objeto que é utilizado pra popular a página não pode ser um objeto de sessão ou aplicação. Se ele tiver que ser um objeto de sessão ou aplicação você terá que limpá-lo sempre que a página for chamada. O problema disso é que ao voltar a página você teria que colocar um evento, muito provavelmente, no onload da página com uma requisição ajax pra ir no servidor limpar o objeto da sessão.
Responder

Gostei + 0

25/09/2011

Marcelo Henrique

Na Servlet, conforme mostrou o Diogo (Metal Java Full). O método doGet é um método da Servlet. Utilizando uma daquelas opções você consegue setar o objeto na requisição, sessão ou aplicação. Você também tem acesso ao objeto HttpServletRequest na JSP então é possível pegar os atributos de requisição e sessão. Se não me engano o servlet context também é acessível da JSP então é possível pegar atributos de aplicação também. Declare uma servlet e utilize-a.
Responder

Gostei + 0

25/09/2011

Marcelo Henrique

Bom dia Marcelo. Tenho trabalhado somente com o método service na Servlet. Vou pesquisar então como utilizá-lo. Grato pela atenção. Bom domingo! [quote="marcelohenrique"]Na Servlet, conforme mostrou o Diogo (Metal Java Full). O método doGet é um método da Servlet. Utilizando uma daquelas opções você consegue setar o objeto na requisição, sessão ou aplicação. Você também tem acesso ao objeto HttpServletRequest na JSP então é possível pegar os atributos de requisição e sessão. Se não me engano o servlet context também é acessível da JSP então é possível pegar atributos de aplicação também. Declare uma servlet e utilize-a.
Responder

Gostei + 0

08/01/2013

Marcelo Henrique

[quote="marcelohenrique"]Olá desculpe a demora em responder também =P Tava resolvendo uns pro no cliente essa semana e fiquei meio ausente do fórum. O código que o Diogo postou já cobria a maioria dos casos.
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
   // Setando atributos...  
   request.setAttribute("nome", "valor"); // Setando no escopo de requisição
   request.getSession().setAttribute("nome", "valor"); // Setando no escopo de sessão.
   getServletContext().setAttribute("nome", "valor"); // Setando no escopo de aplicação.
  
   // Recuperando valores  
   Object valorRequest = request.getAttribute("nome"); // Pegando no escopo de requisição
   Object valorSession = request.getSession().setAttribute("nome"); // Pegando no escopo de sessão.
   Object valorApplication = getServletContext().setAttribute("nome"); // Pegando no escopo de aplicação.
}
só uma observação, creio q nas 2 ultimas linhas seja assim:
   Object valorSession = request.getSession().getAttribute("nome"); // getAttribute("
   Object valorApplication = getServletContext().getAttribute("nome"); // getAttribute("
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar