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。
 

image

 

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联通成功!

posted on 2011-09-27 23:08  nixil  阅读(657)  评论(0)    收藏  举报