[Playframework文档中文翻译] Play 框架概述

Play 框架概述

 

(原文链接:http://play-framework.herokuapp.com/zh/overview 来自"Playframework中文小站 " )

有别于其他臃肿的企业级 Java 框架,简洁的 Play 框架提供另外一种选择,它关注于开发者的效率和 RESTful 风格的架构。Play 是 敏捷软件开发 的完美伴侣。

Play 框架的目标是让基于 Java 的 web 应用开发变得更加容易,让我们看一下它是怎么做到的。

想不想看看代码?

阅读 你可以使用 Play 做的5件很酷的事 ,或者直接从 Hello World 入门指南 开始 。

没有痛苦的 Java 框架

Play 是一个纯 Java 的框架,它让你保持使用你喜欢的开发工具和类库。如果你已经是一个使用 Java 平台的开发者,
那么你不需要切换到另一种语言,其他 IDE 或者其他类库, 而仅仅是切换到一个效率更高的 Java 环境!

修改 bug 后自动重新加载

Java 平台因为较低的开发效率,已经是声名狼藉了,主要的原因就是重复和繁琐的“编译-打包-部署”的周期。

这就是为什么我们重新对这种开发周期进行了思考,并且通过 Play 让开发变得更有效率。

Play 框架自动编译 Java 源代码,然后直接热加载到 JVM 中而不需要重启服务器。你可以编辑代码,框架自动重新加载,然后直接就看到修改后的结果,就像在 LAMP 或者 Rails 环境中一样。

更有趣的是你可以根据自己的喜好,仅仅使用一个简单的文本编辑器进行开发,而不需要使用功能齐备的 Java IDE。


当有错误发生时,框架会尽最大的努力,辨别并显示出错误信息。


Play 甚至对 Java 堆栈跟踪信息进行优化,以便帮助你更容易地解决问题。看看 Java 堆栈跟踪是如何展示模板的执行过程的。


简单的无状态的 MVC 架构

想想,你在一端有一个数据库,另一端是一个浏览器,为什么非要在两者之间存在一个状态呢?

基于有状态和组件式的 Java Web 框架使我们很容易自动保存页面状态,但是这带来了很多其他问题:如果用户打开了第二个窗口时会发生什么?如果用户单击了浏览器的后退按钮呢?

PHP,Ruby on Rails 和 Django 等许多 Web 应用框架促进了 无共享(Share Nothing) 架构的发展。随着浏览器愈来愈强大,现在很容易使用 Ajax,或者离线存储去解决客户端的状态问题。

我们不再需要为了在 web 上重建一个伪造的状态而去 hack HTTP 模型。 无共享(Share Nothing) 的另一方面好处是,可以更加容易地并行地渲染页面的各个部分,更容易地是实现页面局部更新(渐进式增强)。

从 HTTP 到代码的映射

如 果你使用过另外一种 Java Web 框架,例如 Servlet API 或者 Struts 框架,那么你已经看到了一个把 HTTP 协议和 Java API 以及一些奇怪的概念关联起来的抽象体系。Play 和它们想的不同,一个 Web 应用框架应该让你可以完全地直接地访问 HTTP 协议,这是 Play 和其他 Java Web 框架的一个根本性区别。

HTTP 协议,请求/响应模式,REST 架构风格, 内容类型(content-type)协商 ,统一资源标识符(URI) 都是 Play 框架涉及的主要概念。

例如,绑定一个 URI 模式到 Java 调用只需要这样一行:

GET    /clients/{id}        Clients.show










如果 Ajax,REST 风格和在页面之间维护前进/后退操作,是你在日常的 web 开发工作中需要面对的问题,那么请给 Play 一个机会吧。

高效的模板引擎

我 们很喜欢 JSP 和 表达式语言背后的思想,但是为什么我们需要这么多的配置文件才能创建一个标签库呢?为什么我们不能完全地访问对象模型呢? JSP 有很多的约束,这的确令人沮丧。这就是为什么我们创建了一个自定义的模板系统,灵感来自 JSP ,但是没有它的那些约束。

你,还有其他人,应该已经疲倦了写类似这样的代码:

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
 
<c:choose>
    <c:when test="${emails.unread != null && fn:size(emails.unread)}">
        You have ${fn:size(emails.unread)} unread email(s)!
    </c:when>
    <c:otherwise>
        You have no unread emails!
    </c:otherwise>
</c:choose>










我们认为,你一定更喜欢这样写:

You have ${emails.unread ?: 'no'} ${emails.unread?.pluralize('email')} !










Play 模板引擎使用的表达式语言是 Groovy ,它的语法和 Java 一致。 Play 主要使用模板引擎来渲染 HTML 内容,不过你同样可以使用它去生成其他内容,例如 email 邮件消息,JSON 等等。

JPA 持久化

Java 持久化接口( Java Persistence API )是一个简洁的 Java 版的 ORM 框架,如果你使用过 JPA ,你会惊讶于它在 Play 框架中变得如此简单。不需要任何配置,Play 会自动启动 JPA 实体管理器,并在代码发生修改时自动地同步。

而且如果你使用 Play 提供的 play.db.jpa.Model 作为超类时,它会帮助你把代码写得更漂亮。来看一下:

public void messages(int page) {
    User connectedUser = User.find("byEmail", connected()).first();
    List<Message> messages = Message.find(
        "user = ? and read = false order by date desc",
        connectedUser
    ).from(page * 10).fetch(10);
    render(connectedUser, messages);
}










测试驱动开发(如果你喜欢)

集成的测试可以让你更容易的去进行测试驱动开发 (Test-Driven Development) ,你可以写下各种类型的测试,从简单的单元测试到完整的 acceptance 测试,然后直接在浏览器中使用 Selenium 运行测试。代码覆盖率也会被考量。


全栈的应用框架

Play 框架的最初灵感是来自于我们自己的 Java 应用。它包含了创建一个现代 Web 应用所需要的所有工具,包含:

  • 支持 JDBC 的关系数据库
  • 基于 Hibernate ( JPA 接口 ) 的对象-关系映射框架( ORM )
  • 集成的缓存支持,易用的分布式缓存系统( memcached )
  • 简单直接的提供 JSON 和 XML 的 Web Service 服务(我们说的是 真正 的 Web Services,而不是 SOAP 之类)
  • 支持使用 OpenID 进行分布式的身份认证
  • 可以将 Web 应用部署到任何地方(应用服务器,GAE ,云服务,等等)
  • 图像处理 API

Play 模块化的架构使你可以把你的 Web 应用和其他很多的模块组合起来。多亏了应用模块( application modules ),利用它你能够以一种非常简单的方式重用你的 Java 代码,模板,静态资源(如 JavaScript 和 CSS 文件)。

尝试一下吧

安装 Play 框架 ,然后开始开发你的第一个应用吧。

 

(原文链接:http://play-framework.herokuapp.com/zh/overview 来自"Playframework中文小站 " )

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
[强烈推荐, 文档不多, 很快就可以看完, 看完了, 就会使用play了] 目录 MVC应用程序模型 - 7 - app/controllers - 8 - app/models - 8 - app/views - 8 - 请求生命周期 - 8 - 标准应用程序布局layout - 9 - app目录 - 9 - public目录 - 10 - conf目录 - 10 - lib目录 - 11 - 开发生命周期 - 11 - 连接到java调试器 - 12 - 类增强Enhancement - 13 - 02.HTTP路由 - 13 - 关于REST - 14 - routes文件语法 - 14 - HTTP方法 - 15 - URI范示 Pattern - 15 - Java调用定义 - 17 - 把404当作action来用 - 17 - 指派静态参数 - 17 - 变量和脚本 - 18 - 路由优先级 - 18 - 服务器静态资源 - 18 - staticDir: mapping - 18 - staticFile: mapping - 19 - URL 编码 - 19 - 反转路由:用于生成某些URL - 19 - 设置内容风格(CSS) - 20 - HTTP 内容协商 negotiation - 21 - 从http headers开始设置内容类型 - 21 - 定制格式 - 22 - 03.控制器 - 23 - 控制器概览 - 23 - 获取http参数 - 24 - 使用params map - 25 - 还可以从action方法签名实现转换 - 25 - 高级HTTP Java绑定 - 26 - 简单类型 - 26 - Date类型 - 26 - Calendar日历 - 27 - File - 27 - 支持类型的数组或集合 - 28 - POJO对象绑定 - 29 - JPA 对象绑定 - 30 - 定制绑定 - 30 - @play.data.binding.As - 30 - @play.data.binding.NoBinding - 31 - play.data.binding.TypeBinder - 31 - @play.data.binding.Global - 32 - 结果类型 - 32 - 返回一些文本类型的内容 - 33 - 返回一个JSON字符串 - 33 - 返回一个XML字符串 - 34 - 返回二进制内容 - 34 - 作为附件下载文件 - 34 - 执行一个模板 - 35 - 跳转到其他URL - 36 - Action链 - 36 - 定制web编码 - 37 - 拦截器 - 38 - @Before - 38 - @After - 39 - @Catch - 40 - @Finally - 41 - 控制器继承 - 42 - 使用@With注释添加更多的拦截器 - 42 - Because Java does not allow multiple inheritance, it can be very limiting to rely on the Controller hierarchy to apply interceptors. But you can define some interceptors in a totally different class, and link them with any controller using the @With annotation.由于java不允许多继承,通过控制器继承特点来应用拦截器就受到极大的限制。但是我们可以在一个完全不同的类里定义一些拦截器,然后在任何控制器里使用@With注释来链接他们。 - 42 - Session和Flash作用域 - 42 - 04.模板引擎 - 43 - 模板语法 - 43 - Expressions: ${…} - 44 - Template decorators : #{extends /} and #{doLayout /} - 44 - Tags: #{tagName /} - 45 - Actions: @{…} or @@{…} - 46 - Messages: &{…} - 46 - Comment: *{…}* - 46 - Scripts: %{…}% - 46 - Template inheritance继承 - 47 - 定制模板标签 - 48 - 检索tag参数 - 48 - 调用标签体 - 48 - 格式化特定标签 - 49 - 定制java标签 - 49 - 标签命名空间 - 50 - 在模板里的Java对象扩展 - 51 - 创建定制扩展 - 52 - 模板里可以使用的保留对象 - 52 - 05.用play验证http数据 - 53 - 在play里验证如何进行的? - 53 - 验证的错误消息 - 54 - Localised validation messages 局部验证消息 - 55 - 验证消息参数 - 55 - 定制局部验证消息 - 56 - 定制teral(非局部)验证消息 - 57 - 在模板里显示验证错误消息 - 57 - 验证注释 - 60 - 验证复杂对象 - 60 - 内建验证 - 61 - 使用@CheckWith定制验证 - 61 - 定制注释 - 62 - 06.域对象模型 - 64 - 属性模仿 - 65 - 设置数据库来持久化模型对象 - 68 - 用hibernate持久化对象模型 - 69 - 保持模型stateless - 70 - 07.JPA持久化 - 70 - 启动JPA实体管理器 - 70 - 获取JPA实体管理器 - 70 - 事务管理 - 71 - play.db.jpa.Model支持类 - 71 - 为GenreicModel定制id映射 - 72 - Finding对象 - 72 - Find by ID - 72 - Find all - 73 - 使用简单查询进行查找 - 73 - 使用JPQL 查询进行查找 - 74 - Counting统计对象 - 74 - 用play.db.jpa.Blob存储上传文件 - 74 - 强制保存 - 75 - 更多公共类型generic typing问题 - 77 - 08.Play.libs库包 - 78 - 用XPath解析XML - 78 - Web Service client - 79 - Functional programming with Java功能扩展? - 79 - Option<T>, Some<T> and None<T> - 80 - Tuple<A, B> - 80 - Pattern Matching模式匹配 - 81 - Promises - 81 - OAuth - 82 - OAuth 1.0 - 82 - OAuth 2.0 - 83 - OpenID - 84 - 09.异步Jobs - 86 - 引导程序任务Bootstrap jobs - 87 - 预定义任务Scheduled jobs - 87 - 触发任务job - 88 - 停止应用程序 - 89 - 10.在HTTP下进行异步编程 - 89 - 暂停http请求 - 89 - Continuations - 90 - 回调Callbacks - 91 - HTTP response流 streaming - 92 - 使用WebSockets - 92 - 11.在play框架里使用Ajax - 94 - 通过jsAction标签使用jQuery - 95 - 12. Internationalization国际化支持 - 96 - 仅使用 UTF-8! - 96 - 国际化你的信息 - 96 - 通过应用程序定义支持的语言 - 96 - 依照你的区域定义日期格式 - 97 - 找回区域信息 - 97 - Message arguments - 97 - 模板输出 - 98 - 多参数 - 98 - 立即数Argument indices - 98 - 13.使用cache - 99 - The cache API - 99 - 不要把Session当成缓存! - 101 - 配置mcached - 101 - 14.发送e-mail - 102 - Mail 和MVC 集成 - 102 - text/html e-mail - 103 - text/plain e-mail - 104 - text/html e-mail with text/plain alternative - 104 - 在应用程序里链接到邮件 - 104 - SMTP配置 - 105 - 使用 Gmail - 105 - 15.测试应用程序 - 105 - 书写测试程序 - 105 - 单元测试 - 106 - 功能性测试 - 106 - Selenium test用例测试 - 107 - Fixtures固定值 - 108 - 运行测试 - 110 - 陆续集成,并自动运行测试 - 111 - 16.安全指南 - 112 - Sessions - 112 - 守住你的安全…安全 - 112 - 不要存储关键性的数据 - 112 - 跨站点脚本攻击 - 112 - SQL注入 - 113 - 跨站点请求伪造 - 114 - 17.Play模块和模块仓库 - 115 - 什么是模块? - 115 - 如何从一个应用程序里加载模块 - 115 - 从模块加载默认的routes - 115 - 为模块增加文档说明 - 115 - 使用模块仓库 - 116 - 贡献新模块到模块仓库里 - 117 - 先决条件 - 117 - 模块注册 - 117 - 发布你的模块 - 118 - 18.依赖管理 - 118 - 依赖格式 - 119 - 动态版本 - 119 - dependencies.yml - 119 - ‘play dependencies’命令 - 120 - 透明依赖 - 121 - 保持lib/和modules/目录同步 - 122 - 冲突判定Conflict resolution - 123 - 增加要的仓库 - 124 - Maven仓库 - 125 - 本地仓库 - 125 - 定制ivy设置(Apache ivy:项目依赖管理工具) - 126 - 清除Ivy缓存 - 127 - 19.管理数据库变化Evolution - 128 - Evolutions脚本 - 128 - 同步同时发生的改变 - 130 - 数据不一致状态 - 133 - Evolutions 命令 - 136 - 20.日志配置 - 139 - 对应用程序进行日志 - 139 - 配置日志级别 - 140 - 生产配置 - 140 - 21.管理多环境下的application.conf - 140 - 框架id(framework ID) - 141 - 从命令行设置框架id - 142 - 22.生产部署 - 142 - application.conf - 142 - 设置框架为prod模式: - 142 - 定义一个真实的数据库: - 143 - 禁止JPA的自动结构更新: - 143 - 定义一个安全的secret key: - 143 - 日志配置 - 143 - 前端http服务器(Front-end HTTP server) - 144 - 部署到lighttpd服务器的设置 - 144 - 部署到Apache服务器的设置 - 145 - Apache作为前端代理服务器,可以允许透明更新你的应用程序 - 145 - 高级代理设置 - 146 - HTTPS配置 - 147 - 不依赖Python进行部署 - 148 - 23.部署选择 - 148 - 独立Play应用程序 - 149 - Java EE应用服务器 - 149 - 支持应用服务器 - 149 - 部署 - 150 - 数据源 - 150 - 定制web.xml - 151 - 基于云的主机Cloud-based hosting - 151 - AWS Elastic Beanstalk - 152 - CloudBees - 152 - Cloud Foundry - 152 - Google App Engine (GAE) - 152 - Heroku - 152 - playapps.net - 153 -

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值