PlayFramework有哪些让人眼前一亮却又不为人所知的特性

首先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.
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值