日期:2014-05-20  浏览次数:21176 次

Play framework 2.0入门教程(三)

上一节我们了解了play的工作原理,并简单的对工程做了改动,现在我们来制作一个简单的留言板程序。

单击右边链接复习一下上一节: Play framework 2.0入门教程(二)

简单说一下,我们这个留言板有三个功能,显示留言、发表留言、删除留言。


修改routes路径映射文件

让我们从/conf/routes开始

# Home page
GET     /                         controllers.Application.index
                                
# Message          
GET     /message                  controllers.Application.messages
POST    /message                  controllers.Application.newMessage
POST    /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 models

case 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.html看一眼就知道main模板是干什么用的了)

第五行用List里的size方法显示留言的数量

第七行用List里的map方法吧List转换成map并遍历显示id和label即留言内容

那么首先呢,我们应该给这个index页面传递参数message,毫无疑问这个实在Application.scala里面完成的,修改/app/controller/Application.scala

import models.Message

def messages = Action {
  Ok(views.html.index(Message.all()))
}

保存,刷新,嘿嘿,怎么样,出来了吧

下面呢,我们就来制作新增留言的部分


新增留言的制作

留言肯定要现有表单单,我们先给我们的前台页面index.scala.html添加表单,修改/app/iews/index.scala.html

@(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.html.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.html.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.html

              @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

最后保存,刷新,删除效果如图所示

删除第一条之后