Passare un object dalla pagina JSP a Servlet

In breve, voglio sapere come passare un object dalla pagina JSP a un servlet. Nello specifico, ho un elemento form il cui tag di azione fa riferimento a un servlet. Nell’invio del modulo, voglio incorporare un object di richiesta HttpServletRequest in modo che possa essere dereferenziato dal servlet.

Finora, ho provato a impostare request.setAttribute(object) nella pagina JSP. Ma continuando a recuperarlo da servlet, viene restituito come null. Qualsiasi suggerimento sarebbe apprezzato.

Scopri come funziona HTTP:

  • Il client triggers la richiesta HTTP.
  • Il server recupera la richiesta HTTP.
  • Servletcontainer crea nuovi oggetti HttpServletRequest e HttpServletResponse .
  • Servletcontainer richiama servlet appropriato con tali oggetti.
  • I processi servlet richiedono e inoltrano richieste e risposte a JSP.
  • JSP scrive nel corpo della risposta.
  • Servletcontainer impegna la risposta HTTP.
  • Il server invia la risposta HTTP agli oggetti richiesta e risposta del client e garbages.
  • Il client recupera la risposta HTTP e la elabora (visualizza HTML, applica CSS, esegue JS).

Quando invii una nuova richiesta inviando il modulo, non riutilizzerà gli stessi oggetti di richiesta e risposta.

Esistono due modi per superare questa natura stateless di HTTP. È necessario convertire questo object in String e includerlo in un campo di input nascosto del modulo HTML nel JSP in modo che sia disponibile come parametro di richiesta al momento dell’invio.

  

La conversione è necessaria perché HTTP e HTML non comprendono gli oggetti Java. L’HTML è in prospettiva Java fondamentalmente una String grande (fai clic con il tasto destro e Visualizza sorgente nel browser per vederlo). Se non si converte un object Java in String , per impostazione predefinita il risultato toString() dell’object Java verrà stampato su HTML.

Oppure, se l’object è troppo big o troppo complesso per essere convertito in String e viceversa, è necessario archiviarlo nella memoria del server o in qualche database e passare il suo identificatore univoco come valore di input nascosto. Di solito l’ambito della sessione è stato usato per questo.

Esempio di servlet di preelaborazione dei moduli:

 String myObjectId = UUID.randomUUID().toString(); request.getSession().setAttribute(myObjectId, myObject); request.setAttribute("myObjectId", myObjectId); request.getRequestDispatcher("/WEB-INF/page.jsp").forward(request, response); 

Esempio JSP:

  

Esempio di servlet di post-elaborazione:

 String myObjectId = request.getParameter("myObjectId"); Object myObject = request.getSession().getAttribute(myObjectId); request.getSession().removeAttribute(myObjectId); // ... 

Guarda anche:

  • Come funzionano le servlet? Istanziazione, sessioni, variabili condivise e multithreading
  • Come posso memorizzare lo stato per una singola scheda / finestra del browser?

una volta eseguito il rendering del JSP, l’object richiesta è finito. Pertanto, l’object impostato su richiesta di JSP è disponibile solo per la richiesta della pagina JSP. Hai qualche vincolo sull’utilizzo della sessione invece della richiesta. Quindi, la sessione può contenere dati tra nuove richieste fino alla scadenza della sessione.

Il modo migliore è codificare l’object Java in base64 e passarlo come stringa da JSP a servlet.

Per esempio –

 final ByteArrayOutputStream baos = new ByteArrayOutputStream(); final ObjectOutputStream oos = new ObjectOutputStream(baos); oos.writeObject(javaObject); oos.flush(); final String result = new String(Base64.getEncoder().encode(baos.toByteArray())); 

Passa questo risultato nella richiesta HTTP –

  " value="<%= result %>" /> 

Leggilo sul server su object java –

 final String base64String = request.getparameter("MY_JAVA_OBJECT"); final byte[] objToBytes = Base64.getDecoder().decode(base64String); ByteArrayInputStream bais = new ByteArrayInputStream(objToBytes); ObjectInputStream ois = new ObjectInputStream(bais); return (ObjectClass) ois.readObject();