给Java开发人员的Play Framework(幸运飞艇平台出租)介绍 Play的优缺点以及适用

这篇系列会首先结合幸运飞艇平台出租QQ2952777280【话仙源码论坛】hxforum.com【木瓜源码论坛】papayabbs.com,实际代码介绍Play的特点以及适用场景。然后会有几篇文章介绍Play与Spring,JPA(Hibernate)的集成,以及一些Play应用的最佳实践。 这期间会在Github上提供一个脚手架项目。方便感兴趣的朋友直接动手尝试。

最后会简单分析Play的部分源码。帮助大家理解黑盒子的内部机制。

我水平有限,有错误欢迎指出。

  1. Play介绍
    Play Framework是一个开源的Web框架。背后商业公司是Typesafe。

要介绍Play之前。首先理清Play的两个不同的分支。 Play 1.x 使用Java开发。最新版本号是1.3.1,仅仅支持Java项目。

从11年開始就进入了维护阶段,新项目一般不考虑使用Play1。

Play 2.x 使用Scala和Java开发。同一时候支持Java和Scala项目。 这里主要介绍最新的Play2.4 for Java。有一点须要提前说明,尽管Play2主要由Scala开发,可是对于项目中的一般开发者而言, 使用Play能够全然不懂Scala。详细情况后面会说明。

  1. 为什么要了解Play
    如今的Web框架或者类库能够说是浩如烟海。近十年来,在Web开发领域,JVM阵营的占有率一直不高。 数据来源(http:// hotframeworks.com/#rankings)
    这是国外开源项目的数据,相对来说国内Java框架的使用率会高一些。而近期几年,Ruby和Python在国内的开发群体也在不断壮大。

Java框架在Web领域不那么受欢迎,主要原因在于开发速度远落后于其它的开发框架。对于初创公司而言,高速开发出产品投入市场试错比花半年打磨出一款功能性能齐备的 应用更加重要,而对于成熟产品,也须要高速响应频繁的需求变化,这方面动态语言又更胜一筹。所以说到Web后端框架的技术选型,除非技术团队有比較深的JVM背景。 否则会倾向于选择RoR,Django这些框架。

JVM阵营在Web领域逐渐落后主要有三个原因:编译的锅,技术栈的锅和语言的锅。

大家都知道Java源码须要编译之后才干执行,直接结果是每次改动源码都须要重新启动Webserver才干看到效果。

假设项目比較小类也少,重新启动时间还勉强能接受。

我曾经參与的一个项目,使用的是WebLogicserver。Spring容器里大概有上千个Bean,重新启动一次至少得花5分钟。还是优化后的结果。工作时间至少有20%花在重新启动上了。 尽管如今有JRebel之类的热载入技术,可是国内使用的相对较少。

Servlet规范在1997年出现,在当时能够说是非常先进的技术。加上Tomcat的横空出世。直接促成了JSP的崛起。然而时过境迁,Servlet风光不再。 Web容器存在的必要性也被越来越多的人质疑。

原因就在于人为的将应用与容器剥离, 尽管这样的做法本意是好的,可是结果就是给开发測试部署带来一系列集成的问题,如今越来越多的项目開始使用内嵌的Jetty或Tomcat就是一个现实的样例。 Servlet还带来一个问题,就是有状态的server。一旦使用了Session,server就无法享受到水平扩展的长处了。由此不得不採用Session复制或者粘性Session(Sticky Session)的 方案来解决问题,不管採取哪种方案都会有性能损耗。而且推高了技术成本。

Servlet说究竟是Java EE家族的一员。由于Sun的领导(Oracle背锅), 从Java EE 5開始。Java EE的角色已经从技术创新者转换为尾随者,这些年基本上能够说是跟着开源社区的步子在走的。除了政府大单和跨国企业,你非常难再看见它的身影了。

至于语言。事实上从JDK8開始,Java已经非常好用了。

只是从JDK5到JDK8。十年太长。尤其是在Web。

之前Java阵营受累于没有成熟的高速开发框架。Spring热衷于提供各种集成方案,可是配置和使用还是相当的麻烦,直到Spring Boot的出现才有改善。 只是近几年出现了一些相当优秀的框架,如Dropwizard,Play。Vert.x。 这篇系列要介绍的Play,通过ClassLoader在源码改动的时候动态载入类,攻克了改动代码须要重新启动server的问题,全然抛弃了Servlet技术栈,基于Netty实现了自己的 请求响应接口(Request/Result),基于Play的应用就是无状态的,另外Play处理请求的方式是无堵塞的(Non-Blocking)。Play2在设计的时候借鉴了RoR的很多长处。 学习Play能够让你了解一些现代化框架的特点,同一时候能够为你打开异步编程世界的大门。Promise已经被Scala,JavaScript等语言大量使用,Actor模型也已经遍地开花。 这些你都能够直接在Play中使用。或者你想保持原来的编程风格也全然没有问题。

  1. Play的特性
  2. Play2的模板引擎
    Play2的模板是非常强大而且easy上手的. 相对于Java领域其它模板引擎(Freemarker, Velocity, JSP, Groovy, etc), 主要有三个特点.
    1) 简单易上手, 没有JSP里面繁杂的内置对象和指令, 全部功能都通过方法调用完毕.
    2) 主流IDE中都支持Play模板的静态类型检查, 相似JSP.
    3) 支持反向路由.
    举个样例, 一般系统都会有一个固定的页面布局, 比方分出页头页尾。假设用JSP或者Velocity之类的模板。 一般都是通过sitemesh+filter或者在每一个页面include来完毕布局。使用Play模板, 完毕这个功能非常easy。 首先定义一个main页面 main.scala.html:

@(title: String = "默认标题")(staticFile: Html = Html(""))(content: Html)

<!DOCTYPE html>
<html lang="zh-cmn-Hans">
<head>
<meta charset="utf-8" />
<title>@title</title>

</head>

<body>

@header() <-- 页头 -->

@navigator() <!-- 导航 -->

@content

<script src="@routes.Assets.versioned("js/jquery-1.11.2.min.js")"></script>

@staticFile

@(title: String = "默认标题")(staticFile: Html = Html(""))(content: Html)
这一部分是參数声明。这里声明了三个參数:title标题, 有默认值;staticFile为html代码块, 能够传js等。content为页面内容。

@header() <-- 页头 -->

@navigator() <!-- 导航 -->
这一部分是引用同文件夹下的另外两个页面:header.scala.html和navigator.scala.html。

为什么能这样引用,由于这些页面(main,header,navigator)都会被自己主动 编译成一个方法(准确地说是一个Scala object,只是这里先当做方法),所以这里相当于方法调用。相同。这个main也会被编译成方法。其它页面能够调用main来完毕布局。 比如 login.scala.html

@main() {
<script type="text/javascript">
FG.user.login();
</script>
} {
<div class="login width1200">

猜你喜欢

转载自blog.51cto.com/13902157/2152528