首先Play有两个分支, 1.x和2.x 1.x使用Java开发, 只支持Java项目. 2.x使用Scala开发, 同时支持Java和Scala项目. 1.x我没用过, Play2用过一段时间. 说说Play2的闪光点. 1. Play2的模板引擎. Play2的模板是很强大并且容易上手的. 相对于Java领域其他模板引擎(Freemarker, Velocity, JSP, Groovy, etc), 主要有三个特点. 1) 简单易上手, 没有JSP里面繁杂的内置对象和指令, 所有功能都通过方法调用完成. 2) 主流IDE中都支持Play模板的静态类型检查, 类似JSP. 3) 支持反向路由. 没代码我说个XX 举个例子, 一般系统都会有一个固定的页面布局, 比如分出 页头页尾.如果用JSP或者Velocity之类的模板, 一般都是通过sitemesh+filter或者在每个页面include来完成布局. 使用Play模板, 完成这个功能非常容易. 首先定义一个main页面, @(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标题, 有默认值 staticFile为html代码块, 可以传js等 content为页面内容 因为main页面最后会被编译成一个方法(准确地说是一个Scala object), 所以其他页面 可以直接调用这个方法, 传入自己自定义的内容.比如 @main() { <script type="text/javascript"> FG.user.login(); </script> } { <div class="login width1200"> <!-- login --> </div> } 这样就完成了页面布局, 没有随处可见的include, 也没有暗箱操作的filter, 所有的一切都是方法调用, 是不是很简单清晰? 静态类型检查就不说了, 本来Java的一大优点(缺点)就是类型检查 所以在Java里用Freemarker或者Velocity这种模板的做法值得商榷. 反向路由的意思是, 在Play中, 所有的Controller url都配置在一个routes文件中, 例如 GET /register @controllers.user.LoginController.registerPage 之后无论是在Controller里还是模板中, 都不用硬编码url. 而是使用routes文件. 例如在Controller中: redirect(routes.LoginController.registerPage())就能实现重定向 而在模板中: <a href="@controllers.routes.LoginController.registerPage()"> 使用反向路由的好处就是入口清晰, 项目里的所有url统一配置在一个文件里, 方便组织和维护.routes这种风格类似于REST里的URI模板, 其实Play是Java领域里最适合开发REST项目的框架之一. 2. 热部署, 这个应该都知道了. 现在的Java Web框架没这个功能都不好意思拿出来说. 虽然Scala代码编译很慢, 但是如果只是修改几个类, sbt的增量编译速度还是很快的. 基本上改代码再刷新页面就能看到结果. 3. 内置dev/prod环境隔离, 内置部署脚本. 平 常开发的时候使用run启动Play, 是跑在dev模式. Play会定时扫描源码目录进行热更新, 并且类都是访问的时候再加载, 提高启动速度. 使用start启动项目就运行在prod模式.Play内置dist命令, 可以把所有的文件打包成一个zip, 解压之后直接运行bin目录下的可执行文件即可启动项目, 除了JDK之外无须任何其他外部依赖. 4. 使用Play开发的Server大部分能做到Stateless. Play 抛弃了Servlet/JSP里session, context等概念, 内置没有提供方法将对象与服务器实例进行绑定(你要使用HashMap存的话Play也没办法). 推荐的做法是使用外部缓存, 比如Redis, Memcached等. 可能你觉得这是Play的一个缺点, 但是只要你开发过流量稍微大一点的应用, 你就会理解这点. 5. 好用的配置库. 如果你之前开发过Java项目, 肯定写过**.properties或者管理一大堆的xml.. Java 内置库对properties文件的处理是很弱的, 你不得不自己写一些工具类去进行处理.而且properties文件还不支持更复杂的语法. Play的配置文件使用HOCON格式, 默认配置文件为application.conf.你能很容易读取里面的配置, 并且你也可以把自己的配置写在里面.所以基本上就用不到properties或者xml文件了. 6. Play插件. Play有比较多的官方和第三方插件可以使用. 比如发邮件, 授权和验证, 第三方登录等等.自己写一个插件也很简单. 7. 优秀的测试支持(以下的例子为Play Java版本) 因为Play诞生的时候TDD已经很火热, 所以Play对测试的支持非常好. 通过Helpers.fakeApplication()一行代码就能模拟出一个Application(Play中的Application你可以理解为类似于Spring的Context). FakeRequest request = new FakeRequest(POST, routes.LoginController.requestPhoneCode(phone).url()); Result result = route(request); assertThat(status(result), is(OK)); 三行代码就能对Controller进行测试. 通过要测试完整的Http请求, 可以通过fakeServer在测试中启动一个Play应用, 通过请求这个Play应用来完成测试. Play还内置了对 Selenium WebDriver的支持, 可以模拟浏览器进行测试.以下是官方的例子: @Test public void runInBrowser() { running(testServer(3333), HTMLUNIT, browser -> { browser.goTo("http://localhost:3333"); assertThat(browser.$("#title").getText()).isEqualTo("Hello Guest"); browser.$("a").click(); assertThat(browser.url()).isEqualTo("http://localhost:3333/login"); }); } 以上说的都是优点. 当然坑也有一些. 不过用了Play2之后, 如果让我在Java里再做技术选型, 我会不犹豫的选Play.
PlayFramework有哪些让人眼前一亮却又不为人所知的特性
最新推荐文章于 2024-08-10 07:07:03 发布