Come posso condividere una variabile o un oggetto tra due o più Servlet?


39

Vorrei sapere se c'è un modo per condividere una variabile o un oggetto tra due o più Servlet, intendo un modo "standard". Suppongo che questa non sia una buona pratica, ma è un modo più semplice per costruire un prototipo.

non so se dipende da tecnologie utilizzate, ma userò Tomcat 5,5


voglio condividere un vettore di oggetti di una classe semplice (solo attributi pubblici, stringhe, int, ecc.). La mia intenzione è di avere dati statici come in un DB, ovviamente andrà perso quando Tomcat viene fermato. (è solo per i test)

  0

Dipende in gran parte dal tipo di oggetto/variabile che è. La variabile appartiene a una classe e vuoi solo l'accesso? È una costante? Un esempio sarebbe carino. 23 set. 082008-09-23 20:34:14

  0

Mi piacerebbe che questo aiuti :) 23 set. 082008-09-23 20:43:24

74

Penso che quello che stai cercando qui sia la richiesta, la sessione o i dati dell'applicazione.

In un servlet è possibile aggiungere un oggetto come un attributo alla richiesta oggetto, oggetto di sessione o contesto servlet oggetto:

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 lo metti in l'oggetto della richiesta, sarà a disposizione del servlet che è trasmesso al fino a quando la richiesta è terminata:

request.getAttribute("sharedId"); 

Se lo metti nella sessione che sarà a disposizione di tutti i servlet andando avanti, ma il valore sarà legato per l'utente:

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

Fino a quando la sessione scade in base all'inattività dell'utente.

viene azzerato da te:

request.getSession().invalidate(); 

O uno servlet rimozione dal campo di applicazione:

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

Se lo metti nel contesto servlet sarà disponibile mentre l'applicazione è in esecuzione:

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

Fino a quando lo si rimuove:

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

Puoi estendere la risposta per ServletContext? 23 set. 082008-09-23 20:57:28

+1

Oppure 'getServletContext()' invece di 'this.getServletConfig(). GetServletContext()' ... 10 nov. 152015-11-10 08:55:26

  0

@William Come posso passare qualcos'altro di una stringa per esempio. un oggetto di una classe che ho creato io stesso? 26 nov. 152015-11-26 08:35:12

  0

@Dongo Sarò sincero è passato molto tempo da quando ho lavorato con i servlet ma se ricordo correttamente mentre usavo una stringa per l'esempio poteva essere qualsiasi oggetto. 27 nov. 152015-11-27 17:56:51


1

Non si può semplicemente inserire l'oggetto in HttpSession e quindi fare riferimento ad esso con il nome dell'attributo in ciascuno dei servlet?

es:

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

... poi in un'altra servlet:

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

l'oggetto non deve essere serializzabile affinché funzioni? 06 set. 132013-09-06 16:56:04


7

dipende dalla portata della destinazione dei dati.

Se i dati vengono utilizzati al solo su un singolo utente, come informazioni di login utente, pagina Hit Count, ecc utilizzare l'oggetto della sessione (httpServletRequest.getSession(). Get/setAttribute (String [, Object]))

Se si tratta degli stessi dati su più utenti (risultati di pagine Web totali, thread di lavoro, ecc.) Utilizzare gli attributi ServletContext. servlet.getServletCongfig(). getServletContext(). get/setAttribute (String [, Object])). Questo funzionerà solo all'interno dello stesso file di guerra/applicazione web. Si noti che questi dati non sono persistenti anche durante i riavvii.

  0

L'utilizzo di ServletContext può facilmente metterti nei guai se non stai attento. Ad esempio, non è possibile utilizzarlo per implementare un conteggio di hit della pagina in modo ingenuo: ottenere il conteggio del numero di pagine corrente dal contesto, incrementarlo e impostare il valore sul contesto. La multi-threading uccide quella soluzione. 23 set. 082008-09-23 21:06:49

  0

Meta critica: la domanda è chiedere la funzionalità di un archivio di dati di supporto dovrebbe essere la gestione tramite transazioni comunque. I reclami relativi all'ACID devono risultare nell'utilizzo di un servizio dati ACID. ServletContext e Session violano tutti gli ACID in qualche modo. 24 set. 082008-09-24 19:46:05


8

Inseritelo in uno dei 3 diversi ambiti.

richiesta - dura vita della richiesta

sessione - durata di vita della sessione dell'utente

applicazione - dura fino applciation è spento

È possibile accedere a tutti questi scopi tramite la variabile HttpServletRequest che è passato ai metodi che si estendono dal HttpServlet class


2

Un'altra opzione, condividere i dati tra i contesti ...

share-data-between-servlets-on-tomcat

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

Su myApp1:

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

Su MyApp2:

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

0

Ecco come lo faccio con Jetty.

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

utilizza il contesto di server, dove un singleton viene scritto durante l'avvio di un server Jetty embedded e condivisa tra tutti webapps per la vita del server. Può anche essere usato per condividere oggetti/dati tra le applicazioni web presupponendo che ci sia un solo writer per il contesto, altrimenti è necessario essere consapevoli della concorrenza.