Atributos com escopo de sessão, request e aplicação. Como utilizar?
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
Curtidas 0
Respostas
Diogo Souza
10/09/2011
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:Não esqueça de fazer o cast para o objeto que o [b]getAttribute[/b] retorna!
:!:
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");
}GOSTEI 0
Marcelo Henrique
10/09/2011
É 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.
GOSTEI 0
Andre Barroso
10/09/2011
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!
GOSTEI 0
André Barroso
10/09/2011
Srs.
Só uma pergunta.
Como é que eu especifico o escopo?
No corpo da página, no form.................
GOSTEI 0
Marcelo Henrique
10/09/2011
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.
}
GOSTEI 0
André Barroso
10/09/2011
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.
}
GOSTEI 0
Marcelo Henrique
10/09/2011
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.
GOSTEI 0
Marcelo Henrique
10/09/2011
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.
GOSTEI 0
Marcelo Henrique
10/09/2011
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.
GOSTEI 0
Marcelo Henrique
10/09/2011
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.
GOSTEI 0
Marcelo Henrique
10/09/2011
[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.
só uma observação, creio q nas 2 ultimas linhas seja assim:
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.
}
Object valorSession = request.getSession().getAttribute("nome"); // getAttribute("
Object valorApplication = getServletContext().getAttribute("nome"); // getAttribute("
GOSTEI 0