有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

带用户输入的Javaservlet?

好的,用户在JSP上输入一些信息,然后单击“提交”,这将启动一个servlet。然后,这个servlet处理信息并发回另一个JSP。那很好

但是,如果servlet需要在继续处理之前向用户提问,该怎么办?在通用Java应用程序中,可以使用JOptionPane之类的工具

作为一个非常简单的例子。。。。假设有一个姓名和年龄的列表: 姓名{鲍勃:21,弗雷德:19,约翰:20}

并要求用户再输入4个: 哈利:25,约翰:17,珀西:54,加里:12

servlet获取输入的名称,然后尝试将它们添加到“名称”列表中。然而,当它到达“约翰:17”时,它发现“约翰”已经在那里了。我们想问用户:

“您想跳过或替换John吗?”

如果他们跳过,我们将转到percy,列表如下: 姓名{bob:21,fred:19,john:20,harry:25,percy:54,gary:12}

如果他们选择替换,我们将: 姓名{鲍勃:21,弗雷德:19,约翰:17,哈利:25,珀西:54,加里:12}

您将如何获得用户输入?是将所有逻辑转换为JavaScript或其他内容的唯一方法吗


共 (3) 个答案

  1. # 1 楼答案

    servlet被固定在HTTP请求/响应协议上。当用户的浏览器发送请求时,在收到服务器的响应之前,它无法执行任何操作。这意味着服务器无法在请求中途获得用户输入

    添加Javascript以验证输入不会与现有列表数据重复是防止此问题的一种方法。您还可以在servlet上添加一些逻辑,以及从输入中添加姓名/年龄组合,只要它们不存在,并在响应中显示所有现有组合的错误

    此外,Ajax通常用于绕过在用户浏览器中执行完整请求/响应的需要。因为它是HTTP,所以它仍然需要发送请求并等待响应,但它在后台执行此操作,而无需重新加载整个页面。它更复杂,但可以使用户体验更具交互性

  2. # 2 楼答案

    只需将其显示为消息并再次填充相同的表单即可

    要显示消息,基本上只需将其设置为请求属性:

    request.setAttribute("message", message);
    

    并转发回相同的JSP页面,在该页面中以EL显示,如下所示:

    ${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{}而不是普通EL来防止站点XSS attacks作为示例,尝试用"><script>alert('XSS')</script><b>XSS</b a="填充<input name="foo" value="${param.foo}">(包括引号)

    您也可以使用Javascript来改善用户体验(更快的响应和无内容闪现),但这不会覆盖整个万维网,您也不应该依赖它,因为它可能被禁用/黑客攻击/欺骗。只需使用它和只使用即可获得更好的用户体验。也就是说,使用它unobtrusively并保持服务器端代码的健壮性,以便在JS缺失或失败的情况下仍能工作

  3. # 3 楼答案

    是的,您必须通过JavaScript执行此操作,或者让servlet/jsp看到问题,然后将页面发送回询问问题的用户,当用户提交该页面时,然后处理列表