Play Framework + ReactiveMongo 环境搭建
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:\
下MongoDB
与data
文件夹就行:
然后就可以这样启动:
到这里,play
与mongodb
就都已安装好了,接下来我们可以实现一个小的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自增)。
最后再查询全部。
Play Framework + ReactiveMongo 环境搭建的更多相关文章
- Robot framework + appium环境搭建
Robot framework+appium环境搭建 首先梳理一下要用到的工具和安装包: 1. Android + JAVA. jdk : http://www.oracle.com/technetw ...
- Robot Framework自动化测试环境搭建
robotFramework是一个通用的自动化测试框架来进行验收测试和验收测试驱动开发模式,它具有易于使用的表格的测试数据和关键字测试驱动方法,其测试功能可通过实现与python或java的测试库进行 ...
- Robot Framework的环境搭建
1.Robot framework的安装 作用:web自动化测试框架. RF框架是基于python 的,所以一定要有python环境.网上可以自行查找. 下载地址:https://pypi.pytho ...
- .net framework msbuild环境搭建 (不装vs)
1. 安装 .net framework sdk 小于等于 .net framework 4.5 版本的 .net framework sdk 通过 windows sdk 工具安装 从下面额链接找到 ...
- play framework 从环境搭建到简单运行
download 官网:https://www.playframework.com/ 将zip下载至本地,进行unzip. 环境变量 检测是否安装成功:解压成功后进入解压的目录,运行 play 终端显 ...
- appium手机自动化环境搭建
在robotframework环境安装完成的基础上进行如下安装,如果没有安装rfs环境,请先参考robotframework安装文章:Robot Framework的环境搭建 文件下载地址:链接:ht ...
- Zend Framework学习日记(1)--环境搭建篇(转)
Zend Framework学习日记(1)--环境搭建篇 (1)开发工具 Zend Framework框架:http://framework.zend.com/download/latest 包含2个 ...
- robot framework环境搭建和简单示例
环境搭建 因为我的本机已经安装了python.selenium.pip等,所以还需安装以下程序 1.安装wxPythonhttp://downloads.sourceforge.net/wxpytho ...
- robot framework环境搭建(转)
一. robot framework环境搭建: 官网:http://robotframework.org/ 序号 安装包名 安装方法 下载地址 备注 1 python exe文件,直接双击安装 htt ...
随机推荐
- ACCESS通过一个连接写入的数据,还有一个连接却读取不出来
近期在用c#实现一个数据导入的功能,将一个ACCESS数据库中的数据导入到还有一个ACCESS的数据库中,然后显示出来,可是导入成功了.却显示不出来. 经过研究认为应该是缓存的原因,因为我写入数据和读 ...
- 亲测有效,解决Can 't connect to local MySQL server through socket '/tmp/mysql.sock '(2) ";
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/hjf161105/article/details/78850658 最近租了一个阿里云云翼服务器,趁 ...
- 《⑨也懂系列:MinGW-w64安装教程》著名C/C++编译器GCC的Windows版本(MinGW-w64在安装的时候可以选择版本,有图,一步一步)
发布日期 2016年10月31日 分类 教程 标签 编程.软件 前言<⑨也懂系列:MinGW-w64安装教程>这篇文章由 rsreland (http://rsreland.net)于 2 ...
- mac在终端打开应用程序
今天研究了下mac终端的启动流程.以下以sublime为例,介绍怎么在mac的终端中加入app启动方法. 方法1 :使用"open -a /Applications/Sublime\ Tex ...
- 获取web.config配置文件的sectionGroup
1)web.config 文件内容如下: <configuration> <configSections> <sectionGroup name="KaiXin ...
- OpenCL编译环境配置(VS+Nvidia)
英伟达的显卡首先要下载安装CUDA开发包,可以参考这里的步骤: VS2015编译环境下CUDA安装配置 安装好CUDA之后,OpenCL的配置就已经完成了80%了,剩下的工作就是把OpenCL的路 ...
- MyEclipse参加ibatis DTD文件实现xml自己主动提示功能
当我们写ibatis当配置文件,希xml自己主动提示. 这就要求我们的加盟DTD档 SqlMapConfig.xml中开头部分有这么一句话 <!DOCTYPE sqlMapConfig PUBL ...
- .Net Remoting的双向通信和Windows Service的宿主服务
原文:.Net Remoting的双向通信和Windows Service的宿主服务 作为微软分布式技术之一的.Net Remoting,从性能.安全等各方面来说都是相对比较稳定的,也是一项比较成熟的 ...
- 1 DDD理论学习1 通用语言
通用语言就是将事情描述清楚的语言 达到DDD的目标代码即设计,设计即代码.通俗的讲,也就是开发人员写的代码领域专家也能看懂. ddd模式跟传统模式的一个区别在于 传统先创建数据库表 再根据表创建类.而 ...
- zcelib - One cplusplus C++ crossplatform library use for develop server,similar to ACE.
zcelib - One cplusplus C++ crossplatform library use for develop server,similar to ACE.OS适配层,为了适应WIN ...