我的 Web UI 上有 2 个提交按钮。
当第一个提交按钮被按下时,控制权转到一个 servlet,后端操作发生,一个 EmployeeInfo 类(setter-getter 类)获取它的一些字段(成员变量)集。
控件返回 UI,我按下第二个提交按钮。
现在在同一个 servlet 中,我可以得到相同的 EmployeeInfo 对象,其字段具有相同的值吗?除了使用会话对象。
HTTP 是一种无状态协议,因此您需要在服务器端共享的任何信息都必须以某种形式保存。
一种选择是将其存储在Session
HttpSession session = request.getSession(true);
这是您查找与请求相关的会话的方式。
使用 getter/setter 对来获取和设置您希望保留的属性
session.setAttribute("name",value);
最简单(也可能是最正确)的方法是将它保留在会话中,直到它完全构建。
您也可以将它存储在数据库中,但是它要求在保存之前不需要完全构造对象。但我可以想象在某些极端情况下这将是一个合适的解决方案。
一种选择是将其存储在会话对象中。在这种情况下,您必须在使用完成后将其从会话中删除。如果您不想使用会话,则在 UI 中设置与对象中的字段相对应的隐藏字段。然后在第二次提交,通过读取请求参数将这些值返回到您的对象中。
第一次请求后将对象存储到HttpSession
EmployeeInfo info = ..
// ...
request.getSession().setAttribute("EMPLOYEE_INFO", info); // store object to http session
HttpSession
在第二个请求中获取对象
EmployeeInfo info = (EmployeeInfo)request.getSession().getAttribute("EMPLOYEE_INFO");
针对您的情况有两种方法:有状态服务器或无状态服务器 (REST):
有状态服务器
如果您可以在服务器上拥有客户端状态,则应该使用 aHttpSession
来存储中间结果(有关详细信息,请参阅其他答案)。请注意,如果用户复制他的浏览器选项卡,您可能会遇到麻烦,因为这两个选项卡将在服务器上共享相同的会话。
但是正如您所写的那样,您不想使用会话对象,请考虑一下:
无状态服务器 (REST)
如果您想避免在服务器上保持状态,只需在客户端上执行此操作,并在每次请求时将所有需要的状态传输到服务器。
这种方法也称为REST(具象状态转移)。有一个 Java 标准:JAX-RS。
但是您不会被迫使用该 API。如果您有一个 HTML 客户端,您可以简单地将所有数据存储在隐藏字段中,以便在提交时将其传输到服务器。因此,您需要一些服务器端脚本(eh JSP)来将隐藏字段生成到第二个 HTML 表单中。