【问题标题】:Communication servlet to jsp without client request在没有客户端请求的情况下与 jsp 通信 servlet
【发布时间】:2015-03-05 22:21:40
【问题描述】:

我正在做一个项目,我们使用 Tomcat 8 作为应用服务器,因此使用 JSP 和 Servlet。每个 JSP 都显示一种项目列表。应用程序的用户可以模拟一个项目。这意味着什么并不重要。当用户点击“模拟”按钮时,将执行以下过程:

  1. 将通过 Ajax (javascript) 执行一个 servlet,生成一个 zip 文件并将该文件存储在服务器的硬盘上
  2. 将在数据库中为各个项目设置一个“模拟”标志
  3. 外部 java 程序(在后端)监听“模拟”标志,如果设置了项目标志,外部程序会抓取 Web 应用程序存储的 zip 文件
  4. 然后外部 java 程序运行该项目的模拟。
  5. 模拟完成后,外部java程序在服务器硬盘上存储一个新的zip文件,在数据库中设置一个'嘿,我准备好了'-标志并调用Web应用程序的servlet
  6. 此 servlet 将新 zip 文件中的数据信息保存到数据库中
  7. 完成

所以我的问题是:通知 JSP 模拟已完成的最佳方式是什么? JSP 仍然显示该项目处于模拟过程中。我目前的想法如下:

我可以定期向服务器发送一个 Ajax 请求,以检查数据库中是否有“嘿,我准备好了”标志,如果已设置,我可以在 JSP 上显示结果。但我感觉有更聪明的解决方案。

也许我可以使用最后一个 servlet 调用(参见第 5 点)以某种方式通知 JSP 模拟已完成?问题是这个 servlet 不是由客户端调用,而是由外部 java 程序调用。

你有什么建议吗?或者有什么我应该阅读的技术?

谢谢。

【问题讨论】:

    标签: java jsp tomcat servlets


    【解决方案1】:

    使用异步 ajax 调用意味着该函数将在 servlet 完成它的工作并返回一些 HTTP 代码时返回(200 表示成功)。

    所以这个例子:

    $.ajax({
                        url: Config.serverUrl+'/simulationServlet',
                        type: 'GET',
    
                        success: function(result) {
                               $('#infoBox').text("simulation is over");
                           }
                    });
    

    将显示模拟完成。

    【讨论】:

    • 感谢您的回复。但问题是我有两个 servlet 调用。第一个在第 2 步。第二个和第 5 步。第一个 servlet 由使用 Web 应用程序的客户端调用。第一个 servlet 只是在数据库中设置一个标志并向客户端返回“成功”。但是第二个 servlet 由外部 java 程序(驻留在服务器上)调用。我必须以某种方式知道第二个 servlet 何时完成。
    • 这应该是一个链式调用,因为应用程序逻辑不正常。这样想。既然你想完成一项工作,你需要点击一个 servlet 并让它做它想做的任何事情,并在工作完成时返回。例如,我们称它为 Facade。 servlet 可以调用其他 servlet 等。您可以使用另一种编程模式发布/订阅,但您需要设置很多东西才能将通知推送到客户端应用程序。
    猜你喜欢
    • 1970-01-01
    • 2014-05-11
    • 1970-01-01
    • 2017-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-15
    • 2013-11-19
    相关资源
    最近更新 更多