在Servlet3.0neneneba API中继续或挂起并继续,以便与客户端进行通信



我们正在将Swing两层应用程序迁移到web应用程序(tomcat、Spring MVC、extJS,如果有什么不同的话)。

我们在应用程序中发现了这样的代码(简化的Javaesc伪代码)。

class DoSomethingComplicatedAction extends Action{
    public performAction(..){
        // do lots of stuff here
        // decend about 40 steps in the call stack
        answer = JOptionPane.showConfirmDialog()
        if (answer == something){
            // do something convoluted here
        } else {
            // do something even more convoluted here
        }
}

即在一些处理的中间开始与用户的一些交互。显然,我不能用servlet直接做到这一点。

有一件事可以很好地处理这个问题,那就是延续。所以我检查了一下我是否可以使用这些,并惊讶地发现实际上有一些库可以实现这类功能:Java 中的Continuations

在检查该问题中提到的库及其答案时,我偶然发现了以下语句

续篇将被标准Servlet 3.0可暂停取代一旦规范最终确定,请求。的早期版本Jetty-7现在可用于实施拟议标准暂停/恢复API

但是我找不到一个例子来说明如何用Servlet3.0neneneba API 做上面的事情

所以问题是:

  1. 是否可以在不完全使用Servlet-3.0 API的情况下完成上述操作将上面绘制的代码重构为两个或多个单独的代码行动

  2. 如果以上问题的答案是肯定的:如何?是否有一些完整的例子或类似的用例可用?

  3. 我应该使用Continuations还是Servlet API?或者,如果不能直接回答这个问题,这个决定取决于什么条件?

jetty提出的延续api是当时克服servlet api限制的主要解决方案。(一个请求,一个线程)

现在,您应该只使用Servlet 3.0。

请注意,在您的情况下,您甚至可能不需要做任何特别的事情,因为Actions是重新激活的,您可以使用通常的ajax方式。

我正在添加一些相关链接:

  1. Ajax,反向Ajax
  2. 异步与同步servlet
  3. Jetty 8.0及其续篇

我认为将Swing应用程序移植到web应用程序的更合理的方法是使用GWT。这不仅可以让你按照自己的要求去做,而且还可以提供更快的UI,因为客户端会有更多的处理(即没有到服务器的往返)。

此外,您还可以重用许多现有的客户端代码,因为GWT几乎是标准Java(有一些限制)。

相关内容