【问题标题】:How to write web applications using Ceylon?如何使用 Ceylon 编写 Web 应用程序?
【发布时间】:2013-12-01 11:14:54
【问题描述】:

Ceylon 发布 1.0 最近引起了我的注意。最有趣的特性是它可以为 JVM 和 Javascript 引擎(node.js、浏览器)编译,因此它使得从一开始就可以在服务器后端和在浏览器中运行的 Web 应用程序之间共享代码。

我已经开始查找文档以了解如何使用 Ceylon 创建可部署 WAR 的应用程序的详细信息,其中我有一些 REST 端点为浏览器端提供服务。尽管这将是我的最终目标,但我并没有期待 Spring WebMVC 支持。令我惊讶的是,我在这个主题中没有发现任何有用的东西。当我尝试按照我所描述的方式定位像 Jetty 或 Tomcat 这样的 Servlet 引擎时,有什么建议如何使用 Ceylon?

现在我在 Java 应用程序中执行以下操作:

  • 创建一个 Maven webapp 项目
  • 将 JQuery Javascript 客户端代码和其他静态内容放到 src/main/webapp 中
  • 编写一些 Spring MVC 控制器来服务器 JSON 资源

如果客户端代码也从 Ceylon 代码转置,类似的事情也会很棒。正如我所见,Ceylon 使用它自己的项目布局和构建系统,尽管我更愿意使用 Maven 或 Gradle 来避免过多地偏离现有项目。

【问题讨论】:

    标签: rest servlets web-applications browser ceylon


    【解决方案1】:

    现在该语言及其编译器已经发布到 1.0,我们可以将部分注意力转移到 Web 框架之类的开发上。目前,Ceylon 还没有一个完整的 Web 框架。

    它所拥有的是:

    1. 一个基于 JBoss Undertow 的简单 HTTP 服务器,作为模块 ceylon.net 的一部分。这使得创建一个小型 Web 服务器真的变得很容易,尤其是结合 ceylon.html 来呈现 HTML 页面。
    2. Julien Viet 的 vert.x bridgepromises module,它们为 vert.x 提供了一个包装器。
    3. 用于红帽 OpenShift 的卡式磁带,可让您在红帽云上部署 Ceylon Web 应用程序。

    我知道这不是您如何在传统 servlet 引擎上运行 Ceylon 的完整解决方案。事实上,您实际上可以获取已编译的 Ceylon 模块存档,将其嵌入到 .war 中,然后在 Tomcat、Jetty 或 JBoss 或其他任何东西中使用它。毕竟,.car 只是带​​有一些额外元数据的.jar。这样做的问题是,您将失去使用 ceylon run 时通常拥有的 Ceylon 模块运行时的优势。您需要:

    • 手动确保您的模块使用的所有依赖项都在.war 中可用,并且
    • 您不会获得类加载器隔离。

    如果你能忍受,那就去吧。它会起作用的。但在我看来,我们的愿景是摆脱遗留的 servlet 引擎,在模块运行时之上运行诸如 Undertow (ceylon.net) 或 vert.x 之类的东西。请记住,我们所说的这个“模块运行时”无论如何只是 JBoss 模块,JBoss 本身的微小核心。

    【讨论】:

    • 谢谢,这回答了我的大部分问题!我想那么与 Spring 框架的互操作性也不是一个选项。
    • 不太清楚你所说的“不是一个选项”是什么意思。这当然是可能的。但我需要更多地了解你想用它做什么
    • 至少我喜欢有Ceylon的Spring的依赖注入容器机制。因为您将使用不同于 Spring MVC 所基于的 HTTP 服务器模型,所以我想将 Spring Controller 与 Ceylon 一起使用是没有意义的。
    • 我没有立即看到您不能将 Spring 容器与 Ceylon 一起使用的任何原因。 OTOH,我还没有真正尝试过,所以肯定会有我不知道的问题。
    【解决方案2】:

    【讨论】:

    • 谢谢!我会检查这些。
    • 这与 Dart 选择的道路相同:从零开始实现 HTTP 服务器。虽然 Dart 没有任何其他选择,因为它是一个新环境,但我不明白为什么在 Celyon 的情况下这很好?我的意思是它不是与 JVM 运行时兼容的 Ceylon 最大的专业人士之一吗?为什么我不能重用 Java 中已有的东西?即使考虑到异步操作,也有 vertx.io 来解决这个问题。
    【解决方案3】:

    我意识到这是一个老问题,但我只是在寻找同样的问题,差不多 2 年后,似乎有人正在建造一个(称为 Cayla):

    https://github.com/vietj/ceylon-cayla

    【讨论】: