简而言之,我想知道如何将objectJSP页面中的内容传递回Servlet。具体来说,我有一个form元素,其action标签引用了一个servlet。在提交表单时,我想嵌入一个objectin HttpServletRequest请求,object以便servlet可以取消引用。
object
HttpServletRequest
到目前为止,我已经尝试request.setAttribute(object)在JSP页面中进行设置。但是仍然从servlet检索它时将其设置为null。任何指针将不胜感激。
request.setAttribute(object)
了解HTTP的工作原理:
HttpServletResponse
当您通过提交表单发送新请求时,它将不会重复使用相同的请求和响应对象。
有两种方法可以克服HTTP的这种无状态本质。您需要将此对象转换String为JSP并将其包含在JSP的HTML表单的隐藏输入字段中,以便在提交时将其用作请求参数。
String
<input type="hidden" name="myObject" value="${myObjectAsString}" />
String由于HTTP和HTML无法理解Java对象,因此必须进行转换。从Java的角度来看,HTML基本上是一种大型语言String(在Web浏览器中单击鼠标右键和“ 查看源代码” 以查看它)。如果您不将Java对象转换为String,则默认情况下,Java对象的toString()结果将被打印为HTML,根据定义,该HTML不能转换回原始Java对象。String复杂对象最常用的格式是JSON和XML。有很多可用的Java库,它们可以在复杂的Java对象之间以及StringJSON或XML格式之间进行转换。
toString()
或者,如果对象太大或太复杂而无法转换为对象String,反之亦然,那么您需要将其存储在服务器的内存或某些数据库中,并将其唯一标识符作为隐藏的输入值传递给周围。通常,会话范围用于此目的。
因此,在准备数据并转发到JSP页面的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页面中:
<form action="nextservlet" method="post"> <input type="hidden" name="myObjectId" value="${myObjectId}" /> ... </form>
最后,在下一个处理表单提交的servlet中:
String myObjectId = request.getParameter("myObjectId"); Object myObject = request.getSession().getAttribute(myObjectId); request.getSession().removeAttribute(myObjectId); // ...