我正在寻找更好的逻辑来保存用户输入的表单值,因为用户通过单击提交按钮意外地遍历到nextpage。当他点击后退按钮时,值应该存在。请让我知道你的想法
答案 0 :(得分:1)
您也可以将其存储在会话中,但这在服务器端将是性能密集型的。 如果您有几个字段(比如说每个用户2 Kb)那么这可以工作,特别是如果您的表单分成超过3页左右,这将非常有用。
还要记住,在最后一页提交表单后,会话中的对象到期。
答案 1 :(得分:1)
查看有关REST的文章,这是整个网站所基于的架构风格。通过遵循有关客户端状态存储的这些指导原则,您可以让Web应用程序在发生意外情况时向用户显示正确的信息。 http://www.xfront.com/REST-Web-Services.html。您基本上希望存储在客户端上的整个上下文(在cookie中,或保存在当前页面中并使用POST传输回服务器),而不是利用服务器上的任何上下文。在这样做时,客户端可以使用其本地上下文在进程中的当前“位置”引导进程,即使服务器没有存储的上下文。
答案 2 :(得分:0)
您可以使用Javascript进行操作,只需在用户退出页面时将值保存到cookie,并在用户返回时加载它们。
答案 3 :(得分:0)
如果您使用POST
提交表单并使用浏览器返回按钮返回此页面,则您依赖于HTTP响应缓存设置,浏览器缓存设置和浏览器默认行为,它会重新生成输入值。默认情况下,大多数都会重新生成值,但您不希望依赖于客户端行为。如果禁用缓存,那么例如IE仍将重新生成值,但FF不会。此外,如果从服务器端强制禁用缓存,则客户端可能会面临侵入性和特定于浏览器的“您确定要重新发送数据吗?”确认对话。
您最好的选择是将提交的数据存储在会话范围 ,并在{{1>} 的表单旁边Back
旁边提供Submit
按钮}或Next
按钮。这样,最终用户可以更直观地导航回来。
在将请求转发到下一页之前,您可以使用HttpSession#setAttribute()
将提交的数据存储在会话范围中:
HttpSession session = request.getSession();
session.setAttribute("data", data);
在后续页面中,您当然可以通过HttpSession#getAttribute()
将其取回,以便您可以添加/修改后续步骤的新值。
Data data = (Data) session.setAttribute("data");
在页面中,您可以使用EL通常的方式在输入字段的value
属性中重新显示提交的数据:
<input type="text" name="foo" value="${data.foo}">
但是,自己提供Back
按钮并不会阻止用户单击浏览器自己的后退按钮或按 Backspace 。你不能对此做很多事情。您最好的选择是严格禁用页面缓存,以便客户端获得“您确定要重新发送数据吗?”警告。您可以通过将以下标头添加到相关页面的响应中来强制禁用服务器端的客户端缓存:
response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1.
response.setHeader("Pragma", "no-cache"); // HTTP 1.0.
response.setDateHeader("Expires", 0); // Proxies.