数据库是整个站点的数据储藏室。用户提交的数据可以存储在数据库中,以便未来使用。Play可以通过JDBC和数据库通信。我讲介绍Play和mysql数据库的连接。
Play 2.*版本的默认操作数据库的方式是通过Ebean。Play提供Finder这一帮助类型,可以实现一些简单的数据库查询。
数据库准备
在mysql中增加数据库testing。增加用户"player",密码为"player"。为用户player增加适当的权限。
CREATE DATABASE testing DEFAULT CHARACTER SET utf8;
CREATE USER 'player'@'localhost' IDENTIFIED BY 'player';
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, INDEX, ALTER, CREATE TEMPORARY TABLES, LOCK TABLES ON testing.* TO 'player'@'localhost';
为了在Play中使用mysql数据库,需要在conf/application.conf中增加设置:
# Database configuration
db.default.driver=com.mysql.jdbc.Driver
db.default.url="jdbc:mysql://127.0.0.1:3306/testing"
db.default.user="player"
db.default.password="player"
# Ebean configuration
ebean.default="models.*"
还需要修改build.sbt为:
name := "test"
version := "1.0-SNAPSHOT"
libraryDependencies ++= Seq(
javaJdbc,
javaEbean,
cache,
"mysql" % "mysql-connector-java" % "5.1.18"
)
play.Project.playJavaSettings
上面的改动完成后,使用play run来运行服务器。
创建模型
下面,我在模型中增加一个实体(entity),即一个Person类。放入models/Person.java
package models;
import java.util.List;
import javax.persistence.Entity;
import javax.persistence.Id;
import play.db.ebean.Model;
import play.db.ebean.Model.Finder;
@Entity
public class Person extends Model {
@Id
public Integer id;
public String name;
// Query
public static Finder<Integer,Person> find =
new Finder<Integer,Person>(Integer.class, Person.class);
public static List<Person> findAll() {
return find.all();
}
public static Person findByName (String name) {
return find.where().eq("name", name).findUnique();
}
}
Person类继承自Model类,并有一个@Entity的注解,从而说明它是模型中的一个实体。实体有两个场,整数的id和字符串的name,用来保存数据。
@id注解下,id将不为空,不重复,并自动增加。
Person还有一个静态的场find。find是Play提供的Finder类型,用于数据库查询。而Person类中得findAll()和findByName()的静态方法中,就调用了find,从而在数据库中查询条目。
Play有evolution模块,管理数据库的表。写好Person.java后,访问项目。Play这时会生成在mysql中建立表格的脚本。运行该脚本即可。
增加数据库条目
增加一个动作。这个动作向数据库增加条目:
public static Result addPerson() {
Person p1 = new Person();
Person p2 = new Person();
p1.name = "vamei";
p2.name = "play";
p1.save();
p2.save();
return ok("Saved");
}
*** 上面的代码要import models.Person。
将/addPerson这一URL对应该动作。访问后,数据库将增加条目:
练习 根据表单一讲的内容,增加一个向数据库添加条目的表单。
数据库查询
我可以在动作中调用刚才定义的查询方法findAll()和findByName(),比如增加allPerson()动作:
public static Result allPerson() {
List<Person> persons = Person.findAll();
return ok(views.html.personList.render(persons));
}
上面查询得到的Person类型的表,传递给模板views/personList.scala.html:
@(personList: List[models.Person])
<!DOCTYPE html>
<html>
<body>
<ul>
@for(person <- personList) {
<li>@person.name</li>
}
</ul>
</body>
</html>
修改routes,增加对应的URL为/allPerson,页面如下:
事实上,我也可以在动作中直接调用Person.find,来组成查询语句。这将让动作内部有更大的查询自由度。比如上面的动作可以改写成:
public static Result allPerson() {
List<Person> persons = Person.find.all();
return ok(views.html.personList.render(persons));
}
使用模板
我首先创建一个模板,纯粹起视图功能。在app/views文件夹中,新建文件index.scala.html (如果已有,则删除并重新创建)。
<!DOCTYPE html>
<html>
<header>
<title>Play</title>
</header>
<body>
<p>Hello World! Start using the Template.</p>
</body>
</html>
这个模板是个纯粹的html文件,是最简单的模板形式。
修改app/controllers/Application.java:
package controllers;
import play.*;
import play.mvc.*;
public class Application extends Controller {
public static Result index() {
return ok(views.html.index.render());
}
}
ok()中接收的是views.html.index.render(),实际上就是app/views/index.scala.html这一模板的render()方法。Play会根据模板,自动生成相应的类。
*** 也可以用import引入views.html.index,而不是使用完整的类路径。
访问页面:
模板语言
这一部分,我把对象作为参数传给模板,然后在模板中显示对象中包含的数据。修改index.scala.html:
@(title: String, content: String)
<!DOCTYPE html>
<html>
<header>
<title>@title</title>
</header>
<body>
<p>@(content) Start using the template.</p>
</body>
</html>
上面的第一行,以@符号开头,说明了该模板所接收的两个参数,即String类型的title和content。在模板中,用@符号和参数名,来调用参数。参数名周围可以用括号"()",以区分正文。
修改动作:
public static Result index() {
return ok(views.html.index.render("Play", "Hello World! Parameters passed. "));
}
这里传递两个字符串给模板。最终显示的结果中,两个字符串将填充在模板中的适当位置。
上面把一个对象传递给模板。我们还可以在模板中调用对象的属性或方法:
@object.method()
@object.field
模板控制
我还可以用Scala的语法,在模板中实现更复杂的逻辑。比如下面的模板中使用循环:
@(title: String, content: String, lines: List[String])
<!DOCTYPE html>
<html>
<header>
<title>@title</title>
</header>
<body>
<p>@(content) Start using the template.</p>
<ul>
@for(line <- lines) {
<li>@line</li>
}
</ul>
</body>
</html>
循环是@for实现的。@后面不仅可以是一个对象,还可以是一个完整的Scala语法。
修改动作,把一个字符串类型的表作为参数传递给模板:
package controllers;
import play.*;
import play.mvc.*;
import java.util.List;
import java.util.ArrayList;
public class Application extends Controller {
public static Result index() {
List<String> lines = new ArrayList<String>();
lines.add("a");
lines.add("b");
lines.add("c");
return ok(views.html.index.render("Play", "Hello World!", lines));
}
}
得到下面的页面:
模板中还可以有if选择结构,比如
@if(item) {
<p>True</p>
} else {
<p>False</p>
}
根据参数item的真假,if结构显示不同的内容。
其它
在@* *@中加入注释
由于@的特殊功能,为了在模板中显示"@"字符,需要使用@@。
表 3. 模板中可用的动态元素
${...} |
用来对一个表达式进行求值。如 ${note.title} 的值是领域对象 note 的属性 title 的值。 |
@{...} 和@@{...}
|
用来生成调用控制器中动作方法的 URL,可以用在页面的链接中。@{...} 和 @@{...} 生成的分别是相对 URL 和绝对 URL。如 <a href="@{Application.index()}"> 首页 </> 生成一个指向首页的链接。 |
&{...} |
用来显示经过国际化之后的消息内容。 |
*{...}* |
用来添加注释。如 *{ 这是注释 }* 。 |
%{...}% |
用来添加复杂的 Groovy 脚本,可以声明变量和添加语句。 |
#{...} |
用来调用 Play 框架的或是开发人员自定义的标签。 |
相关推荐
通过以上介绍,我们可以看到Play2.0框架提供了丰富的功能和工具,非常适合构建现代化的Web应用程序。Java开发者可以利用这些特性快速搭建出高效、可维护的应用程序。希望本文能够帮助Java开发者更好地理解和掌握Play...
《Play 2.0 文档》是一份详尽的指南,专为希望利用 Play 框架构建现代 Web 应用程序的 Java 和 Scala 开发者设计。Play 2.0 是一个高生产力的框架,它整合了开发现代 Web 应用所需的各种组件和 API,基于轻量级、无...
通过以上步骤,你已经成功地使用Play Framework 2.0 创建了一个简单的待办事项应用。Play Framework以其简洁的API、模块化的设计和强大的工具集,使得开发Web应用变得更加高效和愉快。继续深入学习,你会发现更多...
在这个“Play框架2.0入门教程(四)的源代码”中,我们主要探讨的是如何在Play框架下创建一个基于数据库的留言板应用。 首先,我们需要了解Play框架2.0的核心特性。这个版本引入了更加模块化的设计,支持Scala和...
Play Framework 2.0 是一个基于Java和Scala的开源Web应用程序框架,以其“写后即运行”的特性而闻名。这个入门教程的第三部分是关于如何使用Play Framework构建一个简单的留言板应用。在这里,我们将深入探讨Play ...
GooglePlay2 GooglePlay2.0,应用市场,一款应用下载软件,框架式编程,使用ButterKnife,okHttp网络请求,glide图片加载。 第二版效果图 GooglePlay第一版效果图
Play Framework是一个开源的Web应用框架,使用Scala和Java语言混合编写。Play遵循传统的MVC(Model-View-Controller: 模型、视图和控制器)模式,这一点Lift与其有所不同。 本文主要对Play Framework最新第二版...
Struts2.0是Java Web开发中非常重要的一个框架,它是Apache软件基金会的Jakarta项目下的一个产品。...同时,掌握Struts2.0的源码也有助于向更高层次的Java Web框架,如Spring MVC或Play Framework的迁移。
Socket.io服务器对Play框架的原始支持。 什么是socket.io? socket.io在服务器广告浏览器之间提供独立于浏览器的双向实时套接字式通信。 从 Socket.IO旨在使每个浏览器和移动设备中的实时应用成为可能,从而模糊了...
接着,书会深入到游戏引擎和框架的选择与使用,如使用Unity、Cocos2d-x或原生的Android Game SDK进行开发。这些工具可以帮助开发者快速构建游戏,同时也会讲解如何自定义和扩展它们以满足特定需求。 在图形和动画...
该协议为实现实时数据,如音频和视频的按需传输提供了可扩展的框架。数据源可以是实时数据流或存储媒体片段。 RTSP 2.0协议的主要目的是控制多个数据传输会话,提供选择传输通道的方式,例如使用UDP、多播UDP和TCP...
此外,USB接口支持即插即用(Plug and Play)功能,让设备安装和配置变得非常方便。 在硬件设计方面,USB 2.0规范详细定义了各种技术参数,包括电气特性、信号协议、传输速率、连接器设计、电缆规格以及电源管理等...
play20-spring-demo, 在播放 2.0应用程序中使用 spring 在播放 2.0应用程序中使用 spring的这是一个简单的应用程序演示如何将播放 2.0应用程序组件与 Spring Framework 应用程序集成。请注意,同样的技术可以应用到...
`play2-riak` 是一个专门为 Play Framework 2.0 设计的 Riak 集成模块。Riak 是一个分布式键值存储系统,常用于构建高可用性和可扩展性的数据存储解决方案。Play Framework 是一个用 Java 和 Scala 开发的现代、敏捷...
7. **Google Play服务**:SDK V2.0可能包含Google Play服务的最新版本,这些服务提供了Google Maps、Gmail、Google Sign-In等功能,并且通常伴随着新的API和功能更新。 8. **安全性和隐私**:随着每个版本的更新,...
- C#是.NET框架的基础,用于开发Windows应用,如WinForms项目。它提供了丰富的类库,可以方便地处理多媒体文件。 3. **WinForm**: - WinForms是.NET Framework的一部分,用于构建桌面应用程序的用户界面。在播放...
5. **游戏架构设计**:讨论常见的游戏架构模式,如Model-View-Controller (MVC) 和Entity Component System (ECS),并解释如何应用它们来构建可扩展的游戏框架。 6. **游戏物理引擎**:介绍如何集成物理引擎,如Box...
### Java开源框架下载集合 ...无论是快速搭建Web应用、加速开发流程还是实现复杂的数据处理和报表生成需求,以上介绍的框架都能够提供有力的支持。对于Java开发者而言,熟悉并掌握这些框架的使用方法是非常有益的。
11.在play框架里使用Ajax - 94 - 通过jsAction标签使用jQuery - 95 - 12. Internationalization国际化支持 - 96 - 仅使用 UTF-8! - 96 - 国际化你的信息 - 96 - 通过应用程序定义支持的语言 - 96 - 依照你的区域定义...
该软件需.NET framework 2.0以上框架。 该软件可以运行32位和64位的windows系统。 该软件保存的WMV格式,请用windows自己的播放器打开,windows media player 9.0 软件界面: 系统托盘处: 主...