Domanda

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

Non so se dipende dalle tecnologie utilizzate, ma userò Tomcat 5.5


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

È stato utile?

Soluzione

Penso che ciò che stai cercando qui siano i dati di richiesta, sessione o applicazione.

In un servlet è possibile aggiungere un oggetto come attributo all'oggetto richiesta, all'oggetto sessione o all'oggetto contesto 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 lo metti nell'oggetto richiesta sarà disponibile al servlet a cui viene inoltrato fino al termine della richiesta:

request.getAttribute("sharedId");

Se lo metti nella sessione, sarà disponibile per tutti i servlet in futuro, ma il valore sarà legato all'utente:

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

Fino alla scadenza della sessione in base all'inattività dell'utente.

Viene ripristinato da te:

request.getSession().invalidate();

O un servlet lo rimuove dall'ambito:

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 non lo rimuovi:

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

Altri suggerimenti

Inseriscilo in uno dei 3 diversi ambiti.

richiesta - dura la durata della richiesta

sessione: dura la durata della sessione dell'utente

applicazione: dura fino alla chiusura di applciation

Puoi accedere a tutti questi ambiti tramite la variabile HttpServletRequest che viene passata ai metodi che si estendono da classe HttpServlet

Dipende dall'ambito di utilizzo previsto dei dati.

Se i dati vengono utilizzati solo per utente, ad esempio le informazioni di accesso dell'utente, il numero di accessi alla pagina e così via, utilizzare l'oggetto sessione (httpServletRequest.getSession (). get / setAttribute (String [, Object]))

Se si tratta degli stessi dati tra più utenti (hit totali di pagine Web, thread di lavoro, ecc.) utilizzare gli attributi ServletContext. servlet.getServletCongfig (). getServletContext (). get / setAttribute (String [, Object])). Funzionerà solo all'interno dello stesso file di guerra / applicazione Web. Si noti che questi dati non sono persistenti per tutti i riavvi.

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

condividi-dati-tra-servlet-su-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");

Non potresti semplicemente mettere l'oggetto in HttpSession e quindi fare riferimento ad esso con il suo nome di attributo in ciascuno dei servlet?

per esempio:

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

... quindi in un altro servlet:

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

Ecco come lo faccio con Jetty.

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

Utilizza il contesto del server, in cui viene scritto un singleton durante l'avvio di un server Jetty incorporato e condiviso tra tutte le webapp per la vita del server. Può anche essere usato per condividere oggetti / dati tra webapps supponendo che ci sia un solo scrittore nel contesto, altrimenti devi essere consapevole della concorrenza.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top