因为工作的需要用到Play,所以先行玩了一下。因为Scala框架的模式,和我所熟悉的Django的MTV模式很相似,所以也写一篇文章说说呼呼~~。、
Play框架的架构如下图所示:
当请求从浏览器发到服务端时,会有Routes来处理,如我们请求 /use/1 的URL时。这个请求将在Routes找到对应的函数来处理,在Django中处理请求的函数叫做URL Dispatcher。
# Routes
# This file defines all application routes (Higher priority routes first)
# ~~~~
# Home page
GET / controllers.ApplicationController.index
POST /user controllers.ApplicationController.addUser
GET /delete/:id controllers.ApplicationController.deleteUser(id : Long)
GET /user/:id controllers.ApplicationController.getUser(id : Long)
GET /api/user/:id controllers.ApiController.getUser(id : Long)
POST /api/user controllers.ApiController.createUser
# Map static resources from the /public folder to the /assets URL path
GET /assets/*file controllers.Assets.versioned(path="/public", file: Asset)
随后在我们的ApiController中会有一个对应的getUser的方法来处理,如下所示:
class ApiController extends Controller {
def getUser(id: Long) = Action.async { implicit request =>
UserService.getUser(id).map {
case None => NotFound(Json.obj("error" -> "Not Found"))
case Some(user) => Ok(Json.toJson(user))
}
}
}
随后还是相应的UserService去取相应的用户
import models.{User, Users}
import scala.concurrent.Future
object UserService {
def addUser(user: User): Future[String] = {
Users.add(user)
}
def getUser(id: Long): Future[Option[User]] = {
Users.get(id)
}
}
最后便会执行到model层:
object Users {
val dbConfig = DatabaseConfigProvider.get[JdbcProfile](Play.current)
val users = TableQuery[UserTableDef]
def add(user: User): Future[String] = {
dbConfig.db.run(users += user).map(res => user.toString()).recover {
case ex: Exception => ex.getCause.getMessage
}
}
def get(id: Long): Future[Option[User]] = {
dbConfig.db.run(users.filter(_.id === id).result.headOption)
}
}
Blabla,然后我们就取到了这个用户。如果只是从这个过程上来说,我觉得和一般的MVC框架并没有太大的区别。
直至,我看到了Reactive:
围观我的Github Idea墙, 也许,你会遇到心仪的项目