好的,所以用户在JSP上输入一些信息并点击“submit”来启动servlet。然后,此servlet处理信息并发回另一个JSP。这很好。
然而,如果servlet需要在继续处理之前询问用户问题呢?在一般的Java应用程序中,您可以使用JOptionPane之类的东西。
作为一个非常简单的例子....说有一个名单和年龄列表: 姓名{bob:21,fred:19,john:20}
要求用户再输入4个: 哈利:25,约翰:17,珀西:54,加里:12
servlet获取名称输入,然后尝试将它们添加到列表“名称”中。然而当它到达'john:17'时,它发现'john'已经存在了。我们想问用户:
“你想跳过或替换约翰吗?”
然后,如果他们跳过,我们转向percy,列表是: 姓名{bob:21,fred:19,john:20,harry:25,percy:54,gary:12}
如果他们选择替换,我们将: 姓名{bob:21,fred:19,john:17,harry:25,percy:54,gary:12}
您如何获得该用户输入?将所有逻辑转换为JavaScript或其他东西的唯一方法是什么?
答案 0 :(得分:4)
只需将其显示为消息并再次重新填充相同的表单。
要显示消息,基本上只需将其设置为请求属性:
request.setAttribute("message", message);
并转发回您在EL中显示它的同一JSP页面,如下所示:
${message}
可以通过将请求参数显示为输入值来重新填充表单:
<input name="foo" value="<c:out value="${param.foo}" />">
<input name="bar" value="<c:out value="${param.bar}" />">
<input name="waa" value="<c:out value="${param.waa}" />">
那应该是它。在这里,我使用JSTL c:out
代替普通EL来阻止您的网站XSS attacks - 例如,尝试使用<input name="foo" value="${param.foo}">
填充"><script>alert('XSS')</script><b>XSS</b a="
(包括引号) )。
您也可以使用Javascript来改善用户体验(更快的响应速度和没有闪存的内容),但这不会覆盖整个万维网,您也不应该依赖它,因为它可以被禁用/黑客攻击/欺骗。只需使用它,只需 即可获得更好的用户体验。即使用它unobtrusively并保持服务器端代码的健壮性,以便在JS缺失或失败的情况下仍能正常工作。
答案 1 :(得分:2)
Servlet坚持使用HTTP请求/响应协议。当用户的浏览器发送请求时,在从服务器获得响应之前,它无法执行任何操作。这意味着服务器无法在请求中途获得用户输入。
添加Javascript以验证输入不会复制现有列表数据是防止此问题的一种方法。您还可以在servlet上添加一些逻辑 - 只要它们不存在就从输入中添加名称/年龄组合,并在响应中显示所有现有组合的错误。
此外,Ajax通常用于解决在用户浏览器中执行完整请求/响应的需要。因为它是HTTP,它仍然需要发送请求并等待响应,但它在后台执行此操作,而无需重新加载整个页面。它更复杂,但可以使用户体验更具互动性。
答案 2 :(得分:1)
是的,您要么必须通过JavaScript执行此操作,要么让servlet / jsp看到问题,然后将页面发回给用户询问问题以及何时提交该页面然后处理列表...