Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在两个HttpRequest之间共享java对象_Java_Servlets - Fatal编程技术网

在两个HttpRequest之间共享java对象

在两个HttpRequest之间共享java对象,java,servlets,Java,Servlets,我的web UI上有2个提交按钮 当按下第一个submit按钮时,控件转到servlet,后端操作发生,EmployeeInfo类(setter-getter类)得到它的一些字段(成员变量)集 控件返回UI,我按下第二个提交按钮 现在,在同一个servlet中,我可以获得EmployeeInfo的同一个对象,其字段具有相同的值吗?除了使用session对象之外。最简单(可能也是最正确)的方法是将它保留在会话中,直到它完全构建 您也可以将其存储在数据库中,但这样就需要在保存之前不必完全构造对象。但

我的web UI上有2个提交按钮

当按下第一个submit按钮时,控件转到servlet,后端操作发生,EmployeeInfo类(setter-getter类)得到它的一些字段(成员变量)集

控件返回UI,我按下第二个提交按钮

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

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

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

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

一种选择是将其存储在

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

使用getter/setter对获取和设置要持久化的属性

在第一个请求之后将对象存储到

EmployeeInfo info = ..
// ...
request.getSession().setAttribute("EMPLOYEE_INFO", info); // store object to http session
在第二次请求时从
HttpSession
获取对象

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

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

有两种方法可用于您的情况:使用有状态服务器或无状态服务器(REST):

有状态服务器

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

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

无状态服务器(REST)

如果要避免在服务器上保留状态,只需在客户端上执行,并在每次请求时将所有需要的状态传输到服务器

这种方法也称为REST(代表性状态转移)。这有一个Java标准:


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

您不能将对象存储到会话中并重新使用它吗?那么您希望得到什么样的答案呢?”“是或否”回答?是的。通过
HTTPSession
的魔力,您无法从请求中获取对象。您必须将对象中的每个字段设置为隐藏字段,然后在第二次提交时,您将从请求对象中以字符串形式获取所有这些字段。使用这些值,您必须构造一个新对象。
EmployeeInfo info = ..
// ...
request.getSession().setAttribute("EMPLOYEE_INFO", info); // store object to http session
EmployeeInfo info = (EmployeeInfo)request.getSession().getAttribute("EMPLOYEE_INFO");