当前位置 : 主页 > 编程语言 > java >

将对象从JSP页面传递回Servlet

来源:互联网 收集:自由互联 发布时间:2021-06-25
总之,我想知道如何将一个对象从JSP页面传回到一个Servlet。具体来说,我有一个表单元素,其操作标签引用了一个servlet。在表单提交时,我想在HttpServletRequest请求对象中嵌入一个对象
总之,我想知道如何将一个对象从JSP页面传回到一个Servlet。具体来说,我有一个表单元素,其操作标签引用了一个servlet。在表单提交时,我想在HttpServletRequest请求对象中嵌入一个对象,以便可以通过servlet解除引用。

到目前为止,我已经尝试在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

网友评论