Servlets

9 respostas
srolbh

Bom, eu sei que o servlet é carregado somente uma vez e que todas as requisicoes sao feitas a ele, sem criacao de novas instancias.

O problema é que eu nao sei como fazer pra nao compartilhar objetos entre varios usuarios. Se eu instanciar um objeto em um servlet, este sera acessado por varias pessoas que compartilharao os estados dos atributos.

Eu gostaria de saber como evitar esse problema.

obrigado

9 Respostas

davidbuzatto

Como que uma pessoa vai acessar um objeto de seu servlet??? O servlet num vai embaralhar objetos de um ou outro usuário. O servlet é instanciado para cada requisição ou sessão se não me engano e não para todo mundo.

srolbh

Então a Kathy Sierra errou quando disse que o Servlet é carregado no container web apenas uma vez… pelo que eu sei, é criada uma nova thread a cada solicitacao.

Meu problema é que eu fiz um POJO de paginacao com instancia no servlet e todas as threads compartilham os atributos dessa instancia.

davidbuzatto

Como vc, eu não sei tudo, se a kathy sierra falou, então tá bom. Como vc manja muito, sabe tudo, e provavelmente deve ser scwcd (pois estudou toda a teoria com muita atenção) acho estranho vc vir perguntar esse tipo de coisa.

Se o servlet não é thread safe (isso eu não sei, vc q ta falando) vc vai precisar arrumar uma solução para isso. Já que eu não sei nada e me enrolo com as definições e como tudo funciona acho melhor não tentar ajudar, pq se não eu levo patada né…

Falow

srolbh

Eu não falei que sei de tudo. Eu so respondi ao seu comentário equivocado.

Só quis dizer que esse não é o problema pois são criadas threads e não novas instancias. Minha intenção não foi te ofender. Mas perdão caso eu tenha lhe ofendido. Se você está nervoso, vai pescar :wink:

Dieval_Guizelini

Senhores,

objetos podem ser mantido entre duas ou mais requisições através dos seguintes recursos:

  • sessão (HttpSession)
  • pode-se criar uma threadlocal… normalmente usada em filters…
  • incluir os elementos que permitam a reconstrução da instância do objeto em campos hidden do html para que na próxima requisição se reconstrua eles…
  • pode-se serializar o objeto e colocá-lo em campos hidden,

existem outras possibilidades, mas estas são as mais comuns.

Mas, não crie atributos em subclasses servlets.

Tudo certo?

fw

zirocool

Dieval, eu acho que não era exatamente isso que ele tava querendo.

Cada vez q é criada uma session, é criada para o usuário que fez a requisição do Servlet nakele instante.

O que ele quer é compartilhar um objeto à nível de aplicação, com session não tem como…

Eu vou dar uma olhada na documentação, pq não me recordo como faz, mas sei que tem como compartilhar objetos a nível de aplicação…

[ ]'s,
Misael.

zirocool

[EDITADA]

Na verdade eu eh que entendi errado, sessão resolve o problema sim, eu eh que viajei, entendi q ele queria compartilhar objetos em várias sessões… ehhehe

Dieval_Guizelini

Fica frio zirocool,

até onde eu sei, os escopos dos servlet são:

  1. application - situação que você estava se referindo (que eu saíba estes objetos são armazenados no objeto ServletContext). Exemplo de situações em que usamos este recurso: informar os usuários on-line em uma aplicação (neste caso não depende de sessão e não precisa manter a informação em base de dados);

  2. session - sessão de usuário (objeto de HttpSession);

  3. request - escopo de visibilidade ou duração da requisição (objeto ServletRequest); e

  4. page - limita-se a visibilidade ou existência ao contexto da página que a define (é armazenada em pageContext).

No problema proposto, ele consegue resolver com o uso de sessão.

fw

srolbh

Pessaol, realmente eu resolvi com o uso de HttpSession.

Agora cada usuario tem os atributos necessários armazenados em sessao, evitando a “mistura”.

Obrigado

Criado 29 de março de 2007
Ultima resposta 30 de mar. de 2007
Respostas 9
Participantes 4