到目前为止,我已经尝试在JSP页面中设置request.setAttribute(object)。但是仍然从servlet中检索它,使其为null。任何指针都将不胜感激。
了解HTTP如何工作:>客户端触发HTTP请求。
>服务器检索HTTP请求。
> Servletcontainer创建新的HttpServletRequest和HttpServletResponse对象。
> Servlet容器使用这些对象调用适当的servlet。
> Servlet处理请求并转发对JSP的请求和响应。
> JSP写入响应体。
> Servlet容器提交HTTP响应。
>服务器将HTTP响应发送回客户端并停止请求和响应对象。
>客户端检索HTTP响应并处理它(显示HTML,应用CSS,执行JS)。
当您通过提交表单发送新请求时,它不会重复使用相同的请求和响应对象。
有两种方法来克服HTTP的无状态性质。您需要将此对象转换为String,并将其包含在JSP中HTML表单的隐藏输入字段中,以便在提交时可以作为请求参数使用。
<input type="hidden" name="myObject" value="${myObjectAsString}" />
转换是必要的,因为HTTP和HTML不能理解Java对象。 HTML在Java的角度基本上是一个大的String(在webbrowser中查看右键单击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); // ...
也可以看看:
> How do servlets work? Instantiation, shared variables and multithreading
> How to store data for every individual browser tab/window? The session scope is too broad