26Play框架教程1学习笔记
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学习笔记相关推荐
- 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 ...
- MongoDB 入门教程实战学习笔记-31-mongo 聚合查询管道 Aggregation Pipieline
aggregation 聚合操作处理数据记录并返回计算结果. 聚合操作将多个文档中的值组合在一起, 并且可以对分组数据执行各种操作以返回单个结果. mongodb 提供了三种执行聚合的方法: 聚合管道 ...
- python编程16章教程_Python学习笔记__16.2章 TCP编程
# 这是学习廖雪峰老师python教程的学习笔记 Socket是网络编程的一个抽象概念.通常我们用一个Socket表示"打开了一个网络链接",而打开一个Socket需要知道目标计算 ...
- 前端获取div里面的标签_web前端教程JavaScript学习笔记DOM
web前端教程JavaScript学习笔记 DOM一DOM(Document Object Model): 文档对象模型 其实就是操作 html 中的标签的一些能力 我们可以操作哪些内容 获取一个元素 ...
- 机器学习框架ML.NET学习笔记【1】基本概念与系列文章目录
一.序言 微软的机器学习框架于2018年5月出了0.1版本,2019年5月发布1.0版本.期间各版本之间差异(包括命名空间.方法等)还是比较大的,随着1.0版发布,应该是趋于稳定了.之前在园子里也看到 ...
- 机器学习框架ML.NET学习笔记【5】多元分类之手写数字识别(续)
一.概述 上一篇文章我们利用ML.NET的多元分类算法实现了一个手写数字识别的例子,这个例子存在一个问题,就是输入的数据是预处理过的,很不直观,这次我们要直接通过图片来进行学习和判断.思路很简单,就是 ...
- 《C++大学教程》学习笔记(九)
<C++大学教程>学习笔记(九) 1.Time类实例研究 1.1包含防护 在开始之前,先说明一个重要的C++软件工程概念:在头文件中使用"包含防护",从而避免头文件中的 ...
- 《崔庆才Python3网络爬虫开发实战教程》学习笔记(5):将爬虫爬取到的数据存储到TXT,Word,Excel,Json等文件中
本篇博文是自己在学习崔庆才的<Python3网络爬虫开发实战教程>的学习笔记系列,此套教程共5章,加起来共有34节课,内容非常详细丰富!如果你也要这套视频教程的话,关注我公众号[小众技术] ...
- 《Solid Edge高级应用教程》学习笔记
<Solid Edge高级应用教程>学习笔记 第一章.绪论 第一节.CAD概论 计算机辅助设计(Computer Aided Design,简称CAD)是一种用计算机硬件.软件系统辅助人们 ...
最新文章
- 导入表注入原理和C语言实现
- 普中51控制火焰传感器_热电偶在煤气灶天然气保护控制中的应用原理
- Struts2-从值栈获取list集合数据(三种方式)
- Nginx+PHP-FPM——Nginx日志:[Primary script unknown] 网页:[file not found. ]解决方案
- 块存储、文件存储、对象存储意义及差异
- Hadoop入门(二十二)Mapreduce的求平均值程序
- linux 命令详解 十六
- Docker 安装solr 配置IK分词,说明
- Python_collections_Counter计数器部分功能介绍
- 为什么 Math.min() 比 Math.max() 大?
- sd卡的速度怎么测试软件,【有图】怎么测SD卡的速度-蜂鸟网
- win2003群集cluster下SQL2005和sp3补丁安装配置3
- Redis学习(三) - Redis客户端对比及配置(SpringBoot)
- 黑盒测试---等价类划分
- 如何设计签名 我的名字
- 淘宝购物车计算总价格
- vue把几张图片logo。二维码。背景合成一个海报并下载,使用canvas
- 计算机 复杂度符号 英语 怎么读,~!#$%^*这些符号怎么读? 当然是用英语(键盘特殊符号小结)...
- 关于《机器学习决策树导出图片、PDF支持中文》解决办法
- Python模拟二维码登录百度