Pergunta

Eu gostaria de saber se há alguma maneira de compartilhar uma variável ou um objeto entre duas ou mais Servlets, quero dizer alguma forma "padrão". Suponho que esta não é uma boa prática, mas é uma maneira mais fácil de construir um protótipo.

Eu não sei se ele depende das tecnologias utilizadas, mas vou usar Tomcat 5.5


Eu quero compartilhar um vetor de objetos de uma classe simples (apenas atributos públicos, cordas, ints, etc). Minha intenção é ter um conjunto de dados estáticos como em um DB, obviamente, ele será perdido quando o Tomcat está parado. (É apenas para testes)

Foi útil?

Solução

Eu acho que o que você está procurando aqui é pedido, sessão ou aplicativo de dados.

Em um servlet você pode adicionar um objeto como um atributo para o objeto do pedido objeto, objeto de sessão ou contexto servlet:

protected void doGet(HttpServletRequest request, HttpServletResponse response) {
    String shared = "shared";
    request.setAttribute("sharedId", shared); // add to request
    request.getSession().setAttribute("sharedId", shared); // add to session
    this.getServletConfig().getServletContext().setAttribute("sharedId", shared); // add to application context
    request.getRequestDispatcher("/URLofOtherServlet").forward(request, response);
}

Se você colocá-lo no objeto de solicitação estará disponível para o servlet que é encaminhado para até que o pedido é finalizado:

request.getAttribute("sharedId");

Se você colocá-lo na sessão estará disponível a todos os servlets vai para a frente, mas o valor será vinculado ao usuário:

request.getSession().getAttribute("sharedId");

Até a sessão expira com base na inatividade do usuário.

é reposto por você:

request.getSession().invalidate();

ou um servlet remove-lo do âmbito de aplicação:

request.getSession().removeAttribute("sharedId");

Se você colocá-lo no contexto servlet ele estará disponível enquanto a aplicação está em execução:

this.getServletConfig().getServletContext().getAttribute("sharedId");

Até que você removê-lo:

this.getServletConfig().getServletContext().removeAttribute("sharedId");

Outras dicas

Coloque-o em um dos 3 escopos diferentes.

pedido - dura vida de solicitação

sessão - dura vida de sessão do usuário

Aplicação - dura até applciation é desligado

Você pode acessar todos esses âmbitos através da variável HttpServletRequest que é passado para os métodos que se estendem desde o HttpServlet classe

depende do escopo das indicações de uso dos dados.

Se os dados só é usado em uma base por usuário, como informações de login do usuário, contagem de ocorrências página, etc. usar o objeto de sessão (HttpServletRequest.getSession (). Get / setAttribute (String [, Object]))

Se é os mesmos dados em múltiplos usuários (acessos à página web totais, segmentos de trabalho, etc) use os atributos ServletContext. servlet.getServletCongfig (). getServletContext get / setAttribute (). (String [, Object])). Isto só irá funcionar dentro do arquivo mesma guerra / applicaiton web. Note-se que estes dados não são persistentes entre reinicializações quer.

Outra opção, compartilhar dados betwheen contextos ...

share-dados-entre-servlets-on-tomcat

  <Context path="/myApp1" docBase="myApp1" crossContext="true"/>
  <Context path="/myApp2" docBase="myApp2" crossContext="true"/>

Em MyApp1:

  ServletContext sc = getServletContext();
  sc.setAttribute("attribute", "value");

Em MyApp2:

  ServletContext sc = getServletContext("/myApp1");
  String anwser = (String)sc.getAttribute("attribute");

Você não poderia apenas colocar o objeto no HttpSession e depois se referem a ele por seu nome de atributo em cada um dos servlets?

por exemplo:

getSession().setAttribute("thing", object);

... então em outro servlet:

Object obj = getSession.getAttribute("thing");

Aqui está como eu fazer isso com Jetty.

https://stackoverflow.com/a/46968645/1287091

Usa o contexto do servidor, onde um singleton é escrito para durante a inicialização de um servidor Jetty integrado e compartilhado entre todos os webapps para a vida do servidor. Também pode ser usado para objetos share / dados entre webapps assumindo que não é apenas um escritor para o contexto - caso contrário, você precisa estar atento a simultaneidade

.
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top