简而言之,我想知道如何将object
从JSP页面传递回Servlet。具体来说,我有一个表单元素,其action标记引用了一个servlet。在表单提交时,我想在object
请求HttpServletRequest
中嵌入object
,以便servlet可以取消引用它。
到目前为止,我已尝试在JSP页面中设置request.setAttribute(object)
。但是仍然从servlet中检索它会将其作为null。任何指针都会受到赞赏。
答案 0 :(得分:41)
了解HTTP的工作原理:
HttpServletRequest
和HttpServletResponse
个对象。当您通过提交表单发送新请求时,它将不会重复使用相同的请求和响应对象。
有两种方法可以克服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();