在初始 GET 请求上自动生成一个唯一值,您将其存储并在每个后续回发中作为隐藏输入值传递。使用此唯一值作为表示视图范围数据的会话属性的标识符。
在全新会话的第一个请求期间,执行以下操作:
Map<String, ViewData> viewScope = new HashMap<String, ViewData>();
session.setAttribute("viewScope", viewScope);
(the ViewData
表示您想要在同一视图上的回发中跟踪的特定于视图的数据)
在每个 GET 请求期间,执行以下操作:
String viewDataId = UUID.randomUUID().toString();
viewScope.put(viewDataId, new ViewData());
request.setAttribute("viewDataId", viewDataId);
在生成 HTML 期间,执行以下操作:
<input type="hidden" name="viewDataId" value="${viewDataId}" />
在每个 POST 请求期间,执行以下操作:
ViewData viewData = viewScope.get(request.getParameter("viewDataId"));
// Get/set view-specific data in there.
确保 jQuery 也传递这个隐藏的输入(如果你已经正确使用的话,这不应该是一个大问题$(form).serialize()
或例如用于 ajax 表单的 AjaxForm 插件)。
如果您熟悉 Java EE 的 MVC 框架JSF https://stackoverflow.com/tags/jsf/info,那么知道它的@ViewScoped
注释的工作原理与上面描述的大致相同。另请参见 a.o.如何选择合适的bean范围? https://stackoverflow.com/questions/7031885/how-to-choose-the-right-bean-scope