43Play框架学习笔记

43Play框架学习笔记,第1张

43Play框架学习笔记
                          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
2 新建 Play framework 项目

进入 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 MVC

play架构风格是严格按照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.show
3.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(List id) {
...
}

或者
public static void show(Set id) {
...
}
3.5.6 传递对象

如前端通过这种方式传参

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}
  • Logout
  • #{/if}

    特别注意:因为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'}
    	
  • ${user}
  • #{/list}

    或者

    #{if user.admin}
         
  • #{a @Application.admin()}Admin#{/a}
  • #{/if} #{else}
  • #{a @Application.admin()}Admin#{/a}
  • #{/else}
    3.7.3 Actions

    play中,我们可以用这种方式来写超链接

    {a @Application.logout()}Logout#{/a}
    

    当然了,这种方式也是可以的

    Logout
    
    3.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在想尽一切办法帮我们提高开发效率,这种无聊的工作交给框架后台处理,我们应该专注做一些有价值的逻辑开发。

    3.8.2 启用数据库

    在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=123456
    
    3.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);
    //查列表
    List users = 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());
               Map 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 实现多文件上传

    项目中需要实现多文件上传,遍网寻仙不可得,遂自研之,瞎猫碰个死耗子,找到一条捷径可行。

    3.9.1 html代码
     
    

    这里有两点,需要特别注意

    。form表单中的method必须是post

    。文件上传的必须要有name属性,随便起个名就可以,不需要和后台Controller类有任何呼应关系

    3.9.2 Java代码
    public static void saveFile(String abc) {
            // 保存图片
            List files = (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) {
            // 保存图片
            List files = (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 无缝集成现有开发环境

    欢迎分享,转载请注明来源:内存溢出

    原文地址: http://outofmemory.cn/zaji/5677239.html

    (0)
    打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
    上一篇 2022-12-16
    下一篇 2022-12-17

    发表评论

    登录后才能评论

    评论列表(0条)

    保存