将对象从JSP页面传递回Servlet

kur*_*der 23 jsp servlets object

简而言之,我想知道如何将objectJSP页面传递回Servlet.具体来说,我有一个表单元素,其action标记引用了一个servlet.在表单提交,我希望嵌入objectHttpServletRequest请求object,以便它可以通过servlet的解除引用.

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

Bal*_*usC 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}" />
Run Code Online (Sandbox Code Playgroud)

转换是必要的,因为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);
Run Code Online (Sandbox Code Playgroud)

JSP示例:

<input type="hidden" name="myObjectId" value="${myObjectId}" />
Run Code Online (Sandbox Code Playgroud)

表单后处理Servlet示例:

String myObjectId = request.getParameter("myObjectId");
Object myObject = request.getSession().getAttribute(myObjectId);
request.getSession().removeAttribute(myObjectId);
// ...
Run Code Online (Sandbox Code Playgroud)

也可以看看: