Play框架

Play 框架架构
当请求从浏览器发到服务端时,会有 Routes 来处理,如我们请求 /use/1 的 URL 时。这个请求将在 Routes 找到对应的函数来处理,在 Django 中处理请求的函数叫做 URL Dispatcher。


这里的路由规则分为了两个部分:请求动态数据或静态资源。
浏览器一般先请求获得 html 页面,然后 html 内容如果有 ajax 则会再发送请求过来,请求动态数据。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 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 的方法来处理,如下所示:

1
2
3
4
5
6
7
8
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 去取相应的用户

1
2
3
4
5
6
7
8
9
10
11
12
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 层:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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)
}
}

然后我们就取到了这个用户。如果只是从这个过程上来说,我觉得和一般的 MVC 框架并没有太大的区别。