我的网络用户界面上有2个提交按钮。
当按下第一个提交按钮时,控制进入servlet,发生后端操作,并且EmployeeInfo类(setter-getter类)设置了一些字段(成员变量)。
控件返回UI,然后按第二个提交按钮。
现在在同一个servlet中,我可以获得EmployeeInfo的相同对象,其字段具有相同的值吗?除了使用会话对象。
答案 0 :(得分:2)
HTTP是 无状态协议 ,因此您需要在服务器端共享的任何信息必须以某种形式持久化。
一种选择是将其存储在Session
中HttpSession session = request.getSession(true);
这是您查找与请求相关的会话的方式。
使用getter / setter对获取和设置您希望保留的属性
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表单中。