Play框架学习笔记1 环境搭建
在 IntellliJ IDEA 中搭建 Play framework 开发环境
如果想要替代 Eclipse,IntelliJ IDEA 无疑是最好的选择。谷歌的 Android 开发工具就是基于它开发的。IntelliJ IDEA 分为免费版(Community)和付费版(Ultimate),免费版可开发 Java、Groovy、Scala 和 Android 等,付费版支持更多语言和工具。
下面我们就来讲一讲怎样在 IntelliJ IDEA 中搭建 Play framework 的开发环境。
1 基础环境本教程的基础环境如下:
- Windows 7
- JDK 1.7
- Play framework 1.4.3
- IntelliJ IDEA 14.0.2
进入 D:IDEA 目录(不存在的自行创建),先按住键盘的 Shilft 键,然后在空白的地方点击鼠标右键,
在出现的菜单中选择“在此处打开命令窗口”。
在命令窗口中输入以下命令来创建一个名为“test”的 Play framework 项目(询问名称的时候按回车键即可) :
play new test
3 生成 IntelliJ IDEA 项目文件 要想在 IntelliJ IDEA 中开发 Play framework 项目,需要生成 IntelliJ IDEA 格式的项目文件(后缀为 ipr)。
Play framework 项目创建成功后,会生成对应的项目目录,这里是 D:DIEAtest 目录。
进入项目目录执行以下命令创建 IntelliJ IDEA 项目文件:
play idea
4 在 IntelliJ IDEA 中打开 Play framework 项目双击 D:DIEAtest 目录下的 test.ipr 文件,或者从 IntelliJ IDEA 里打开 test.ipr 文件,就可以在 IntelliJ IDEA 里打开这个 Play framework 项目了。
打开 View 菜单,勾选“Toolbar”和“Tool Buttons”两项,用来显示工具栏和工具按钮。
点击侧边栏的“Project” 按钮,打开 Project 工具栏。
Project 工具栏里显示了项目的目录导航以及依赖包(External Libraries)。
5 配置项目依赖的 SDK在编译项目之前要配置好项目的 SDK,本例中即为 JDK 1.7。
点击工具栏上的“Project Structure”按钮,或者通过菜单“File / Project Structure…”打开“Project Structure”窗口。
在 Project Structure 窗口中选择左侧的 SDKs 项,然后点击上方的加号“+”,在出现的菜单中选择“JDK”。
在“Select Home Directory for JDK”窗口中选择自己电脑上 JDK 1.7 的安装目录,然后点击“OK”按钮。
可以看到 JDK 1.7 已经添加成功。
进入 Project Structure 窗口 的 Project 选项页 在 Project SDK 选项中选择刚刚添加的 JDK 1.7,如果有需要的话在 Project language level 选择你需要的 Java 级别。
进入 Project Structure 窗口 的 Modules 选项页,在对应的模块(例如:test)的 Dependencies 标签页中,将 Module SDK 设置为 Project SDK。
点击“OK”按钮保存配置。
6 编译项目点击工具栏上的编译按钮进行编译。
注:也可以通过菜单“Build / Make Project”或者快捷键 Ctrl + F9 来编译项目。
在一个新项目中编译时可能会报告“程序包models不存在”的错误。
这是由于项目中没有添加任何 Model。在教程中,我们新建名为 User 的 Model 后将不会再报告该错误。
package models; import play.db.jpa.Model; import javax.persistence.Entity; @Entity(name = "t_user") public class User extends Model { public String username; public String password; }
请注意,所有 Model 都必须放在项目的 models 目录下,否则不能正常使用。
另外特别要注意的是,某些数据库中是关键字是不能作为表明使用的,例如上面的“User”在 SQL Server 中是关键字,如果直接使用就会报错。
所以通过“@Entity(name = “t_user”)”语句中的 name 属性将该表重新命名“t_user”,以避免出现错误。
添加 Model 后再进行编译,“程序包models不存在”的错误已经不在,IntelliJ IDEA 只在底部的状态了提示“Compilation completed successfully in …”。这表示编译环境配置成功。
7 运行项目在 IntelliJ IDEA 里运行 Play framework 项目需要手动添加运行配置。
点击工具栏编译按钮右边的下拉按钮,然后选择“Edit Configurations…”。你也可以通过菜单“Run / Edit Configurations… ”来打开运行配置窗口。
在打开的 Run/Debug Configurations 窗口中,点击左上角的加号“+”按钮,在出现的菜单中选择“Application”。
首先给新建的运行配置命名,这里命名为“server”。然后在 Configuration 选项卡中,将“Main Class ”项填写为“play.server.Server”,“VM options ”项填写为“-Dapplication.path=. -XX:-UseSplitVerifier”。
点击“OK”按钮保存运行配置。
注:“-XX:-UseSplitVerifier” 配置参数是 Java 1.7 需要的,用来解决 JDK 版本不一致问题。如果是 Java 1.6 则 VM options 项只用填写“-Dapplication.path=.”就可以了。
点击工具栏上的运行按钮运行项目。
注:也可以通过菜单“Run / Run ‘server’”或者快捷键 Shilft + F10 来运行项目。
Play framework 项目默认在 9000 端口上运行。在浏览器里输入 http://localhost:9000,将看到页面显示有“Your new application is ready!”的字样,表示 Play 项目运行成功。
8 调试项目点击工具栏上的运行按钮运行项目。
注:也可以通过菜单“Run / Debug ‘server’”或者快捷键 Shilft + F9 来调试项目。
修改 app/controllers/Application.java 文件如下:
package controllers; import play.mvc.*; public class Application extends Controller { public static void index() { String html = "Hello World!"; renderHtml(html); } }
然后在“String html = “Hello World!”; ”这行上打上断点(点击该行首左侧的竖直窄条工具栏)。
在浏览器里刷新前面输入的 http://localhost:9000 页面,IntelliJ IDEA 将自动定位到断点所在的行。
定位到断点以后,在 IntelliJ IDEA 的底部会出现 Debug 工具栏。点击 Step Over 按钮(或者按 F8 键)执行到下一步。可以看到调试窗口的 Varidables 区域显示出 html 变量的值。你可以进行 Step Into、Step Out 等 *** 作来进行调试。
点击 Debug 工具栏上的运行按钮(绿色三角形)继续运行项目。切换到浏览器,可以看到如下页面上显示“Hello World!”字样。
2 初学Play framework下载安装jdk1.5以上,我用的是1.7
然后下载play-1.2.7,版本可用别的,将play的根目录直接添加到环境变量Path
打开命令行 输入“play new test”(名字自定义)
然后会提示是否确认你的项目名,直接enter
再输入 “play run test”
打开 eclipse import项目,会出现很多文件夹,play框架运用的是MVC模式
app文件夹便存放了Model、 View、Controller这三层
app/controllers
控制器就是一个java类,其中的每个public/static方法都是一个action。一个action方法就是一个java入口点,
当接到一个http请求时,就会调用这个action。action方法从http中提取数据,读取或更新model对象,
并向http请求者发送一个封装好的response结果。所以controller更像view和model之间的一座桥梁。
app/models
model是一系列完全面向对象语言特征的java类,它包含了数据结构和数据 *** 作。
无论何时,model对象都需要存储到持久化存储设备里。
一般情况下,它们还包含一些jpa注释和sql语句。
app/views
view为play提供的高效模板,控制器从model层获取一些感兴趣的数据应用到模板,并通过这个模板把数据装饰的特别漂亮。这个包有HTML、JSON,或其它特别用于动态生成model展现的模板文件组成。
conf
这个文件夹中放置了play的配置文件,其中application.conf是play框架的核心配置文件,比如配置数据库,应用程序端口号等基础性的应用程序配置都在这里面。
routes是http请求和该请求调用的应用程序方法之间的映射。
conf/routes
文件中的’#'为注释。
routes文件列出了所有应用程序所需要的路由。
该配置文件的左栏为HTTP方法+URL路径(这种组合就叫作一个路由),右栏为对应的java调用。
如 GET / Application.index
GET为http方法,而’/'则表示根目录localhost:9000,所以上面红色代码的意思为访问根目录时(程序运行后的第一个页面)调用Application.java中的index方法
app/controllers/Application.java
index调用了一个render()方法,而此时的render()方法则是返回了与java方法index同名的index.html文件,也就是运行程序后在网页中输入localhost:9000会根据ulr调用index方法进而显示index.html
如何运行项目呢?看图
右键点击eclipse中的.launch文件,Run As 选择第一个 运行
运行成功控制栏中会显示 Server is up and running
然后进入浏览器输入lcalhost:9000 则会显示下面页面
是因为我们的index.html页面还没有写任何内容
app/view/Application/index.html
#{welcome /}就是我们上一个图片显示的页面,如果删掉则运行后的页面会变成空白。
而#{extends ‘main.html’ /}表示index页面继承自main.html
可以看到main.html里定义了一些共通的元素,如所用的css和js库等。
通过继承的方式,可以使得模板的复用性大大增强。
#{doLayout /} 指示index.html的内容是插入此处的。
接下来就编辑index.html
我们把#{welcome /}删除掉了,写了一个 form,
其中==@{}的作用是自动生成可以调用Application.sayHello action的URL==
在routes中可以表示为 GET /Application/sayHello Application.sayHello
运行程序后我们会调用Application.sayHello,但是我们没有sayHello方法,所以去Application.java加上这个方法
在form中我们通过submit提交自己的姓名,调用action,找到sayHello方法通过render将我们的名字上传到http,但是上传到上面之后却没有页面去显示这个数据,所以我们需要写一个同名sayHello.html来显示信息。
app/views/Application/sayHello.html
通过${}将http中的信息取出,myName?:'Null’意思为先判断myName是否存在,如果不存在就显示Null(当然也可以写其他的),如果存在就显示取出的myName。
测试一下 输入名字lucy
不输入任何东西
可以看到,现在页面的URL为localhost:9000/application/sayhello?myName=lucy
我们也可以在routes中进行优化
那么页面URL会显示为
添加一些基本校验,编辑Application.java
@Required是校验myName是否存在,如果不存在输出Please input your name. 而这些错误信息都是存放在play的flash scope。对了,不要忘记import play.data.validation.*; (我忘记截上了)
然后重定向到index.html页面上,所以重新编辑index.html页面
如果错误信息存在就从flash scope中取出显示到页面上
对的,就是这样。
3 play教程 3.1 play教程 第一课 play教程 第一课:当我们在谈论play时,我们到底在谈论什么
3.1.1 play是什么Play是一个web开发框架,类似于我们通常讲的SSH、SpringMVC等,就是一个框架。
它吸收了PHP RUBY动态语言的特点,采取即时源码编写,即时激活,框架本身融合了编译器和服务器。取代了 compile-package-deploy 过程,提高产品的开发效率。play的目标之一就是简化开发工作,让程序员们专注于业务层逻辑、Java代码的编写,另外play是推崇REST风格的。
3.1.2 REST风格是什么全称Representational State Transfer(表现层状态转化),这里省略了主语——资源,如果补全应该叫“资源表现层状态转化”。
REST风格推崇的是无状态访问。简而言之,如果一个状态存于服务器上,并且这个服务器记录了用户的一个状态,那么这就是非REST风格;如果没有记录用户的状态,或者状态被记录于coockies,那么这种风格就是REST风格。REST风格的好处就是应用于分布式,比如当下很火的云计算。
举例来讲,你访问一个电商网站,登陆之后,服务器端记录了你的一个session,当你访问你的消费记录时,服务器要根据这个session取出数据,那么如果记录session数据的这台服务器突然宕机重启,你在获取消费记录时就会出错,因为记录的session因宕机没有了;那么如果是REST风格的,服务器端没有存session,而是根据用户id直接查询(如/show/uid/18821099657),这样子即便宕机重启,也是可以查到消费数据的。
3.1.3 play的优点和缺点万物皆有利弊,play框架同样如此,有利也有弊。
利:
安装简单,下载一个压缩包,解压即可;
集成度高,无需安装apache,可以直接launch运行;
修改代码后,无需重新发布,直接刷新浏览器即可;
标签库简单易用,提高开发效率;
弊:
国内不是主流框架,使用者较少;
开发资料较少、开发社区不活跃;
简言之,play的优点是开发效率高,缺点是太小众,国内用的较少,
不像ssh或者spring这样有丰富的学习资料。
3.2 play教程 第二课 play教程 第二课:创建项目
搭建开发环境
-安装JDK*
安装jdk1.7版本
-安装mysql
-安装Eclipse
-安装play
1、下载play压缩包(通常用的版本是1.2.7,注意1.2.7的版本要求jdk是1.7版本)。
2、解压play压缩包。自己建一个文件夹,将Play解压到这个文件夹,如D:/develop。
3、配置环境变量。右键计算机->属性->高级系统设置->环境变量->编辑“path”,将play路径加进去,如D:developplay-1.2.7。
-在Eclipse中安装play插件
将support->eclipse文件夹下的org.playframework.playclipse_0.7.0.jar拷贝到eclipse安装路径下的plugins文件夹,启动eclipse即可看到顶部状态栏多了play的图标。
创建项目
-通过命令行创建项目
在D盘新建一个文件夹叫play-workspace。
打开命令行(快捷键window+R输入cmd然后回车,或者开始-附件-命令提示符),切换至play-workspace目录下。
输入命令,play new hello,这时候会提示输入项目名称,可以直接用hello(也可以用其它的名称)。
到play-workspace查看,会发现目录下,多了一个项目叫hello。
-生成Eclipse可用的项目
依然在play-workspace目录下,依然通过命令行输入命令play eclipsify hello。
再回到hello目录下查看,会发现hello目录下,多了eclipse文件夹,此时就可以将该项目导入Eclipse了。
-在Eclipse中运行项目
导入项目后,展开eclipse目录,右键单击hello.launch,run as运行。
-在浏览器中浏览项目
配置端口——打开conf目录下的application.conf,找到http.port,默认是9000端口,去掉前面的#,如需更改端口号,直接在此更改即可,如改为9999。
浏览器中输入localhost:9000,回车,即可看到项目默认页面。
3.3 play教程 第三课 play教程 第三课:初识play运行机制
你叫什么名字,今年多大?
3.3.1 MVCplay架构风格是严格按照MVC架构的,分别对应app目录下面的三个文件夹——models、views、controllers,由此形成了play独特的包结构。play的包结构是颠覆我们之前用过的那些框架的,比如springMVC、struts等。
实体类全部在models文件夹中定义,包括对数据库的 *** 作方法也都写在实体类中(后文具体讲解);业务逻辑统统在controllers层定义;html文件即展示层都在views包中定义。
图4-1
3.3.2 创建Controller在controller包下新建一个类,取名Sayhello,并让其继承Controller类,在此类中写两个方法,先不要问为什么,一字不漏、不差地写这样两个个方法。
public static void index() { render(); } public static void age(String name,String age){ render(name ,age ); }
3.3.2 创建views层展示文件在views包下,创建一个文件夹名称叫Sayhello,注意必须要和controllers下刚才创建的那个类完全一样的名字,在这个文件夹下新建两个html页面,名字叫index.html和age.html,注意必须和Sayhello类中的那个方法名完全一样的名字。
在index.html中写一个form表单,用来提交姓名和年龄。
你叫什么名字?今年多大?
在age.html中写这样一句
Hello,my name is ${name?:'guest'} and I'm ${age} years old.3.3.3 运行项目
在浏览器地址栏中输入localhost:9000/Sayhello/index,填写姓名和年龄,点击提交,页面跳转至age.html并显示刚才输入的姓名、年龄。
3.3.4 play的运行机制首先从play的包结构说起,列举几个我们经常用到的包——models、views、controllers、public、conf。上面已经提到了models、views、controllers三个包存放的内容;public用于存放html文件中用到的images、css、javascripts等;conf目录内是常用的配置文件,如常用的application.conf、routes等。
上面有两个地方都强调一定要“完全一样的名字”,为什么呢?这就是play的运行机制。由图4-1可见,浏览器端的请求经controller层处理后最终要render(英文义为“递交、给予”)给view层的html文件来展示处理结果。那么问题来了,controller层的类里面并没有指定跳转到哪个页面(传统框架通常通过配置文件指定跳转路径),它是怎样知道我想要用哪个html文件来呈现内容呢?play的办法是在views目录下建一个和controllers类名完全一样的文件夹,在这个文件夹中新建html网页,名字要和controllers类里的方法名完全一样,这样,通过该方法render之后,就会自动跳转到对应的同名html。
那么参数是如何传递的呢?input中的name名字对应方法的参数名,play可根据参数名直接取值;向页面传值时,只需在render()方法中加参,页面中通过标记语言${}取值。
图4-2
3.4 play教程 第四课 play教程 第四课 routes文件的使用
路由配置——routes配置文件的使用
routes配置文件是play中很棒的一个文件,给我们提供了极大的方便,也正是这个文件的妙用,助力了play的REST风格。
简单讲,routes配置文件的目的就是给出地址栏一个url,通过routes文件要找到相应的controllers层下面的方法进行处理。
3.4.1 语法routes文件包含三个主要部分:
part1——HTTP请求方法(如GET/POST/DELETE等),
part2——URI(浏览器访问的路径格式),
part3——controllers层的方法。
图4-1
3.4.2 HTTP请求方法标准HTTP,支持六种请求方法——GET/POST/PUT/DELETE/HEAD/OPTIONS。但是我们通常在使用时,一般只用到GET和POST。真正的REST风格应用,建议把这几种请求方法都应用起来。那我们就可以通过完全相同的URI、不同的请求方法,来实现不同的 *** 作。举例来讲,同样一个URI,http://localhost/article/1099,我们用GET方法可以做查询 *** 作,而通过使用DELETE请求方法则可以进行删除 *** 作。这里做一点扩展,简单讲一下6种请求方式,不感兴趣的可以略过。
GET:这是最常见的,本质就是向服务器发送一个请求,来取得服务器上的某个资源。
POST:这个也是经常用到的,向服务器提交数据。
HEAD:它和GET本质是一样的,只不过HEAD只包含头信息,不包含呈现数据,想象一个业务情景:欲判断某个资源是否存在,我们通常使用GET,但这里用HEAD则意义更加明确。
PUT:这个方法比较少见,和POST类似,提交数据时,通常指定具体的URI。
DELETE:这个也比较少见,本质就是通过这个删除一个资源。
OPTIONS:请求查询服务器的性能,或查询与资源相关的选项和需求。
3.4.3 URI访问路径URI的定义格式有很多种,我们逐一描述。
GET /signup Application.signup
这是最基本的方式,在浏览器中输入/signup,就可直接定位到Application.signup。
GET /signup/{uuid} Application.confirmRegistration
{uuid}指的是客户端请求的参数,同时 confirmRegistration 方法的参数应该为uuid才能正确取值。
GET /forums/{<[0-9]+>forumId} Forums.show
更高级的,这里可以来一个正则表达式,也就是说参数是以数字开头时,才调用这个方法。
GET /album/{albumId}/photo/{photoId} Photo.show
这种情况也是比较常用的,和第二种情况类同比较即可理解。
另外,Play认为斜杠 / 是很重要的,不可忽略。例如,看看下面这个路由项:
GET /clients Clients.index
它将会匹配 /clients 但是不会匹配 /clients/ 。你可以通过在斜杠 / 后加上一个问号 ? ,让这个路由项匹配到URI尾部含有斜杠 / 或者没有斜杠 / 的两种情况,例如:
GET /clients/? Clients.index
再如
/userListMenu/?{id}?
这种路由说明可以有斜杠,也可以没有;可以有id,也可以没有。
最后,再来一个大BOSS
* /{controller}/{action} {controller}.{action}
这就是catch all了,所有情况都捕获。也就是说当你写了一个controller时,不用在routes文件里配置路由,
通过浏览器直接输入所写的controller/method,也可访问到该资源。
3.4.4 Controller方法最后一部分的元素就是Controller元素,这里对应写controller层下的 *** 作方法。注意这里的方法在controller类里一定要用public static 修饰,否则是找不到的。如果controller类在多级包下面,就需要加上包名, packagename.ControllerName.MethodName
-访问静态资源
GET /public staticDir:public /public/images/a.png
通过这种方式,可以定位到public目录,但是单独一个目录是不能打开的,你可以通过在浏览器中输入localhost:9000/public/images/a.png这种url来定位到public下的某个资源。
3.4.5 注释我们可以给route文件增加注释,以#开头
## 显示Blog列表 GET /blog Blog.show3.5 play教程 第五课
play教程 第五课 play中Controller的用法
Controller(控制器)是play中MVC的“C”部分,在 Play 框架中,控制器其实就是一个 Java类,位于 controllers 包中,
继承了父类 play.mvc.Controller。
举个简单的例子:
public class Clients extends Controller { public static void show(Long id) { Client client = Client.findById(id); render(client); } public static void delete(Long id) { Client client = Client.findById(id); client.delete(); } }
在这个示例控制器中,每一个被声明为 public static 的方法都被称为 Action,
每个 Action 的形式如下所示:
public static void action_name(params…);
3.5.1 类同比较与servlet类比
传统的Servlet中,我们在dopost()/doget()方法进行 *** 作,通过request对象获取数据,通过response对象返回数据。
与Struts中的Action类比
Action是struts的核心功能,通过类似下面的配置文件来配置接收类和返回地址
/Methods/list.jsp
与SpringMVC的Controller类比 — 和springMVC最相似
play的Controller和SpringMVC中的Controller最为相似,
如下是SpringMVC的Controller写法,指定了来回传递的参数和返回的页面
@RequestMapping({"/hello" ,"/" }) public String hello(String name,Model model){ String username = "Hello,My name is "+name ; model.addAttribute( "username", username); User u = new User(25, "万里"); model.addAttribute( u); return "hello"; }3.5.2 约法三章
1.所创建的Controller类必须在app/controllers目录下,目录名不能变
2.所创建的Controller类必须继承play.mvc.Controller类
3.所创建的Controller类中的方法必须是public static修饰
3.5.3 如何传参传参的几种方法:
1./article?id=123
2./article/123
3.POST传参
Play能接受所有的传参形式,并且能够自动转换参数类型
3.5.4 传递日期日期数据支持以下几种格式的自动转换:
* yyyy-MM-dd’T’hh:mm:ss’Z' // ISO8601 + timezone * yyyy-MM-dd’T’hh:mm:ss" // ISO8601 * yyyy-MM-dd * yyyyMMdd’T’hhmmss * yyyyMMddhhmmss * dd'/‘MM’/'yyyy * dd-MM-yyyy * ddMMyyyy * MMddyy * MM-dd-yy * MM'/‘dd’/'yy
例如:
前端请求方式:archives?from=21/12/1980
//后台获取并处理方式
//后台获取并处理方式 public static void articlesSince(Date from) { List articles = Article.findBy("date >= ?", from); render(articles); }3.5.5 传递数组或集合
所有被支持的类型都可以通过数组或者集合来获取:
public static void show(Long[] id) { ... } public static void show(List3.5.6 传递对象id) { ... } 或者 public static void show(Set id) { ... }
如前端通过这种方式传参
addSubscriber?user.name=Wayne&user.login=wayneellis&user.password=secret
我们在后台可以这样接收
public static void addSubscriber(User user) { ... }3.5.7 传递文件
在 Play 框架中处理文件上传是非常简单的事,一个 multipart/form-data 编码的请求发送到服务器,
Play 框架会自动为该上传文件生成一个 File 对象。如下所示:
前端页面
后台逻辑
public static void upload(File photo) { //... // 保存图片 *** 作 //... }3.5.8 Response
在play中,通常有两类response的方式——render和redirect,下面具体介绍。
Render
–render()
render()方法是最常用的,直接跳转至与该方法同名的html,当然,我们也可以通过这种方式,
跳转至指定的html文件(即play术语中所谓的模版)
render(“Application/dontSayHello.html”, myName);
如果需要传参,那么直接在render()方法中写上参数即可,如render(args1,args2),
页面接收直接用“{}”取值,如${args1}。
–renderJSON()
这个方法用来传递JSON格式的数据,比如我们在使用ajax时,如果用到json格式数据,那么就需要这个方法。
–renderText()
简单传递一个text。
–renderXML()
返回XML格式的对象。
–renderBinary()
可以传回去一个文件或者输入流对象。
需要说明一点,render下面的语句是不被执行的,如
public static void sayHello(String myName) { render(myName); // Warning: this code will never be executed! System.out.println(“这一行是不能被执行的,不信你试试!”); }
Redirect 间接转发
Play 提供了一个 redirect 方法,可以将请求调整到其他的 URL 地址:
public static void index() { redirect("http://www.baidu.com"); }3.5.9 Action 链
create() ---->show()
Action 链与 Servlet API 中的 forward 并不相同,一个 HTTP 请求只能调用一个 action 。如果你需要调用其他的 action ,
你必须将浏览器重定向到你想要调用的 action 上。这样后退、前进和刷新 *** 作就会简单很多。
你可以重定向到任意一个 action,只需要简单的调用该 action 方法而已,
Play 框架会自动将这种形式的调用解析为 HTTP 的重定向。
例如:
public class Clients extends Controller { public static void show(Long id) { Client client = Client.findById(id); render(client); } public static void create(String name) { Client client = new Client(name); client.save(); show(client.id); } }3.6 play教程 第六课
play教程 第六课 play中的session
Play中对session的处理,和其他框架有明显的区别。在Servlet中,session是存放在服务器端的,并且可以存在于整个会话过程,这样的缺点是万一服务器端出现问题(如超负载、系统运行出错导致异常等),那么用户数据就没了。回想一下,我们以前在开发过程中也会遇到这种问题,用户信息存放在session中,但是因为某种不确定因素,session没了,需要重新登录系统,而这正是play所不倡导的。
那么问题来了,难道play中没有session吗?非也。play中也有session,但是它的session是存放在客户端的,
类似于我们平常所说的cookie。这样就不会因为服务器的种种原因导致session清空了。
只是play框架存放的地方不同而已,对于开发人员角色来说,跟以前存放服务器一样进行代码编写。
session .put("cardid" , cardid );//session存值 session.get("cardid");//session取值 session.remove("cardid");//清除session
页面取值
#{if session.user != null}
特别注意:因为session是通过cookie存放于浏览器的,
所以数据大小不能超过4k,而且只能存放字符串,
另外千万注意不能存放敏感数据。
3.7 play教程 第七课 play教程 第七课 View的用法 模版的用法
view(视图)是play中MVC三大组件之一。
Play 框架有自己的模板引擎来生成HTML页面,该引擎使用 Groovy 做为表达式语言。Groovy和我们之前使用的JSTL表达式类似,在学习play过程中,无需学习Groovy 所有的知识,你需要了解的只是跟 Java 非常相近的一部分,够我们开发过程中使用即可。 Play所有的模板文件都放在 app/views 目录下,所有页面都是在请求时即时解析的。
3.7.1 表达式 ${…}
这就是表达式,例如
${student.name} 或 ${totalcount}
这里要说明一点的是,有时候我们取出来的值会有html标签,尤其是在博客系统中,使用了Editor编辑器插件后,通常会有这种情况,但是play默认是过滤掉html标签的,如果需要,我们可以通过${content.raw()}来取消过滤,即在所取内容后面加一个”.raw()”。
3.7.2 标签play中的标签以“#”开头,需要注意的是,标签有开始标签就有结束标签,如
#{list items:users, as:'user'}
或者
#{if user.admin}
play中,我们可以用这种方式来写超链接
{a @Application.logout()}Logout#{/a}
当然了,这种方式也是可以的
Logout3.7.4 注释
这里有专门的注释标签*{…}*
3.7.5 脚本同样的,play的页面也可以像jsp那样写一些逻辑 *** 作脚本,比如
%{ fullname = user.firstname + “ “ + user.lastname; }% Welcome ${fullname}!
但是,我觉得为了代码美观,不到万不得已,还是不要这样做了,可以在后台处理的事情为什么要放到前台呢?
3.7.6 模版模版这个概念在play中又是一个亮点。模版的目的很简单,就是为了增强页面代码的复用性,提高开发效率。
当我们新建一个play项目后,会发现在views层有一个main.html,如果我们打开它,会发现其中的代码是这样的:
#{get 'title' /} #{doLayout /}
我们新建一个hello.html文件,在其中写这样一段
#{extends 'main.html' /} #{set title:'Home' /} Hello World! What is your name?
那我们来分析一下这两个html文件,首先来看main.html,这里有两个关键点
#{get ‘title’ /}和#{doLayout /}
#{get}顾名思义,这个标签是用来接收值的,有接收就有设定,那它对应的就是#{set};
#{doLayout/},按字面意思,这里应该是布局代码段,没错,我们在hello.html中的那一段正是填充到这里的。
那么play如何知道怎么填充呢?答案是用#{extends/}标签。
通过总结,我们发现play模版中的几个关键标签:
#{doLayout/} #{extends/} #{get/} #{set/}
模版这个概念在实际开发过程中还是发挥了较大作用的,比如公用的header,公用的footer,公用的frame等。
3.7.6 自定义标签如果你喜欢在开发中定义自己的标签,那么可以这样做:
首先我们需要在views目录下创建名为 tags的子目录,
例如我们创建一个 booklist.html 文件,存放在 views/tags 目录下,
booklist.html 的代码如下:
-
#{list items:_items, as:'book'}
%{
bookTitle = book.title.toUpperCase();
}%
- ${bookTitle} #{/list}
那我们在使用的时候可以这样来用:
#{booklist items:books /}
通过这种自定义标签,就大大提高了代码的复用性。
3.8 play教程 第八课 play教程 第八课 Model的用法 play中的JPA
3.8.1 Model层介绍Model是MVC架构中的又一重量级概念,前文中我们已经讲过了Controller和View,接下来就讲一下这个Model。
Model层的作用这里再简单说一下。和其他框架一样,model层主要是用来做数据模型的,另外有几点特别要提一下
-
实体类中的属性需要public修饰
-
实体类不需要写get/set方法
-
通常我们会在实体类中写数据库 *** 作方法,也就是传统框架中的dao层
|
举个栗子:
@Entity public class Address extends Model{ public String address; public String telephone; public Long userid; public String name; public boolean del; public Long cardid; public static boolean findByCondition(String name,String address){ int rows = Address. find("del=? and name=? and address=?", false,name,address).fetch().size(); if( rows>0){ return true; } else{ return false; } } public static List findByUserid(Long userid){ return Address. find("del=? and userid=? order by id desc",false,userid).fetch(); } }
看到这里,一些老练的程序员会指出:“wrong!wrong!!wrong!!!我们不应该把属性设置成public,应该是private,这样才符合java的封装特性。”好吧,既然你想到了,那么Play肯定也想到了,事实上,play在后台是为这些属性做过处理的,已经处理成了private,并且为我们生成了set/get方法。为什么要这么做呢?原因只有一个,play在想尽一切办法帮我们提高开发效率,这种无聊的工作交给框架后台处理,我们应该专注做一些有价值的逻辑开发。
在play中用“启用”这两个字比较贴切,因为他不需要什么加载驱动、创建链接之类的繁琐步骤,只需要在/conf/application.conf文件中配置一下就可以,而且这里的配置非常简单。下面我们介绍两种启用数据库的方法,均已mysql为例。
第一种方法
# db=mem # To connect to a local MySQL5 database, use: # db=mysql://user:pwd@host/database
在application.conf文件中找到这样几行,把粗体的两行去掉“#”,然后在第二行写上我们自己使用的数据库信息
举个栗子
db=mem # To connect to a local MySQL5 database, use: db=mysql://root:123456@host/hellodb
第二种方法
# If you need a full JDBC configuration use the following : # db.url=jdbc:postgresql:database_name # db.driver=org.postgresql.Driver # db.user=root # db.pass=secre
在application.conf文件中找到这样几行,把粗体的几行去掉“#”,同样,根据自己的实际情况,修改配置信息.
举个栗子
db.url=jdbc:mysql://localhost/hellodb db.driver=com.mysql.jdbc.Driver db.user=root db.pass=1234563.8.3 JPA的使用
JPA全称the Java Persistence API,也就是对数据库进行 *** 作的数据模型实体类 *** 作,是play中的一大利器,又帮我们减少了许多臃肿的代码。
正如本文第一个例子中那样,play中的实体类要继承Model类,并且要有@Entity注释。play中的JPA给我们带来多大的便利呢?
//增 user.save(); //删 user.delete(); //改 user.email = “new@emailaddress.com”; user.save(); //查 User user = User.findById(1L); //查列表 Listusers = User.find(“admin = ?”, “true”).fetch();
怎么样,是不是很奇妙,很简单?It’s so easy.
再举个栗子。
controller类:
public static void add(String address,String telephone,String name,Long userid){ Address addr = new Address(); addr. address = address; addr. telephone = telephone; addr. name = name; addr. cardid = getCardid(); int flag = 0; if(!Address. findByCondition(name, address)){ flag = 1; } addr.save(); JSONArray result = JSONArray. fromObject(flag); renderJSON(result); } public static void show(Long userid){ List addresses = Address.findByCardid(getCardid()); Map3.9 实现多文件上传resultMap = convertToMap(addresses); renderJSON(resultMap); } public static void del(Long addrid,Long userid){ Address addr = Address. findById(addrid); addr. del = true; addr.save(); }
项目中需要实现多文件上传,遍网寻仙不可得,遂自研之,瞎猫碰个死耗子,找到一条捷径可行。
3.9.1 html代码这里有两点,需要特别注意
。form表单中的method必须是post
。文件上传的必须要有name属性,随便起个名就可以,不需要和后台Controller类有任何呼应关系
3.9.2 Java代码public static void saveFile(String abc) { // 保存图片 Listfiles = (List ) request.args.get("__UPLOADS"); for (Upload upload : files) { if (upload.getSize() > 0) { File f = upload.asFile(); String fileName = f.getName(); File storeFile = new File("./public/pictures/" + fileName); Files.copy(f, storeFile); } } }
这里也有两点要特别注意
- 方法中必须有参数,胡编乱造一个参数也得给它弄一个参数上去
- request.args.get(“__UPLOADS“),这个方法里的参数必须是__UPLOADS,注意,这里是双下划线,多一个少一个变一个都不行!
以上提到需要注意的四点,必须严格执行,否则就会出现空指针错误。
4 play教程 4.1 play框架01 play框架01–介绍
概论:
Play框架颠覆了臃肿的企业级Java EE规范,以Restful为目标并专注于开发效率,是Java敏捷开发的最佳参考方案。开发者只要具备Java以及数据库的相关基础知识就可以轻松上手,从而让Web应用开发变得更加容易,提高项目催化速度。
作为Full Stack的Java Web应用框架,Play包括了所有开发中涉及的领域:NIO应用容器,无状态MVC模型,Hibernate数据持久化,Groovy模板引擎,以及建立Web应用所需要的各种工具类。需要注意的是,这里虽然使用了Groovy,但只是将其作为页面模板语言,和Freemaker、Velocity使用自己定义的语言是同样的道理。Groovy的成熟以及它和Java的相似性决定了采用Groovy远远好于定义自己的模板语言。
特性:
4.1.1 无缝集成现有开发环境type=“file” multiple id=“qfile” name=“fileabc”>
Save
这里有两点,需要特别注意
。form表单中的method必须是post
。文件上传的必须要有name属性,随便起个名就可以,不需要和后台Controller类有任何呼应关系
3.9.2 Java代码public static void saveFile(String abc) { // 保存图片 Listfiles = (List ) request.args.get("__UPLOADS"); for (Upload upload : files) { if (upload.getSize() > 0) { File f = upload.asFile(); String fileName = f.getName(); File storeFile = new File("./public/pictures/" + fileName); Files.copy(f, storeFile); } } }
这里也有两点要特别注意
- 方法中必须有参数,胡编乱造一个参数也得给它弄一个参数上去
- request.args.get(“__UPLOADS“),这个方法里的参数必须是__UPLOADS,注意,这里是双下划线,多一个少一个变一个都不行!
以上提到需要注意的四点,必须严格执行,否则就会出现空指针错误。
4 play教程 4.1 play框架01 play框架01–介绍
概论:
Play框架颠覆了臃肿的企业级Java EE规范,以Restful为目标并专注于开发效率,是Java敏捷开发的最佳参考方案。开发者只要具备Java以及数据库的相关基础知识就可以轻松上手,从而让Web应用开发变得更加容易,提高项目催化速度。
作为Full Stack的Java Web应用框架,Play包括了所有开发中涉及的领域:NIO应用容器,无状态MVC模型,Hibernate数据持久化,Groovy模板引擎,以及建立Web应用所需要的各种工具类。需要注意的是,这里虽然使用了Groovy,但只是将其作为页面模板语言,和Freemaker、Velocity使用自己定义的语言是同样的道理。Groovy的成熟以及它和Java的相似性决定了采用Groovy远远好于定义自己的模板语言。
特性:
4.1.1 无缝集成现有开发环境欢迎分享,转载请注明来源:内存溢出
评论列表(0条)