Play框架教程1学习笔记

文章目录

  • 1play教程 第一课
    • 1.1 play是什么
    • 1.2 REST风格是什么
    • 1.3 play的优点和缺点
  • 2 play教程 第二课
    • 2.1 搭建开发环境
      • 2.1.1 安装JDK
      • 2.1.2 安装jdk1.7版本
      • 2.1.3 安装mysql
      • 2.1.4 安装Eclipse
      • 2.1.5 安装play
      • 2.1.6 在Eclipse中安装play插件
    • 2.2 创建项目
      • 2.2.1 通过命令行创建项目
      • 2.2.2 生成Eclipse可用的项目
      • 2.2.3 在Eclipse中运行项目
      • 2.2.4 在浏览器中浏览项目
  • 3 play教程 第三课
    • 3.1 MVC
    • 3.2 创建Controller
    • 3.3 创建views层展示文件
    • 3.4 运行项目
    • 3.5 play的运行机制
  • 4 play教程 第四课
    • 4.1 语法
    • 4.2 HTTP请求方法
    • 4.3 URI访问路径
    • 4.4 Controller方法
    • 4.5 访问静态资源
    • 4.6 注释
  • 5 play教程 第五课
    • 5.1 类同比较
      • 5.1.1 与servlet类比
      • 5.1.2 与Struts中的Action类比
      • 5.1.3 与SpringMVC的Controller类比
    • 5.2 约法三章
    • 5.3 如何传参
      • 5.3.1 传参的几种方法
      • 5.3.2 传递日期
      • 5.3.3 传递数组或集合
      • 5.3.4 传递对象
      • 5.3.5 传递文件
    • 5.4 Response
      • 5.4.1 Render
        • 5.4.1.1 render()
        • 5.4.1.2 renderJSON()
        • 5.4.1.3 renderText()
        • 5.4.1.4 renderXML()
        • 5.4.1.5 renderBinary()
      • 5.4.2 Redirect
    • 5.5 Action链
  • 6 play教程 第六课
  • 7 play教程 第七课
    • 7.1 表达式
    • 7.2 标签
    • 7.3 Actions
    • 7.4 注释
    • 7.5 脚本
    • 7.6 模版
    • 7.7 自定义标签
  • 8 play教程 第八课
    • 8.1 Model层介绍
    • 8.2 启用数据库
      • 8.2.1 第一种方法
      • 8.2.2 第二种方法
    • 8.3 JPA的使用
  • 9 play教程 实现多文件上传
    • 9.1 html代码
    • 9.2 java代码

1play教程 第一课

​ play教程 第一课:当我们在谈论play时,我们到底在谈论什么

1.1 play是什么

Play是一个web开发框架,类似于我们通常讲的SSH、SpringMVC等,就是一个框架。

它吸收了PHP RUBY动态语言的特点,采取即时源码编写,即时激活,框架本身融合了编译器和服务器。取代了 compile-package-deploy 过程,提高产品的开发效率。play的目标之一就是简化开发工作,让程序员们专注于业务层逻辑、Java代码的编写,另外play是推崇REST风格的。

1.2 REST风格是什么

全称Representational State Transfer(表现层状态转化),这里省略了主语——资源,如果补全应该叫“资源表现层状态转化”。

REST风格推崇的是无状态访问。简而言之,如果一个状态存于服务器上,并且这个服务器记录了用户的一个状态,那么这就是非REST风格;如果没有记录用户的状态,或者状态被记录于coockies,那么这种风格就是REST风格。REST风格的好处就是应用于分布式,比如当下很火的云计算。

举例来讲,你访问一个电商网站,登陆之后,服务器端记录了你的一个session,当你访问你的消费记录时,服务器要根据这个session取出数据,那么如果记录session数据的这台服务器突然宕机重启,你在获取消费记录时就会出错,因为记录的session因宕机没有了;那么如果是REST风格的,服务器端没有存session,而是根据用户id直接查询(如/show/uid/18821099657),这样子即便宕机重启,也是可以查到消费数据的。

1.3 play的优点和缺点

万物皆有利弊,play框架同样如此,有利也有弊。


安装简单,下载一个压缩包,解压即可;
集成度高,无需安装apache,可以直接launch运行;
修改代码后,无需重新发布,直接刷新浏览器即可;
标签库简单易用,提高开发效率;


国内不是主流框架,使用者较少;
开发资料较少、开发社区不活跃;
简言之,play的有点是开发效率高,缺点是太小众,国内用的较少,不像ssh或者spring这样有丰富的学习资料。

2 play教程 第二课

​ play教程 第二课:创建项目

2.1 搭建开发环境

2.1.1 安装JDK

​ (略)

2.1.2 安装jdk1.7版本

​ (略)

2.1.3 安装mysql

​ (略)

2.1.4 安装Eclipse

​ (略)

2.1.5 安装play

1、下载play压缩包(通常用的版本是1.2.7,注意1.2.7的版本要求jdk是1.7版本)。
2、解压play压缩包。自己建一个文件夹,将Play解压到这个文件夹,如D:/develop。
3、配置环境变量。右键计算机->属性->高级系统设置->环境变量->编辑“path”,将play路径加进去,如D:\develop\play-1.2.7。

2.1.6 在Eclipse中安装play插件

将support->eclipse文件夹下的org.playframework.playclipse_0.7.0.jar拷贝到eclipse安装路径下的plugins文件夹,

启动eclipse即可看到顶部状态栏多了play的图标。

2.2 创建项目

2.2.1 通过命令行创建项目

在D盘新建一个文件夹叫play-workspace。
打开命令行(快捷键window+R输入cmd然后回车,或者开始-附件-命令提示符),切换至play-workspace目录下。
输入命令,play new hello,这时候会提示输入项目名称,可以直接用hello(也可以用其它的名称)。
到play-workspace查看,会发现目录下,多了一个项目叫hello。

2.2.2 生成Eclipse可用的项目

依然在play-workspace目录下,依然通过命令行输入命令play eclipsify hello。
再回到hello目录下查看,会发现hello目录下,多了eclipse文件夹,此时就可以将该项目导入Eclipse了。

2.2.3 在Eclipse中运行项目

导入项目后,展开eclipse目录,右键单击hello.launch,run as运行。

2.2.4 在浏览器中浏览项目

配置端口——打开conf目录下的application.conf,找到http.port,默认是9000端口,去掉前面的#,

如需更改端口号,直接在此更改即可,如改为9999。
浏览器中输入localhost:9000,回车,即可看到项目默认页面。

3 play教程 第三课

​ play教程 第三课:初识play运行机制

你叫什么名字,今年多大?

3.1 MVC

play架构风格是严格按照MVC架构的,分别对应app目录下面的三个文件夹——models、views、controllers,

由此形成了play独特的包结构。play的包结构是颠覆我们之前用过的那些框架的,比如springMVC、struts等。

实体类全部在models文件夹中定义,包括对数据库的操作方法也都写在实体类中(后文具体讲解);

业务逻辑统统在controllers层定义;html文件即展示层都在views包中定义。

​ 图4-1

3.2 创建Controller

在controller包下新建一个类,取名Sayhello,并让其继承Controller类,在此类中写两个方法,先不要问为什么,

一字不漏、不差地写这样两个个方法。

public static void index() {render();
}
public static void age(String name,String age){render(name ,age );
}

3.3 创建views层展示文件

在views包下,创建一个文件夹名称叫Sayhello,注意必须要和controllers下刚才创建的那个类完全一样的名字,在这个文件夹下新建两个html页面,名字叫index.html和age.html,注意必须和Sayhello类中的那个方法名完全一样的名字。

在index.html中写一个form表单,用来提交姓名和年龄。

 你叫什么名字?今年多大?<form action= "@{Sayhello.age()}" method ="post">姓名:<input type ="text" name="name"/>年龄:<input type ="text" name="age"/><input type= "submit" name ="hello" value="提交"/></form>

在age.html中写这样一句

<h1> Hello,my name is ${name?:'guest'} and I'm ${age} years old.</h1>

3.4 运行项目

在浏览器地址栏中输入localhost:9000/Sayhello/index,填写姓名和年龄,点击提交,

页面跳转至age.html并显示刚才输入的姓名、年龄。

3.5 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

4 play教程 第四课

​ play教程 第四课 路由配置----routes配置文件的使用

routes配置文件是play中很棒的一个文件,给我们提供了极大的方便,也正是这个文件的妙用,助力了play的REST风格。

简单讲,routes配置文件的目的就是给出地址栏一个url,通过routes文件要找到相应的controllers层下面的方法进行处理。

4.1 语法

routes文件包含三个主要部分:

​ part1——HTTP请求方法(如GET/POST/DELETE等),

​ part2——URI(浏览器访问的路径格式),

​ part3——controllers层的方法。

​ 图4-1

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:请求查询服务器的性能,或查询与资源相关的选项和需求。

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,也可访问到该资源。

4.4 Controller方法

最后一部分的元素就是Controller元素,这里对应写controller层下的操作方法。

注意这里的方法在controller类里一定要用public static 修饰,否则是找不到的。

如果controller类在多级包下面,就需要加上包名, packagename.ControllerName.MethodName

4.5 访问静态资源

GET /public staticDir:public

通过这种方式,可以定位到public目录,但是单独一个目录是不能打开的,你可以通过在浏览器中输入localhost:9000/public/images/a.png这种url来定位到public下的某个资源。

4.6 注释

我们可以给route文件增加注释,以#开头

#显示Blog列表
GET         /blog                              Blog.show

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...);

5.1 类同比较

5.1.1 与servlet类比

传统的Servlet中,我们在dopost()/doget()方法进行操作,通过request对象获取数据,通过response对象返回数据。

5.1.2 与Struts中的Action类比

Action是struts的核心功能,通过类似下面的配置文件来配置接收类和返回地址

<action name="user" class="org.lesson05.UserAction"><result name="success">/Methods/list.jsp</result>
</action>

5.1.3 与SpringMVC的Controller类比

play的Controller和SpringMVC中的Controller最为相似,

如下是SpringMVC的Controller写法,指定了来回传递的参数和返回的页面

@RequestMapping({"/hello" ,"/" })/**** @param name 页面传来的值* @param model 返回给页面的值* @return*/
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";
}

5.2 约法三章

1.所创建的Controller类必须在app/controllers目录下,目录名不能变
2.所创建的Controller类必须继承play.mvc.Controller类
3.所创建的Controller类中的方法必须是public static修饰

5.3 如何传参

5.3.1 传参的几种方法

​ 1./article?id=123
​ 2./article/123
​ 3.POST传参
​ Play能接受所有的传参形式,并且能够自动转换参数类型

5.3.2 传递日期

日期数据支持以下几种格式的自动转换:

* 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<Article> articles = Article.findBy("date >= ?", from);
render(articles);
}

5.3.3 传递数组或集合

所有被支持的类型都可以通过数组或者集合来获取:

public static void show(Long[] id) {...
}

或者

public static void show(List<Long> id) {...
}

或者

public static void show(Set<Long> id) {...
}

5.3.4 传递对象

如前端通过这种方式传参

addSubscriber?user.name=Wayne&user.login=wayneellis&user.password=secret

我们在后台可以这样接收

public static void addSubscriber(User user) {...
}

5.3.5 传递文件

在 Play 框架中处理文件上传是非常简单的事,一个 multipart/form-data 编码的请求发送到服务器,

Play 框架会自动为该上传文件生成一个 File 对象。如下所示:

前端页面

<form method="post" action= "@{Products.upload()}" enctype="multipart/form-data" ><input type= "file"name ="photo">
</form>

后台逻辑

public static void upload(File photo) {//...
// 保存图片操作
//...
}

5.4 Response

在play中,通常有两类response的方式——render和redirect,下面具体介绍。

5.4.1 Render

5.4.1.1 render()

render()方法是最常用的,直接跳转至与该方法同名的html,

当然,我们也可以通过这种方式,跳转至指定的html文件(即play术语中所谓的模版)

render(“Application/dontSayHello.html”, myName);

如果需要传参,那么直接在render()方法中写上参数即可,如render(args1,args2),页面接收直接用“{}”取值,如{}”取值,如{args1}。

5.4.1.2 renderJSON()

这个方法用来传递JSON格式的数据,比如我们在使用ajax时,如果用到json格式数据,那么就需要这个方法。

5.4.1.3 renderText()

简单传递一个text。

5.4.1.4 renderXML()

返回XML格式的对象。

5.4.1.5 renderBinary()

可以传回去一个文件或者输入流对象。
需要说明一点,render下面的语句是不被执行的,如

public static void sayHello(String myName) {render(myName);// Warning: this code will never be executed!System.out.println(“这一行是不能被执行的,不信你试试!”);
}

5.4.2 Redirect

Play 提供了一个 redirect 方法,可以将请求调整到其他的 URL 地址:

public static void index() {redirect("http://www.baidu.com");
}

5.5 Action链

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);}
}

6 play教程 第六课

​ play教程 第六课 play中的session

Play中对session的处理,和其他框架有明显的区别。

在Servlet中,session是存放在服务器端的,并且可以存在于整个会话过程,这样的缺点是万一服务器端出现问题(如超负载、系统运行出错导致异常等),那么用户数据就没了。回想一下,我们以前在开发过程中也会遇到这种问题,用户信息存放在session中,但是因为某种不确定因素,session没了,需要重新登录系统,而这正是play所不倡导的。

那么问题来了,难道play中没有session吗?非也。

play中也有session,但是它的session是存放在客户端的,类似于我们平常所说的cookie。这样就不会因为服务器的种种原因导致session清空了。

session .put("cardid" , cardid );//session存值
session.get("cardid");//session取值
session.remove("cardid");//清除session

页面取值

#{if session.user != null}<li><a href="@{Authenticate.logout()}">Logout</a></li>
#{/if}

特别注意:因为session是通过Cookie存放于浏览器的,

所以数据大小不能超过4k,而且只能存放字符串,另外千万注意不能存放敏感数据。

7 play教程 第七课

​ play教程 第七课 View的用法 模版的用法

view(视图)是play中MVC三大组件之一。
Play 框架有自己的模板引擎来生成HTML页面,该引擎使用 Groovy 做为表达式语言。Groovy和我们之前使用的JSTL表达式类似,

在学习play过程中,无需学习Groovy 所有的知识,你需要了解的只是跟 Java 非常相近的一部分,够我们开发过程中使用即可。

Play所有的模板文件都放在 app/views 目录下,所有页面都是在请求时即时解析的。

7.1 表达式

${...}

这就是表达式,例如

${student.name}

${totalcount}

这里要说明一点的是,有时候我们取出来的值会有html标签,尤其是在博客系统中,使用了Editor编辑器插件后,通常会有这种情况,

但是play默认是过滤掉html标签的,如果需要,我们可以通过${content.raw()}来取消过滤,即在所取内容后面加一个”.raw()”。

7.2 标签

play中的标签以“#”开头,需要注意的是,标签有开始标签就有结束标签,如

#{list items:users, as:'user'}<li>${user}</li>
#{/list}

或者

#{if user.admin}<li>#{a @Application.admin()}Admin#{/a}</li>
#{/if}
#{else}<li>#{a @Application.admin()}Admin#{/a}</li>
#{/else}

7.3 Actions

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

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

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

<a href="/Application/logout">Logout</a>

7.4 注释

这里有专门的注释标签{…}

7.5 脚本

同样的,play的页面也可以向jsp那样写一些逻辑操作脚本,比如

%{ fullname = user.firstname + “ “ + user.lastname; }%
<h1>Welcome ${fullname}!</h1>

但是,我觉得为了代码美观,不到万不得已,还是不要这样做了,可以在后台处理的事情为什么要放到前台呢?

7.6 模版

模版这个概念在play中又是一个亮点。模版的目的很简单,就是为了增强页面代码的复用性,提高开发效率。
当我们新建一个play项目后,会发现在views层有一个main.html,如果我们打开它,会发现其中的代码是这样的:

<html>
<head><title>#{get 'title' /}</title>
</head>
<body>#{doLayout /}
</body>
</html>

我们新建一个hello.html文件,在其中写这样一段

#{extends 'main.html' /}
#{set title:'Home' /}
<h1>Hello World!</h1>
What is your name?
<form action="@{Application.sayHello()}" method="POST"><input type="text" name="myName" /><input type="submit" name="hello" value="Say hello!" />
</form>

那我们来分析一下这两个html文件,首先来看main.html,这里有两个关键点#{get ‘title’ /}和#{doLayout /}

#{get}顾名思义,这个标签是用来接收值的,有接收就有设定,那它对应的就是#{set};
#{doLayout/},按字面意思,这里应该是布局代码段,没错,我们在hello.html中的那一段正是填充到这里的。

那么play如何知道怎么填充呢?答案是用#{extends/}标签。
通过总结,我们发现play模版中的几个关键标签:

#{doLayout/}
#{extends/}
#{get/}
#{set/}

模版这个概念在实际开发过程中还是发挥了较大作用的,比如公用的header,公用的footer,公用的frame等。

7.7 自定义标签

如果你喜欢在开发中定义自己的标签,那么可以这样做:
首先我们需要在views目录下创建名为 tags的子目录,例如我们创建一个 booklist.html 文件,存放在 views/tags 目录下,

booklist.html 的代码如下:

<ul>#{list items:_items, as:'book'}%{bookTitle = book.title.toUpperCase();}%<li>${bookTitle}</li>#{/list}
</ul>

那我们在使用的时候可以这样来用:

#{booklist items:books /}

通过这种自定义标签,就大大提高了代码的复用性。

8 play教程 第八课

​ play教程 第八课 Model的用法 play中的JPA

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;/*** 查看收货地址是否已存在* @param name* @param address* @return*/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;}}/*** 根据 userid查询* @param userid* @return*/public static List<Address> 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在想尽一切办法帮我们提高开发效率,这种无聊的工作交给框架后台处理,我们应该专注做一些有价值的逻辑开发。

8.2 启用数据库

在play中用“启用”这两个字比较贴切,因为他不需要什么加载驱动、创建链接之类的繁琐步骤,

只需要在/conf/application.conf文件中配置一下就可以,而且这里的配置非常简单。

下面我们介绍两种启用数据库的方法,均已mysql为例。

8.2.1 第一种方法

# 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

8.2.2 第二种方法

# 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=secret

在application.conf文件中找到这样几行,把粗体的几行去掉“#”,同样,根据自己的实际情况,修改配置信息.
举个栗子

db.url=jdbc:mysql://localhost/hellodb
db.driver=com.mysql.jdbc.Driver
db.user=root
db.pass=123456

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<User> users = User.find(“admin = ?”, “true”).fetch();

怎么样,是不是很奇妙,很简单?It’s so easy.
再举个栗子。

    /*** 添加地址* @param address* @param telephone* @param name* @param userid*/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);}/*** 根据用户ID查出地址信息* @param userid*/public static void show(Long userid){List<Address> addresses = Address.findByCardid(getCardid());Map<String,Object> resultMap = convertToMap(addresses);renderJSON(resultMap);}/*** 删除收货地址* @param addrid*/public static void del(Long addrid,Long userid){Address addr = Address. findById(addrid);addr. del = true;addr.save();}

9 play教程 实现多文件上传

​ play framework实现多文件上传

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

9.1 html代码

<form id="edit-profile" method="post" enctype="multipart/form-data"  action="/Blogs/saveFile"><input type="file" multiple id="qfile" name="fileabc"><button type="submit" class="btn btn-primary" >Save</button>
</form>

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

  • form表单中的method必须是post
  • 文件上传的必须要有name属性,随便起个名就可以,不需要和后台Controller类有任何呼应关系

9.2 java代码

public static void saveFile(String abc) {// 保存图片List<Upload> files = (List<Upload>) 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,注意,这里是双下划线,多一个少一个变一个都不行!
以上提到需要注意的四点,必须严格执行,否则就会出现空指针错误。

亲测可用,如果有问题请留言。

26Play框架教程1学习笔记相关推荐

  1. 26Play框架教程2学习笔记

    Play框架教程2学习笔记 文章目录 1 play框架01 1.1 概述 1.2 特性 1.2.1 无缝集成现有开发环境 1.2.2 热重载和修改Bug 1.2.3 简单的无状态MVC架构 1.2.4 ...

  2. MongoDB 入门教程实战学习笔记-31-mongo 聚合查询管道 Aggregation Pipieline

    aggregation 聚合操作处理数据记录并返回计算结果. 聚合操作将多个文档中的值组合在一起, 并且可以对分组数据执行各种操作以返回单个结果. mongodb 提供了三种执行聚合的方法: 聚合管道 ...

  3. python编程16章教程_Python学习笔记__16.2章 TCP编程

    # 这是学习廖雪峰老师python教程的学习笔记 Socket是网络编程的一个抽象概念.通常我们用一个Socket表示"打开了一个网络链接",而打开一个Socket需要知道目标计算 ...

  4. 前端获取div里面的标签_web前端教程JavaScript学习笔记DOM

    web前端教程JavaScript学习笔记 DOM一DOM(Document Object Model): 文档对象模型 其实就是操作 html 中的标签的一些能力 我们可以操作哪些内容 获取一个元素 ...

  5. 机器学习框架ML.NET学习笔记【1】基本概念与系列文章目录

    一.序言 微软的机器学习框架于2018年5月出了0.1版本,2019年5月发布1.0版本.期间各版本之间差异(包括命名空间.方法等)还是比较大的,随着1.0版发布,应该是趋于稳定了.之前在园子里也看到 ...

  6. 机器学习框架ML.NET学习笔记【5】多元分类之手写数字识别(续)

    一.概述 上一篇文章我们利用ML.NET的多元分类算法实现了一个手写数字识别的例子,这个例子存在一个问题,就是输入的数据是预处理过的,很不直观,这次我们要直接通过图片来进行学习和判断.思路很简单,就是 ...

  7. 《C++大学教程》学习笔记(九)

    <C++大学教程>学习笔记(九) 1.Time类实例研究 1.1包含防护 在开始之前,先说明一个重要的C++软件工程概念:在头文件中使用"包含防护",从而避免头文件中的 ...

  8. 《崔庆才Python3网络爬虫开发实战教程》学习笔记(5):将爬虫爬取到的数据存储到TXT,Word,Excel,Json等文件中

    本篇博文是自己在学习崔庆才的<Python3网络爬虫开发实战教程>的学习笔记系列,此套教程共5章,加起来共有34节课,内容非常详细丰富!如果你也要这套视频教程的话,关注我公众号[小众技术] ...

  9. 《Solid Edge高级应用教程》学习笔记

    <Solid Edge高级应用教程>学习笔记 第一章.绪论 第一节.CAD概论 计算机辅助设计(Computer Aided Design,简称CAD)是一种用计算机硬件.软件系统辅助人们 ...

最新文章

  1. 导入表注入原理和C语言实现
  2. 普中51控制火焰传感器_热电偶在煤气灶天然气保护控制中的应用原理
  3. Struts2-从值栈获取list集合数据(三种方式)
  4. Nginx+PHP-FPM——Nginx日志:[Primary script unknown] 网页:[file not found. ]解决方案
  5. 块存储、文件存储、对象存储意义及差异
  6. Hadoop入门(二十二)Mapreduce的求平均值程序
  7. linux 命令详解 十六
  8. Docker 安装solr 配置IK分词,说明
  9. Python_collections_Counter计数器部分功能介绍
  10. 为什么 Math.min() 比 Math.max() 大?
  11. sd卡的速度怎么测试软件,【有图】怎么测SD卡的速度-蜂鸟网
  12. win2003群集cluster下SQL2005和sp3补丁安装配置3
  13. Redis学习(三) - Redis客户端对比及配置(SpringBoot)
  14. 黑盒测试---等价类划分
  15. 如何设计签名 我的名字
  16. 淘宝购物车计算总价格
  17. vue把几张图片logo。二维码。背景合成一个海报并下载,使用canvas
  18. 计算机 复杂度符号 英语 怎么读,~!#$%^*这些符号怎么读? 当然是用英语(键盘特殊符号小结)...
  19. 关于《机器学习决策树导出图片、PDF支持中文》解决办法
  20. Python模拟二维码登录百度

热门文章

  1. 笔记本电脑排名前十 电脑排行榜笔记本前十名2023
  2. nginx下支持PATH_INFO详解
  3. 2007年北京高考作文,惊为天人
  4. java数据结构学习笔记-二叉树前、中、后序遍历
  5. 45.古代某工地需要搬运砖块,已知男人每人每次搬3块,女人每人每次搬2块,小孩两人每次抬一块,现有45人一次正好搬完全部砖块,请问男人、女人、小孩各几人?
  6. word文档中论文如何查看字数?
  7. 连续系统的零状态响应与零输入响应
  8. 以PDF转DjVu为例分析软件和人工转换的区别
  9. 多任务——Cross-stitch
  10. js是滚动条滑到固定位置_js滚动到指定位置