Playframework with scala (二) Model View Controller
书接上文,这次我们安装MVC的层次创建一个简单的To-Do List,但是不会涉及到真正的数据持久化功能。
1. 修改route文件,在其中加入一行
GET /Todolist Application.todolist
这表示发往/Todolist的请求,将会由controllers包下的Application对象的todolist方法来处理
2. 修改controllers.scala文件,在Application对象下加入todolist方法,如下
package controllers import play._ import play.mvc._ object Application extends Controller { import views.Application._ def index = { html.index("Your Scala application is ready!") } def todolist = { html.todolist("TO-DO List"); } }
此时如果启动应用程序,访问http://localhost:9000/Todolist 会得到这样一个错误页面,可以看到错误信息很详细:
value todolist is not a member of package views.Application.html, 这是因为我们还没有创建对应的view。
3. 在app/views/Application目录下建立一个名为todolist.scala.html的文件,内容跟index.scala.html差不多,只不过把页面中间的内容替换了一下:
@(title:String)
@main(title) {
<p>Hi,这里是:@title</p>
}
刷新页面,这回该看到这行字了。Hi,这里是:TO-DO List。 很好,这表示我们从controller到view已经联通。
4.接下来创建Model。在App目录下创建一个名为models.scala的文件。(scala是允许在一个文件内创建多个类,同时也允许在同一文件内创建嵌套的package,这点好像和C#差不多?)
package models
class ToDo(val name:String)
我们创建一个名为ToDo的model类,这玩意儿简单到只有一个name属性。scala让人感到清爽的一点就是能少敲一个字符就少敲一个,看这类定义多清爽,甚至连{}都没有。
然后我们打算在controller中创建几个假数据,然后在页面中把这几条假数据显示出来。
修改controllers.scala
def todolist = {
import models._
val todo1 = new ToDo("扫地")
val todo2 = new ToDo("打水")
val todo3 = new ToDo("擦桌子")
val todoList = List(todo1,todo2,todo3)
html.todolist("TO-DO List",todoList)
}
这里又体现了一个scala语法的灵活性,就是你可以随时随地import你需要的package。其余的部分很明了,不解释。
此时我们刷新页面,会看到这样一个错误信息:
The file /app/controllers.scala could not be compiled. Error raised is : too many arguments for method apply: (title: String)play.templates.Html in object todolist
前一篇博客介绍过,play-scala的模板就是一个函数,记得这一点的话,这个错误就容易理解了。我们的函数(模板)声明中只有一个参数,二调用者却传递了两个参数进来,当然不匹配啦。
5. 好,接下来我们就修改todolist.scala.html,首先把第一行函数声明改成
@(title:String,todolist:List[models.ToDo])
此时保存,刷新页面,错误不见啦,这说明编译成功!
然后,我们把todo list显示出来:
@(title:String,todolist:List[models.ToDo])
@main(title) {
<ul>
@todolist.map{ t =>
<li>@t.name</li>
}
</ul>
}
刷新页面,OK,看到
- 扫地
- 打水
- 擦桌子
了吧, 到此为止,play with scala的MVC联通成功!

浙公网安备 33010602011771号