上一节我们了解了play的工作原理,并简单的对工程做了改动,现在我们来制作一个简单的留言板程序。
单击右边链接复习一下上一节: Play framework 2.0入门教程(二)
简单说一下,我们这个留言板有三个功能,显示留言、发表留言、删除留言。
修改routes路径映射文件
让我们从/conf/routes开始
# Home pageGET / controllers.Application.index # Message GET /message controllers.Application.messagesPOST /message controllers.Application.newMessagePOST /message/:id/delete controllers.Application.deleteMessge(id: Long)我们在原来的基础上又增加了三个URL,显示留言http://localhost:9000/messages,添加留言和删除留言,这两个都是form表单的action地址。
这时候我们刷新一下,会有如下报错,提示你应该在/app/conrollers/Application.scala里定义新函数了
好,说干就干
在Application里定义增删查
object Application extends Controller { def index = Action { Ok("Hello world") } def messages = TODO def newMessage = TODO def deleteMessage(id: Long) = TODO }
刷新一下,什么?还是hello,world界面,好吧,我们给index做一个重新定向
修改/app/controller/Application.scala文件里的index函数
def index = Action { Redirect(routes.Application.message)}
保存,刷新,恩,跳转了,我们之前定义的TODO意思是马上去做,然后他会返回一个这个蓝色的家伙
新建Message.scala模型文件
熟悉MVC的人知道,model,views,controller(模型,视图,控制),得有模型,这里我们就做一个留言的Message模型吧,在/app/里新建文件夹models,在models里新建文件Message.scala,内容如下
package modelscase class Message(id: Long, label: String)object Message { def all(): List[Message] = messageList def create(label: String) {} def delete(id: Long) {} var messageList:List[Message]=new Message(1,"心香一脉")::new Message(2,"孝道第一")::Nil }第一行就是java里的包,
第三行定义了一个类,包含id,label两个属性,分别表示留言编号和留言内容,
第五行大致相当于java里的单例,有三个方法,all()是返回所有的留言内容,create是新建留言,delete是删除留言,
最后一行我们定义了一个messageList,用来存放留言,并且放进了两条数据
显示界面的制作
好了,为了让我们的数据显示出来我们还得做一个页面,那就修改一下/app/views/index.scala.html吧
@(messages: List[Message])@main("留言板") { <h1>共@messages.size 条留言</h1> @messages.map { message => @message.id @message.label </br> }}第一行传入参数message
第三行调用main模板(其实你打开/app/iews/main.scala看一眼就知道main模板是干什么用的了)
第五行用List里的size方法显示留言的数量
第七行用List里的map方法吧List转换成map并遍历显示id和label即留言内容
那么首先呢,我们应该给这个index页面传递参数message,毫无疑问这个实在Application.scala里面完成的,修改/app/controller/Application.scala
import models.Messagedef messages = Action { Ok(views.index(Message.all()))}
保存,刷新,嘿嘿,怎么样,出来了吧
下面呢,我们就来制作新增留言的部分
新增留言的制作
留言肯定要现有表单单,我们先给我们的前台页面index.scala添加表单,修改/app/iews/index.scala
@(messages: List[Message],messageForm:Form[String])@import helper._@main("留言板") { <h1>共@messages.size 条留言</h1> @messages.map { message => @message.id @message.label </br> } <h1>新增留言</h1> @form(routes.Application.newMessage){ @inputText(messageForm("label")) <input type="submit" value="新增留言" /> }}具体第一行传入参数又多一个messageForm,这个就是表单了,可以回填内容,显示错误等
第三行导入helper._,主要是一些表单的模板
第十九行定义了一个form,action为routes.Application.newMessage,实际上就是http://localhost:9000/message
第二十一行第一了一个input,和message、messageForm里面的label绑定在一起,接下来吗,不解释
既然传入参数多了一个messageForm,那么我们在Application.scala里面的message就得改一下,具体如下
def messages=Action{ Ok(views.index(Message.all(),Message.messageForm)) }
那么Message里面肯定也要加一个messageForm之类的东西吧,修改/app/models/Message.scala,加入
import play.api.data._ import play.api.data.Forms._ val messageForm=Form( "label"->nonEmptyText )一二行嘛,导入两个包,里面分别有变单数据和变单的描述,
第四行定义一个叫做messageForm的表单
第五行定义了一个数据,nonEmptyText代表此项不能为空
然后在保存刷新一下
当然现在只是一个界面,我们要想真正留言还有很多事要做,首先在Application.scala里面把newMessage的TODO完成一下
import model.Message._ def newMessage=Action{implicit request=> messageForm.bindFromRequest.fold( errors=>BadRequest(views.index(Message.all(),errors)), label=>{ Message.create(label) Redirect(routes.Application.messages) } ) }第一行,实现了request,可以访问request里的方法
第三行,把request的数据绑定到messageForm里
第五行,如果根据messageForm里的要求绑定失败(不满足nonEmptyText非空字段),则返回错误
第七行,如果没有错误,对数据进行处理,这里是lable数据,调用Message里面的create方法,新增留言,当然这个方法还没实现,这是我们下一步的目的
第九行,新增完成条装到显示页面
然后呢我们可以来完善Message里面的create方法,修改/app/model/Message.scala
def create(label:String){ messageList=messageList:::(new Message(messageList.length+1,label)::Nil) }第三行主要是新建一个List,包含新建的Message,然后和之前的MessageList合并生成一个List,重新赋值给messageList
这个时候我们保存,刷新,添加留言,单击提交,成功了
删除留言的制作
最后我们该增加删除留言的功能,这个相对增加留言来说比较简单,首先还是处理前台,修改/app/views/index.scala
@messages.map { message => @message.id @message.label @form(routes.Application.deleteMessage(message.id)){ <input type="submit" value="删除"/> } </br> }第七行,定义了一个form,action为routes.Application.deleteMessage(message.id),实际上就是http://localhost:9000/message/:id/delete,id是作为参数传递进去的
接下来我们完善deleteMessage里面的TODO,修改/app/controllers/Application.scala
def deleteMessage(id:Long)=Action{ Message.delete(id) Redirect(routes.Application.messages) }
第三行,调用Message.scala的delete方法(也是我们下一步要做的),删除Message.id为id的留言,
第五行,跳转到留言显示页面
好的,我们继续完善Message.scala文件,修改/app/models/Message.scala
def delete(id:Long){ messageList=messageList.remove(message=>message.id==id) }
第三行,删除messageList里面Message.id为id的项,然后赋值给messageList
最后保存,刷新,删除效果如图所示
删除第一条之后