Play!是一个full-stack(全栈的)Java/Scala Web应用框架,包括一个简单的无状态MVC模型,具有Hibernate的对象持续,一个基于Groovy的模板引擎,以及建立一个现代Web应用所需的所有东西。

Mongo DB 是目前在IT行业非常流行的一种非关系型数据库(NoSql),其灵活的数据存储方式备受当前IT从业人员的青睐。Mongo DB很好的实现了面向对象的思想(OO思想),在Mongo DB中 每一条记录都是一个Document对象。Mongo DB最大的优势在于所有的数据持久操作都无需开发人员手动编写SQL语句,直接调用方法就可以轻松的实现CRUD操作。

ReactiveMongo 是一个 MongoDB 的 Scala 驱动,提供完全的非堵塞和异步 I/O 操作。

以上就百度百科对Play! 以及MongoDB的简介。这篇博客就是简单的介绍Play+Mongo的环境搭建。

工具与环境:

  • 编译器 -IDEA
  • Scala -version 2.11.6
  • Play -version 2.3.10
  • MongoDB -version 3.0.6
  • Sbt -version 0.13.8
  • Reactivemongo -version 0.10.5.0.akka23

安装

首先你得安装Play!以及MongoDB

play!的安装不必多说,下载安装SBT,去Play官网下载Activator,添加环境变量,然后activator new 一个工程就可以了。

创建好mosquito-mongo工程目录如下:

MongoDB的安装也很简单,去官网下载安装,然后添加环境变量就可以。不过需要注意,要自己指定数据存放位置。如,我将数据存放在D:\MongoDB\data中,只需要在d:\MongoDBdata文件夹就行:

然后就可以这样启动:

到这里,playmongodb就都已安装好了,接下来我们可以实现一个小的demo。

配置

添加play.plugins插件。在项目根目录下的conf/文件夹下,创建play.plugins插件并加入

1100:play.modules.reactivemongo.ReactiveMongoPlugin

添加reactivemongo依赖。打开项目根目录下build.sbt,添加:

"org.reactivemongo" %% "play2-reactivemongo" % "0.10.5.0.akka23"

配置连接。打开项目根目录下的conf/文件夹下application.conf,加入:

# ReactiveMongo

mongodb.uri = "mongodb://localhost:27017/mosquito"

mongo-async-driver {
akka {
loglevel = DEBUG
}
}

建立全局的Global来获取connection。在app目录下创建Global.scala文件,并添加:

package global

object Global extends GlobalSettings {

	def db = ReactiveMongoPlugin.db
def collection = db.collection[JSONCollection]("user") override def onStart(app: Application) {
Logger.info("Application has started")
} override def onStop(app: Application) {
Logger.info("Application shutdown...")
}
}

然后还需要在conf/文件夹下application.conf,加入:

application.global=global.Global

到此,所有配置都已结束,接下来实现业务逻辑了。

实现

建立模型。根目录下建立models文件夹(如果没有的话),并建立User.scala,并加入:

package models

import play.api.libs.json.Json

case class User(
var id:Option[Long],
var name:Option[String],
var password:Option[String],
var address :Option[String] = None) trait JSONFormats { implicit val UserFormats = Json.format[User] }

实现。在controllers/下的Application.scala中加入以下代码:

package controllers

import akka.util.Timeout
import global.Global
import models.{JSONFormats, User}
import play.api.libs.concurrent.Execution.Implicits.defaultContext
import play.api.libs.json._
import play.api.mvc._ import scala.concurrent.Await
import scala.concurrent.duration._ // Reactive Mongo plugin, including the JSON-specialized collection
import play.modules.reactivemongo.MongoController object Application extends Controller with MongoController with JSONFormats { implicit val timeout = Timeout(10 seconds) def index = Action {
Ok(views.html.index("Your new application is ready."))
} def add = Action { request =>
request.body.asJson.get.validate[User] match {
case s:JsSuccess[User] =>{
val user = s.get
Global.collection.insert(user)
Ok(Json.obj("code" -> 200, "message" -> Json.toJson(user)))
}
case e:JsError => {
InternalServerError(Json.obj("code" -> 500, "message" -> e.toString))
}
}
} def query = Action.async { val userList = Global.collection.find(Json.obj())
.cursor[User].collect[List](upTo = 100, stopOnError = true) userList.map(
list => Ok(Json.obj("code" -> 200, "message" -> Json.toJson(list))))recover {
case e : Exception => InternalServerError(Json.obj("code" -> 500, "message" -> JsNull))
} } def retrieve(id:Int) = Action.async { val userOpt = Global.collection.find(Json.obj("id" -> id)).cursor[User].headOption userOpt.map(
user => Ok(Json.obj("code" -> 200, "message" -> Json.toJson(user)))) recover {
case e : Exception => InternalServerError(Json.obj("code" -> 500, "message" -> JsNull))
} } def test = Action.async { request =>
val reqJson = request.body.asJson.get val name = (reqJson \"name").asOpt[String]
val password = (reqJson \"name").asOpt[String]
val address = (reqJson \"address").asOpt[String]
val idOpt = getId val user = User(
idOpt,
name,
password,
address
) Global.collection.insert(user).map(
u => Ok(Json.obj("code" -> 200, "message" -> Json.toJson(user))))recover {
case e : Exception => InternalServerError(Json.obj("code" -> 500, "message" -> "Oops"))
} } def getId:Option[Long] = {
var ret = None:Option[Long]
val userList = Global.collection.find(Json.obj())
.cursor[User].collect[List](upTo = 100, stopOnError = true) val lastUserOpt = Await.result(userList, timeout.duration).lastOption if(lastUserOpt.isDefined){
val id = lastUserOpt.get.id.get + 1
ret= Option(id)
} ret
} }

说明。

  • add 新增
  • query 查询所有
  • retrieve 查询单个(根据id查询)
  • test 测试uid自增插入
  • getId 获取最大uid传递给test(很low的方式,通过查询出最大的id再+1赋值)

配置路由。在conf/文件夹下的routes中加入对应的路由:

GET        /user/:id            controllers.Application.retrieve(id:Int)
PUT /user controllers.Application.add
GET /query controllers.Application.query
PUT /test controllers.Application.test

总目录结构如下:

测试

最后是跑一下。运行起来后直接自动建库、建表。

运行成功。

测试一下查询。

测试一下新增(id自增)。

最后再查询全部。

Github源码

Play Framework + ReactiveMongo 环境搭建的更多相关文章

  1. Robot framework + appium环境搭建

    Robot framework+appium环境搭建 首先梳理一下要用到的工具和安装包: 1. Android + JAVA. jdk : http://www.oracle.com/technetw ...

  2. Robot Framework自动化测试环境搭建

    robotFramework是一个通用的自动化测试框架来进行验收测试和验收测试驱动开发模式,它具有易于使用的表格的测试数据和关键字测试驱动方法,其测试功能可通过实现与python或java的测试库进行 ...

  3. Robot Framework的环境搭建

    1.Robot framework的安装 作用:web自动化测试框架. RF框架是基于python 的,所以一定要有python环境.网上可以自行查找. 下载地址:https://pypi.pytho ...

  4. .net framework msbuild环境搭建 (不装vs)

    1. 安装 .net framework sdk 小于等于 .net framework 4.5 版本的 .net framework sdk 通过 windows sdk 工具安装 从下面额链接找到 ...

  5. play framework 从环境搭建到简单运行

    download 官网:https://www.playframework.com/ 将zip下载至本地,进行unzip. 环境变量 检测是否安装成功:解压成功后进入解压的目录,运行 play 终端显 ...

  6. appium手机自动化环境搭建

    在robotframework环境安装完成的基础上进行如下安装,如果没有安装rfs环境,请先参考robotframework安装文章:Robot Framework的环境搭建 文件下载地址:链接:ht ...

  7. Zend Framework学习日记(1)--环境搭建篇(转)

    Zend Framework学习日记(1)--环境搭建篇 (1)开发工具 Zend Framework框架:http://framework.zend.com/download/latest 包含2个 ...

  8. robot framework环境搭建和简单示例

    环境搭建 因为我的本机已经安装了python.selenium.pip等,所以还需安装以下程序 1.安装wxPythonhttp://downloads.sourceforge.net/wxpytho ...

  9. robot framework环境搭建(转)

    一. robot framework环境搭建: 官网:http://robotframework.org/ 序号 安装包名 安装方法 下载地址 备注 1 python exe文件,直接双击安装 htt ...

随机推荐

  1. js获取input file路径改变图像地址

    版权声明:好歹是我写的或者总结的或者抄的,总待给我个名份吧~ https://blog.csdn.net/sangjinchao/article/details/52250318 html代码 < ...

  2. 快来看看Google出品的Protocol Buffer,别仅仅会用Json和XML了

    前言 习惯用 Json.XML 数据存储格式的你们,相信大多都没听过Protocol Buffer Protocol Buffer 事实上 是 Google出品的一种轻量 & 高效的结构化数据 ...

  3. PPT之SmartArt功能

    在PPT中,我们经常看到这样的漂亮的组合图标: 他们是怎么做出来的呢?其实用ppt自带的SmartArt功能就能做出来了. Tips:SmartArt可以直接先选择组合图标再填文字,还可以写好了文字, ...

  4. 子查询及exists

    子查询分为无关子查询和相关子查询 无关子查询,只查询一次,与外查询无关,可作为查询条件: select * from student where sno in (select sno from stu ...

  5. Linux之定时任务Crond介绍

    Linux之定时任务 定时任务Crond介绍 Crond是linux系统中用来定期执行命令/脚本或指定程序任务的一种服务或软件,一般情况下,我们安装完Centos5/6 linux操作系统之后,默认便 ...

  6. 【BZOJ 1036】[ZJOI2008]树的统计Count

    [题目链接]:http://www.lydsy.com/JudgeOnline/problem.php?id=1036 [题意] [题解] 树链剖分入门题; 每一条链维护一个线段树就好; uppest ...

  7. Android菜鸟的成长笔记(22)——Android进程间传递复杂数据(AIDL)

    在上一篇中介绍了Andorid中的进程间的通信方式AIDL,本篇文章将介绍传递复杂数据的AIDL Service 下面通过一个示例说明: 本例子中用到了两个自定义类型:Person与Pet, 其中Pe ...

  8. 关于J2SE/Jsp/Sping/Hibernate/Struts2的视频下载

    我是一名程序猿,从大学就開始学计算机.后来參加了编程工作.如今我认为若要做一名程序猿须要具备三个条件,这三个条件也是衡量一个人能否够成为程序猿的条件. 1.对计算机拥有浓厚的兴趣. 2.良好的逻辑思维 ...

  9. Linux在出现/java: cannot execute binary file

    位这样的情况下通常的虚拟机(32和64)不匹配造成的.再次,你的虚拟机下一场比赛JDK的版本号的 在与X64它是64位置,另32位置 版权声明:本文博主原创文章.博客,未经同意不得转载.

  10. Android中去掉标题的方法总结

    方法一:也一般入门的时候经常使用的一种方法在setContentView()方法的前面插入代码: requestWindowFeature(Window.FEATURE_NO_TITLE);//去掉标 ...