在两个Http请求之间共享一个java对象

时间:2013-11-14 07:12:44

标签: java servlets

我的网络用户界面上有2个提交按钮。

当按下第一个提交按钮时,控制进入servlet,发生后端操作,并且EmployeeInfo类(setter-getter类)设置了一些字段(成员变量)。

控件返回UI,然后按第二个提交按钮。

现在在同一个servlet中,我可以获得EmployeeInfo的相同对象,其字段具有相同的值吗?除了使用会话对象。

5 个答案:

答案 0 :(得分:2)

HTTP是 无状态协议 ,因此您需要在服务器端共享的任何信息必须以某种形式持久化

一种选择是将其存储在Session

HttpSession session = request.getSession(true);

这是您查找与请求相关的会话的方式。

使用getter / setter对获取和设置您希望保留的属性

HttpSession#setAttribute()

session.setAttribute("name",value);

答案 1 :(得分:0)

最简单(也可能是最正确)的方法是将其保留在会话中,直到它完全构建完毕。

您也可以将其存储在数据库中,但之后需要在保存之前不需要完全构造对象。但我可以想象有一些边缘情况,这将是一个合适的解决方案。

答案 2 :(得分:0)

首次请求后将对象存储到HttpSession

EmployeeInfo info = ..
// ...
request.getSession().setAttribute("EMPLOYEE_INFO", info); // store object to http session

在第二次请求时从HttpSession获取对象

EmployeeInfo info = (EmployeeInfo)request.getSession().getAttribute("EMPLOYEE_INFO"); 

答案 3 :(得分:0)

一种选择是将它存储在会话对象中。在这种情况下,一旦使用完成,你必须将它从会话中删除。如果你不想使用会话,那么在UI中设置对应于对象中字段的隐藏字段然后在第二次提交时,通过读取请求参数将这些值返回到您的对象中。

答案 4 :(得分:0)

您的情况有两种方法:有有状态服务器无状态服务器(REST)

有状态服务器

如果您在服务器上拥有客户端状态,则应使用HttpSession来存储中间结果(有关详细信息,请参阅其他答案)。请注意,如果用户复制了他的浏览器选项卡,您可能会遇到麻烦,因为两个选项卡将在服务器上共享同一会话。

但正如您所写,您不想使用会话对象,请考虑以下事项:

无状态服务器(REST)

如果您想避免在服务器上保持状态,只需在客户端上执行该操作,并在每次请求时将所有需要状态转移到服务器。

此方法也称为 REST (Representational State Transfer)。有一个Java标准:JAX-RS

但您不会被迫使用该API。如果您有一个HTML客户端,您可以简单地将所有数据存储在隐藏字段中,以便在提交时将其传输到服务器。因此,您需要一些服务器端脚本(e.h.JSP)来将隐藏字段生成到第二个HTML表单中。