【问题标题】:Understanding the request lifecycle of a Play! application了解 Play 的请求生命周期!应用
【发布时间】:2013-02-08 00:49:28
【问题描述】:

我是 Play 新手! web 框架,为了了解它是如何工作的,以及它与其他 web 框架的比较,我希望能够在 Play!源代码,从开始到结束的请求生命周期。我将使用 Play! 的 Scala 实现。

因为我的大部分经验都是使用 PHP 框架,所以我习惯于从 web 根目录中的 index.php 文件开始,然后向下阅读任何包含的配置/引导脚本、依赖注入处理、请求路由、动作调度,最后是视图/响应渲染。

我无法确定 Scala/Play 的类似入口点!应用程序,我非常感谢朝着正确的方向前进。请求生命周期的演练当然会非常慷慨,但我真正需要的只是显示入口点。

【问题讨论】:

    标签: scala playframework playframework-2.0 bootstrapping


    【解决方案1】:

    默认情况下,Play 框架使用内置的 HTTP 服务器(基于Netty)。因此,与 PHP 最接近的类比是 Play 既是 Apache 又是 PHP。

    PHP 使用传统的“类 CGI”范例:为了服务单个 HTTP 请求,您的程序会启动,并在完成服务请求后终止。在 CGI 中为 HTTP 请求提供服务,网络服务器启动外部程序——您的脚本——并返回其输出。旧版本的 PHP 只是为 CGI 设计的,在后来的版本中,其他方式与服务器交互,因为 CGI 很慢,但核心原理保持不变。

    大多数 Web 应用程序技术使用另一种方法:您的 Web 应用程序启动一次然后保持运行,因此一个正在运行的 Web 应用程序实例继续为请求提供服务(并且可以并行处理多个请求)。它不会像在 PHP 中那样在服务一个请求后死掉。这允许每次启动应用程序所需的资源消耗更少,并且使用起来稍微困难一些,因为大多数请求处理隐藏在框架内部,并且您的应用程序只需要公开请求到达和返回时调用的控制器方法回应。

    它还提供了更大的灵活性,例如后台处理可以直接在 Web 应用程序内启动,无需外部服务器进程。 Play 有非常方便的 Akka 库。

    随着越来越多的 Web 应用程序使用 Ajax 和 REST 方法,而不是每次都提供重量级网页,它变得更加重要。而且几乎不可能使用 PHP 创建具有良好性能的实时消息传递后端,无论请求技术如何(轮询、长轮询、多部分 iframe)。

    但是如果与 PHP MVC 框架相比,从创建视图、模型和控制器的开发人员的角度来看,Play 非常相似。在 PHP MVC 框架和 Play 框架中调用控制器方法或函数并且该方法应该返回响应,视图通常是模板,模型通常是 ORM 绑定到关系数据库。

    【讨论】:

      【解决方案2】:

      我想这就是你的意思:

      https://github.com/playframework/playframework/blob/master/framework/src/play-netty-server/src/main/scala/play/core/server/NettyServer.scala

      Play 是一个 Java 应用程序,它在给定端口开始侦听。侦听是使用 Netty 库完成的,该库了解不同类型的网络协议(最重要的是 HTTP)。一旦 Netty 知道发生了什么,它将控制 Play 框架。

      Play 框架随后将结合使用全局文件和路由来确定要调用的操作。

      【讨论】:

      【解决方案3】:

      Play 更像是一个安静的框架(阅读http://en.wikipedia.org/wiki/Representational_state_transfer),而不是典型的基于模板的框架,如带有请求生命周期概念的 jsp jsf 等,尽管它也支持模板。基本思想也是基于json等纯数据与服务器进行交互,并且大部分用于更新dom结构的代码都是用javascript编写的,并且只在客户端完成,这实际上更灵活,更简单有效。

      在游戏中,您只需在 scala 类中定义一个方法并将其映射到 routes 文件中,即可轻松地创建用于向浏览器发送数据的方法。就像在典型的 Web 开发过程中一样,您还将 html 文件放在公共资源文件夹(或创建模板)中,这通常会在浏览器中执行时对该方法进行 ajax 调用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-12-27
        • 1970-01-01
        • 2011-06-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-01-03
        • 1970-01-01
        相关资源
        最近更新 更多