Passando um object da página JSP de volta para o Servlet

Em resumo, quero saber como passar um object da página JSP de volta para um Servlet. Especificamente, eu tenho um elemento de formulário cuja tag de ação faz referência a um servlet. No envio de formulário, desejo incorporar um object no object solicitação HttpServletRequest para que possa ser desreferenciado pelo servlet.

Até agora, tentei definir request.setAttribute(object) na página JSP. Mas ainda recuperá-lo do servlet dá como nulo. Quaisquer pointers seriam apreciados.

Saiba como o HTTP funciona:

  • O cliente triggers a solicitação HTTP.
  • O servidor recupera a solicitação HTTP.
  • Servletcontainer cria novos objects HttpServletResponse e HttpServletResponse .
  • Servletcontainer chama o servlet apropriado com esses objects.
  • Servlet processa solicitação e encaminha solicitação e resposta ao JSP.
  • JSP grava no corpo da resposta.
  • Servletcontainer confirma a resposta HTTP.
  • O servidor envia a resposta HTTP de volta aos objects de solicitação e resposta de cliente e garbages.
  • O cliente recupera a resposta HTTP e a processa (exibe HTML, aplica CSS, executa JS).

Quando você envia uma nova solicitação enviando o formulário, ela não reutiliza os mesmos objects de solicitação e resposta.

Existem duas maneiras de superar essa natureza sem estado do HTTP. Você precisa converter esse object para String e incluí-lo em um campo de input oculto do formulário HTML na JSP para que ele esteja disponível como um parâmetro de solicitação no envio.

  

A conversão é necessária porque HTTP e HTML não entendem objects Java. O HTML está na perspectiva do Java, basicamente, uma String grande (faça um rightclick e View Source no webbrowser para vê-lo). Se você não converter um object Java em String , então, por padrão, o resultado toString() do object Java será impresso em HTML.

Ou, se o object for muito grande ou muito complexo para ser convertido em String e vice-versa, você precisará armazená-lo na memory do servidor ou em algum database e, em vez disso, passar seu identificador exclusivo como valor de input oculto. Normalmente, o escopo da session é usado para isso.

Exemplo de servlet de pré-processamento de formulário:

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

Exemplo JSP:

  

Formulário de pós-processamento Exemplo de servlet:

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

Veja também:

  • Como os servlets funcionam? Instanciação, sessões, variables ​​compartilhadas e multithreading
  • Como posso armazenar o estado de uma guia / janela individual do navegador?

uma vez que o JSP é processado, o object de solicitação é finalizado. Portanto, o object que você configura a pedido do JSP está disponível apenas para essa solicitação de página JSP. Você tem alguma restrição ao usar a session em vez da solicitação. Assim, a session pode conter dados entre solicitações novas até a session expirar.

A melhor maneira é codificar o object Java em base64 e depois passá-lo como uma String do JSP para o servlet.

Por exemplo –

 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())); 

Passar este resultado em requisição HTTP –

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

Leia no servidor de volta ao 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();