【问题标题】:Struts2 + jQuery - Sending regular updates to the clientStruts2 + jQuery - 向客户端发送定期更新
【发布时间】:2009-09-13 05:01:25
【问题描述】:

我正在我的网络应用程序中实现一项功能,以便客户端可以通过输入一些数据并单击提交按钮来生成报告。

问题是报告生成需要很长时间,如果用户输入的数据错误,报告可能不会生成。

完整的报告生成任务有许多子任务,我想当客户按下提交时,然后在该页面下方我想显示报告生成任务的状态/进度,这些任务分为各种子任务,例如

- Validating input data ------ Done
- Fetching the data     ------ In Progress
 and so on,

如何在 web 层使用 Struts2、jQuery 实现这一点?

任何帮助将不胜感激。

谢谢

【问题讨论】:

  • 有人对上述内容有想法吗?

标签: java jquery struts2 java-ee-5


【解决方案1】:

我们遇到了类似的问题。交易通常需要 20 秒,有时超过一分钟。我们认为会有更简单的解决方案,但我们最终得到了这样的方案,

  1. 当接收到长时间运行的请求时,会创建一个会话并生成一个新线程来处理该请求。
  2. 立即返回带有文本的页面以显示“正在收集数据...”。该页面包含一个每秒刷新一次的计时器。重新加载 URL 在查询参数中包含会话 ID(我们不使用 HttpSession)。
  3. 当操作处理程序看到带有会话 ID 的请求时,它知道会话已启动,检查工作线程正在更新的状态变量。如果没有完成,它会使用新状态“从 DB1 检索数据...”来更新页面。重新加载时会闪烁。如果您关心,您可以使用 AJAX 来更新状态。
  4. 当工作线程完成并且页面准备好交付时,调用只是返回结果。

我们遇到了负载平衡器的一些问题。为了使该方案起作用,每次重新加载都必须返回到同一台服务器。幸运的是,负载均衡器支持基于我们的会话 ID 的粘性路由。

【讨论】:

  • 感谢 ZZ Coder.. 但我有一个疑问 - 在上面的 3 中,当操作中有 sessionId 时,如何查询状态变量?
  • 创建会话时,您必须将会话对象保存在地图中的某处。您可以使用 servletContext.setAttribute(sid, obj)。在第 3 步中,只需执行 servletContext.getAttribute(sid) 即可检索包含状态的会话对象。
【解决方案2】:

看看 Struts2 ExecuteAndWait 拦截器。 http://struts.apache.org/2.x/docs/execute-and-wait-interceptor.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-09
    • 2019-09-10
    相关资源
    最近更新 更多