将一个对象从JSP页面传递回Servlet

总之,我想知道如何将一个object从JSP页面传回给一个Servlet。 具体来说,我有一个表单元素的操作标签引用一个servlet。 在表单提交中,我想在HttpServletRequest请求objectembedded一​​个object ,以便它可以被servlet解除引用。

到目前为止,我已经尝试在JSP页面中设置request.setAttribute(object) 。 但仍然从servlet中检索它为null。 任何指针将不胜感激。

了解HTTP如何工作:

  • 客户端触发HTTP请求。
  • 服务器检索HTTP请求。
  • Servletcontainer创build新的HttpServletRequestHttpServletResponse对象。
  • Servletcontainer用这些对象调用适当的servlet。
  • Servlet处理请求并将请求和响应转发给JSP。
  • JSP写入响应正文。
  • ServletContainer提交HTTP响应。
  • 服务器将HTTP响应发送回客户端,并发送请求和响应对象。
  • 客户端检索HTTP响应并处理它(显示HTML,应用CSS,执行JS)。

当您通过提交表单发送新的请求时,将不会重复使用相同的请求和响应对象。

有两种方法可以克服HTTP的这种无状态性质。 您需要将此对象转换为String并将其包含在JSP中的HTML表单的隐藏input字段中,以便在提交时将其作为请求参数提供。

 <input type="hidden" name="myObject" value="${myObjectAsString}" /> 

转换是必要的,因为HTTP和HTML不能理解Java对象。 HTML从Java的angular度来说基本上就是一个大String (在webbrowser中做一个右键单击和查看源代码来查看它)。 如果不将Java对象转换为String ,则默认情况下,Java对象的toString()结果将打印为HTML。

或者,如果对象太大或太复杂,无法转换为String ,反之亦然,则需要将其存储在服务器的内存或某个数据库中,并将其唯一标识符作为隐藏的input值传递。 通常会话范围已被用于此。

表单预处理Servlet例子:

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

JSP例子:

 <input type="hidden" name="myObjectId" value="${myObjectId}" /> 

表单后处理Servlet示例:

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

也可以看看:

  • servlets如何工作? 实例化,会话,共享variables和multithreading
  • 如何为单个浏览器选项卡/窗口存储状态?

一旦JSP被呈现,请求对象就结束了。 因此,您根据JSP请求设置的对象仅适用于该JSP页面请求。 你使用会话而不是请求有任何约束。 因此,会话可以在新的请求之间保存数据,直到会话过期。

最好的方法是将Java对象编码为base64,然后将其作为一个string从JSP传递到servlet。

例如 –

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

在HTTP请求中传递这个结果 –

  <input type = "hidden" name="<%= "MY_JAVA_OBJECT" %>" value="<%= result %>" /> 

在服务器上读取它返回到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();