文档章节

Play源码深入之七:Play的MVC实现

奋斗到天明
 奋斗到天明
发布于 2015/08/27 18:13
字数 703
阅读 1K
收藏 0

码上生花,ECharts 作品展示赛正式启动!>>>

整体来说,Play1.x是一个较完善的框架,各种功能都一应俱全,有点像句老话“麻雀虽小五脏俱全”哈。虽没有Struts、SpringMVC的大名气,但是使用起来,相当顺手。本文将深入Play1.x的MVC,也整合前面各方知识。 

在new一个Play项目之后,都会有models、views、controllers三个文件夹,正好对应MVC,而且每类文件还必须放对地方。

这里要讲的是Play框架层面上,对MVC做的工作: 

M:Model(模型),在Model上,Play对每个Model进行了增强,在PlayPlugin中,有enhaner事件,每个插件都可以对Model进行增强,触发的时机在play.Invoker:run()中,调用init方法,检测play代码是否有变化,有变化就会发出增强事件,位置在play.classloading.ApplictionClasses:enhance()方法中。响应事件的有CorePlugin和JPAPlugin,JPAPlugin在前文已经说过,是织入JPA支持方法,而CorePlugin的enhaner有多个增强类,全在play.classloading.enhancers包中。 

 QQ20150803-2@2x 

Model采用的ActiveRecord比POJO/DAO/Service高明,之前做SSH项目时,早就烦透了写一大片DAO/Service,而且里面还没有代码……(因为都集中到某个base类中)。而ActiveRecord没有这等烦恼,让人用着舒服~。 

V:Views(视图),Play模版引擎是使用Groovy语言,我用过Groovy,感觉这货就是无法无天版的Java,吸取了各家所长,当模版引擎是小菜一碟。不过Play2已经放弃Groovy。 

在play.mvc.results中可以看到各种返回结果,有Html/template/json/xml/text/binary。对于只想用play做移动端restful后台的项目,果断好用。 

C:Controller(控制器),Play对比struts2的使用xml映射和springMVC的注解都要直接,使用routes文件,直观高效。 play会加载route文件,当请求过来时,进行匹配,如果没有找到就会404。

public class Router {
    public static Route route(Http.Request request) {
        ...
        for (Route route : routes) {
            Map<String, String> args = route.matches(request.method, request.path, request.format, request.domain);
            if (args != null) {
                request.routeArgs = args;
                request.action = route.action;
                if (args.containsKey("format")) {
                    request.format = args.get("format");
                }
                if (request.action.indexOf("{") > -1) { // more optimization ?
                    for (String arg : request.routeArgs.keySet()) {
                        request.action = request.action.replace("{" + arg + "}", request.routeArgs.get(arg));
                    }
                }
                if (request.action.equals("404")) {
                    throw new NotFound(route.path);
                }
                return route;
            }
        }
        ...
        throw new NotFound(request.method, request.path);
    }
}

Play使用Netty做服务器,没有使用j2ee一套,所以得自己实现request/respone/session等类,但Play的实现比j2ee的要灵活好用。

每次初始化调用相关准备后,Play就会使用Router中的路由进行请求分发。而返回结果是基于异常机制,这也是为人所诟病的。这一点在之前的 请求一章提过。 

play也有过滤器机制,前文也说过,play通过插件响应出完成过滤,这个机制在play 1.2.3上还没有看见。另外Play的before/after/with注解也有过滤器的作用。

© 著作权归作者所有

奋斗到天明
粉丝 19
博文 112
码字总数 82707
作品 0
昌平
程序员
私信 提问
加载中
请先登录后再评论。
Play源码解析计划

最近有想法看看Play的源码,以提高自己的编码水平。之前都是东看看,西看看。最后看来去却好像无所大成。有人说过,伤敌十指,不如断敌一指,于是我有开始了学习之路。 原计划是采用1.2.3版本...

刀狂剑痴
2015/08/27
210
0
用Play 1.x 实现简单云计算多租户设计(Use Play 1.x To Achieve Multi-Tenancy Design)

这里的云计算多租户是指一个web应用,多个数据库。每一个租户对应着一个数据库。 数据库方面,简单分为一个基本库,记录着基本信息与租户的信息,还有租户数据库配置信息。N个租户库,这N个租...

刀狂剑痴
2015/08/27
180
0
Play 1.x框架学习之七:多数据库切换与源码修改 ( Databases Switch And Modify Source Code)

在单数据源(单个ip)下的多库,可以使用use xxdb 命令进行切换,但是如果多个数据源的情况下,use命令就不行了。在play框架中,提供了多数据源多库的切换。本文不提供完全的例子,只提供部分...

奋斗到天明
2015/08/27
758
0
Scala下Play框架学习笔记(Actions,Controllers and Results)

Scala下Play框架的学习是一件辛苦的事情,因为该框架比较新,scala语言也较新,所以中文资料很少,经过同事推荐,去了如下英文网站看资料: https://www.playframework.com/documentation/2....

金明略
2016/12/22
0
0
Play Framework 2 with Scala

顶一下 一种全新的开发技术架构Play + Scala:教程: Play Framework 2 with Scala, Anorm, JSON, CoffeeScript, jQuery & Heroku,大概步骤: 1.下载安装Play2 RC2 2.创建一个应用: play n...

lhanoo
2012/02/22
106
0

没有更多内容

加载失败,请刷新页面

加载更多

向您推荐Groove BizTalk Workspace!

什么是Groove Office Groove 2007 是一个协作软件程序,适合用于处理从简单的文档协作到与业务过程集成的自定义解决方案的各种项目活动。 Office Groove 2007 的以下十大方式可帮助您和您的团...

osc_o8ipcpa5
29分钟前
19
0
【我的Android进阶之旅】你可能不知道android.view.View#setAlpha()方法也会影响你的APP性能!

一、问题描述 最近在优化APP的性能的时候,发现了一个平时完全没有注意到的一个能够影响APP性能的代码。这个代码就是调用了android.view.View#setAlpha()方法。 1.1 需求描述 APP有个需求,是...

osc_y08db3kb
29分钟前
21
0
lsof命令详解

lsof命令详解 lsof 简介 lsof(list open files)是一个列出当前系统打开文件的工具。在linux环境中一切皆文件,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。所以如传输控制...

osc_htns3spg
30分钟前
14
0
设置非root账号不用sudo直接执行docker命令

环境信息 操作系统:Ubuntu 20.04 LTS 桌面版 Docker:19.03.10 现状 当前账号是willzhao,直接执行docker xxx命令会报以下错误: willzhao@ideapad:~$ docker imagesGot permission denie...

osc_kl6fknqf
31分钟前
10
0
小米净水器更换滤芯步骤和水龙头亮黄灯的解决办法

【开篇序言】 众所周知,无论何种品牌的净水器,滤芯都是有一定使用寿命的,而不是一次性安装可永久使用,如果遇到无需换滤芯这类宣布,请远离,不靠谱。换滤芯,小米净水器也不例外,小米净...

osc_zzg7fpke
32分钟前
23
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部