将对象从JSP页面传递回Servlet

时间:2010-11-23 07:20:41

标签: jsp object servlets

简而言之,我想知道如何将object从JSP页面传递回Servlet。具体来说,我有一个表单元素,其action标记引用了一个servlet。在表单提交时,我想在object请求HttpServletRequest中嵌入object,以便servlet可以取消引用它。

到目前为止,我已尝试在JSP页面中设置request.setAttribute(object)。但是仍然从servlet中检索它会将其作为null。任何指针都会受到赞赏。

3 个答案:

答案 0 :(得分:41)

了解HTTP的工作原理:

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

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

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

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

转换是必要的,因为HTTP和HTML不了解Java对象。 HTML在Java的视角基本上是一个大的String(在webbrowser中做一个rightclick和 View Source 来查看它)。如果不将Java对象转换为String,则默认情况下Java对象的toString()结果将打印为HTML。

或者,如果对象太大或太复杂而无法转换为String,反之亦然,那么您需要将其存储在服务器的内存或某个数据库中,而是将其唯一标识符传递给隐藏输入值。通常会话范围用于此目的。

表单预处理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);
// ...

另见:

答案 1 :(得分:2)

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

答案 2 :(得分:2)

最好的方法是在base64中编码Java对象,然后将其作为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();