现在的位置: 首页 > 综合 > 正文

Play! Framework 学习笔记(一):初识Play

2013年02月15日 ⁄ 综合 ⁄ 共 5659字 ⁄ 字号 评论关闭

开篇:

文字块说明:

1)蓝字:正文

2)棕字:小节标题

3)@引用:写给入门阶段的学弟学妹,下面示例:

@
写给入门阶段的学弟学妹

4)需要醒目的文字:比较重要的步骤或者阅读代码中比较重要的部分

5)其他引用:一些解释性的描述,下面示例

这是个问题
这个问题是这样的。。。

 

 

 

自我介绍:

  • 小弟是一名二年级学生,目前正在企业里做Intern,实习内容是JAVA后台方面的。

发文动因:

  • 公司的一项很好的有奖新技术调研比赛活动,奖都是其次,更重要的是有了一个这样的平台,有了一定的压力,可以促使自己把平时的一些念头借此良机落实(肯定 很多人和我一样,看到些新技术总会有些想法,比如等有空了做做例子,把源码读一读,但是随着时间的推移,这份热情伴随着生活琐事也许就消逝了。。。。 o(╯□╰)o)
  • 之前学习Linux,入门时看鸟哥系列( linux.vbird.org/ )非常的高效,也很欣赏他朴实踏实的文风,由浅入深,有条有理。因此自己也希望能写出个大部分人能看懂,且不觉得枯燥的东西来。

发文目的:

  • 自我学习:实习了大半年,在现行框架上做过些coding的工作,但是对框架的理解还是皮毛,而且在企业里待着,身边每一位都是技术牛人,觉得压力巨大,所以需要不断学习来尽量弥补这巨大的差异,尽量使自己毕业时能达到在软件行业从业的水平。框架方面技术之前还学习过Spring和Spring Security,但是也是仅限于能参照指南做些相应的应用而已,因此想借为期50天的PLAY调研机会,顺便横向比较学习其他框架。通过写博客,给别人看是一方面,更重要的是写东西过程本身就是对学习的总结和加深记忆的很好方式。
  • 指导学弟:我在刚入行的时候就很茫然,知道要多编程,多读经典源码,但是往往是事倍功半,说白了就是没上道,没开窍,当时特别希望有个入行不太深,但是多少知道点,又勤于分享的学长能有个对于阅读源码,做例子之类手把手的教程,而小弟正巧目前处于此阶段,过了懵懂,但是了解也不深,趁着记忆犹存,尽量把自己在之前学习遇到的不解问题和困难在学习Play!时再解释一遍,非常希望能帮助处于入门阶段的学弟学妹们O(∩_∩)O哈哈~
  • 参加公司的技术调研比赛:不求名次,重在参与,希望我这种裹脚布的叙述方式能给公司众编程高手达人一种不同的技术表达风格。我初衷是尽量用最二(傻瓜,通 俗,简单)的语言和图案把PLAY说明白。
  • 喜欢写博:虽然有论文的压力,但是说实话我讨厌死写论文,非要用些自己都觉得恶心的专业术语描述一些本应该很有活力的东西。我相信中国的大部分论文写出来,很多都是自己都不想多看几遍的,别再说别人了。而且写博可以闲暇时一个人待在宿舍听着音乐喝着茶用闲暇活动慢慢写,很悠闲,很享受。

 

困惑:

  • 最困惑的莫过于官网的指导不但详细而且傻瓜,且用到的英语也很简单,这么写下去可能大部分照搬官网,显得很没意义。而自己也没有足够的经验和知识来评判Play!的优劣。所以唯一有点价值的可能就是稍微深入一下,争取把Play!的内部机理和部分源码搞明白。
  • 由于小弟资历尚浅,学艺不精,文中难免出错,望各位大师如果耐心观看此文,发现错误请指正!!非常感谢!!

 

 

目标一:学习官网Getting Started和Run Demo 
 @

学弟学妹醒目,要了解一个框架,第一件事就是运行最简单的例子“HELLO
WORLD”,(喂!喂!学长,你不会以为我们是白痴吧。。。#_#)。别怀疑,其实往往跑最简单的例子能更加迅速的了解框架的大致工作原理,这里也说一下的是,在学校的学习时,我们大多习惯于,想学一门技术时,先去图书馆找一本厚厚的教材,书名字中经常会带着“精通 专家 大全 权威”之类的忽悠人的词汇,俨然如葵花宝典版通读后立马能成为大师的感觉,但是书的质量先不说,单纯看书,这种学习技术知识的方式就如空中筑楼,基于幻想的学习,其实从实际动手入手,多体会,再看看一些经典书籍,加深理解才是比较好的途径.
 

 

 

1.1 基本概念和特点

 

不免落俗,先说些基本概念和特点

基本都是照搬官网的,所以也可以自己去看

http://www.playframework.org/documentation/1.0.2/home


 

概念:Play framework是个轻快的REST风格J2EE  FULL-STACK框架 
 

RESTFul:可以参考一下这篇文章 www.infoq.com/cn/articles/rest-introduction ,暂且可以不关注。
Full-stack:现在很流行的SSH(Struts+Spring+Hibernate)的整合就是Full-Stack框架,及能提供J2EE开发全套功能的框架。比较出名的Full-Stack框架还有ruby on rails。
 

 

一些优点:

 

From a Introduction post 写道
  • Play is fast. So damn fast.
  • No configuration. Not even one.
  • Play is fun and joyful to develop web applications.
  • Update your code and refresh your browser. Yes, you don't need to restart the server.
  • It doesn't use maven. It uses Python.
  • Play uses Groovy for the template system.
  • Play Routing is amazingly
    easy.
  • Play
    is heavily influenced by Rails, Django and Grails.
  • Testing
    your code is easy.
  • Play
    easily integrates with Eclipse, NetBeans, Intellij IDEA and TextMate.

 

 

稍作解释:

No configuration是指没有web.xml等配置文件(比如:如果自己组合SSH,得配置web.xml , spring和struts的配置文件,要配很多bean,注入以及过滤器)。

框架使用的应用服务器支持热加载,写好代码后,框架再编译后直接将类加载到服务器中,不需要重启服务器,这就大大提高了工作效率。

Routing非常简单,类似windows的hosts文件,定义了HTTP请求和应用程序的映射,再第一个例子中可以看到。

测试工作变得简单,是因为Play提供了良好的测试框架,在例子中可以看到。

 

这里有个大概印象即可,后面通过例子的讲解会逐一解释。

 

 

 

1.2 准备工作

 

原文在此 :  www.playframework.org/documentation/1.0.2/firstapp

 

  • 安装JDK 1.5以上
  • 下载Play! 1.02 http://download.playframework.org/releases/play-1.0.2.1.zip
  • 解开压缩包,将play的根目录添加至环境变量的Path

 

1.3 创建默认项目

  • 打开命令行,切换至你希望放置Hello world项目的目录,输入 “play new helloworld”,根据提示再输入一遍项目名。
  • 这样项目就创建好了,然后输入“play run helloworld”,将我们新创建的项目先启动起来看一下。
  • 打开浏览器,输入http://localhost:9000,我们先看一下默认的创建的项目是什么样子的。
  • Play!真是很贴心,默认的项目启动后显示的内容是告诉你这个框架大概  怎么运行的。
我们对照默认页面的说明,看看生成的项目目录里都有些什么:


 
打开项目目录helloworld,我们可以看到如上图的目录结构
  • app目录:放置了java文件,可以看到app目录下还有三个目录controllers,models和views,目录结构非常清晰,分别存放MVC模式的三层的源码。
  • pig345 评注 // 2010/5/24 
    文章里面有处用词稍微不当:“MVC模式的三层的源码” 
    我理解,MVC模式中 M、V、C 是3类平等的组件, 一定要和 3层模式中的 表现层、逻辑层、持久层,相区别,此处应酌情改下,否则容易暗示读者(尤其是你说的学弟学妹)把3层模式和MVC模式混为一谈。
     

     

  • conf目录:放置了Play的配置文件,其中:
  • application.conf是Play!框架的核心功能配置文件,比如配置DB,应用程序端口号等基础性应用程序配置都在此。
  • routes
    是配置http请求与该请求调用的应用程序方法之间的映射
Routes代码  收藏代码
  1. # Routes  
  2. # This file defines all application routes (Higher priority routes first)  
  3. # ~~~~  
  4. # Home page  
  5. GET     /                                       <span style="color: #ff0000;"><strong>Application.index</strong>  
  6.   
  7. </span>  
  8. # Map static resources from the /app/public folder to the /public path  
  9. GET     /public/                                staticDir:public  
  10. # Catch all  
  11. *       /{controller}/{action}                  {controller}.{action}  
 

Java代码  收藏代码
  1. package controllers;  
  2. import play.mvc.*;  
  3. public class Application extends Controller {  
  4.     public static void index() {  
  5.         render();  
  6.     }  
  7. }  

 

 
如上所示,当我们用GET方法访问应用程序根目录(localhost:9000/)时,框架从router中找到匹配的映射,即Application.index

,所对应的调用方法是controllers目录下的Application类的index()方法。

index()方法中调用了render()方法,这个方法将显示模板(template)app/views/Application/index.html。

 
再来看看index.html
Html代码  收藏代码
  1. #{extends 'main.html' /}   
  2. #{set title:'Home' /}   
  3.   
  4. #{welcome /}  

 

#{extends 'main.html' /}表示该模板继承自'main.html'
#{welcome /}Tag则是显示默认页面的主体部分。
其中:app/view/main.html
Html代码  收藏代码
  1. <span style="font-weight: normal;"><html>   
  2. <head>   
  3. <title>#{get 'title' /}</title>   
  4. <meta http-equiv="Content-Type" content="text/html; charset=utf-8">   
  5. <link rel="stylesheet" type="text/css" media="screen" href="@{'/public/stylesheets/main.css'}">   
  6. #{get 'moreStyles' /}   
  7. <link rel="shortcut icon" type="image/png" href="@{'/public/images/favicon.png'}">   
  8. <script src="@{'/public/javascripts/jquery-1.4.2.min.js'}" type="text/javascript" charset="utf-8"></script>   
  9. #{get 'moreScripts' /}   
  10. </head>  
  11.  <body>   
  12. #{doLayout /}  
  13. </body>   
  14. </html></span>  

 

可以看到main.html里定义了一些共通的html元素,如所用的css,shortcut icon图标,字符集和js库等。

通过继承的方式,可以使得模板的复用性大大增强。
#{doLayout /} Tag指示index.html的内容是插入此处的。

1.4 将默认项目改写成第一个app:Hello world

 

 

编辑helloworld/app/views/Application/index.html

 

Html代码  收藏代码
  1. #{extends 'main.html' /}  
  2. #{set title:'Home' /}  
  3. <form action="@{Application.sayHello()}" method="GET">  
  4.  <input type="text" name="myName" />   
  5.  <input type="submit" value="Say hello!" />  
  6. </form>   

 

与默认项目的index区别,去掉了welcome tag,添加了一个form,注意action部分

@{}的用途是让Play自动生成能够Invoke  Application.sayHello action的URL"@{Application.sayHello()}"
method="GET"

我们将其转换成routes的表达方式是: GET  /Application/sayHello  Application.sayHello 
保存后我们重新访问 localhost:9000/
 


 


抱歉!评论已关闭.