Play FrameWork 2.0 Scala学习笔记

Stella981
• 阅读 649

//Play FrameWork 2.0  Scala

requst --> routes -->Controller -->Action -->Result -->Html

play中的大多数请求都是有一个Action来处理的,当请求一个事件时,会由Routes规则进行匹配,交给相应的Controller,
Controller找到指定的Action,进行处理,并返回一个Result类型包含response体渲染页面

创建一个Action方法如:

def index = Action{//这里也可以使用 implicit request =>
//code
Ok("Hello")//一个简单的返回 [Result类型]
}

我们可以看看Action的定义
trait Action[A] extends (Request[A] => Result) {
def parser: BodyParser[A]
}
Request [A] 被定义为:
trait Request[+A] extends RequestHeader {
def body: A
}

[A] 是request body 的类型.我们可以使用任意Scala类型指定,例如 String、NodeSeq、Array[Byte]、JsonValue,或者java.io.File,只要我们有一个可以处理该类型的body parser.总而言之,一个 Action[A] 使用一个 BodyParser[A] 从HTTP请求中,取出一个A类型的值,并构建一个Request[A]对象,转递给action代码。

Controller是Actions的生成器,是产生Action的摸个单例对象.

Routes 可以在conf/routes里进行路由配置
==========================================================================
Form表单的一些知识
Form 位于play.api.data.Form下,创建一个表单如:

val helloForm = Form(
tuple( //也可以使用mapping
"name" -> nonEmptyText, //带验证的约束
"repeat" -> number(min = 1, max = 100),
"color" -> optional(text)
)
)

case class User(name: String, age: Int)
val userForm = Form(
mapping(
"name" -> text,
"age" -> number
)(User.apply)(User.unapply)
)
val anyData = Map("email" -> "bob@gmail.com", "age" -> "18")
val user: User = userForm.bind(anyData).get

注意:使用 tuple 和 mapping 的不同在于,当你使用 tuple 时,构造和析构不需要指定(我们知道怎样构造和解构一个tuple).
mapping 方法仅让你定义你的自定义函数。当你想构造和析构一个case class,你只不过是使用 apply 和 unapply 函数,它们能精确的做到.

当然,通常Form签名不会精确的匹配case class。让我们举个包含额外的 checkbox 字段标识是否接受服务条款的例子。我们不需要將checkbox属性加入User类中。
它只是为了表单验证而加入的一个虚拟字段,一旦验证通过,该值便毫无用处。

// helloForm.bindFormRequest.get 获取request中form表单值

def sayHello = Action{implicit request =>
helloForm.bindFromRequest.fold(// 处理并验证信息时的处理
formWithErrors => BadRequest(html.index(formWithErrors)),//出错并返回指定页面
{case (name,repeat,color)=>  Ok(html.hello(name, repeat.toInt, color))}//正常
)
}

页面上的Form编写需要导入import helper._ 和使用@符号(x.scala.html中用到@时标记着scala代码开始加载)
@form(action=routes.Application.sayHello,'id ->"helloform",'method->"Post") {
@inputText(
field = helloForm("repeat"),
args = '_label -> "How many times?", 'size -> 3, 'placeholder -> 10
)
}

渲染界面需要在页面上开始标注所需要传入页面的必要参数如: @(message:String)(name:String)(list:List[Any])(op:Option[Any])

从Action想页面中传递参数,根据页面指定的参数传递如:     views.html.index("message:String")("name:String")(List[Any])(Option[Any])

页面中遍历参数  使用@ 可以使用for map等进行遍历

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Wesley13 Wesley13
3年前
java将前端的json数组字符串转换为列表
记录下在前端通过ajax提交了一个json数组的字符串,在后端如何转换为列表。前端数据转化与请求varcontracts{id:'1',name:'yanggb合同1'},{id:'2',name:'yanggb合同2'},{id:'3',name:'yang
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
5个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Souleigh ✨ Souleigh ✨
3年前
前端性能优化 - 雅虎军规
无论是在工作中,还是在面试中,web前端性能的优化都是很重要的,那么我们进行优化需要从哪些方面入手呢?可以遵循雅虎的前端优化35条军规,这样对于优化有一个比较清晰的方向.35条军规1.尽量减少HTTP请求个数——须权衡2.使用CDN(内容分发网络)3.为文件头指定Expires或CacheControl,使内容具有缓存性。4.避免空的
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
3年前
ES6 新增的数组的方法
给定一个数组letlist\//wu:武力zhi:智力{id:1,name:'张飞',wu:97,zhi:10},{id:2,name:'诸葛亮',wu:55,zhi:99},{id:3,name:'赵云',wu:97,zhi:66},{id:4,na
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
11个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这