Scala下Play框架的学习是一件辛苦的事情,因为该框架比较新,scala语言也较新,所以中文资料很少,经过同事推荐,去了如下英文网站看资料:

https://www.playframework.com/documentation/2.5.x/ScalaHome

虽然我的同事以在云中飞的速度学完了,但对我来说还是任重而道远。

Action是什么?

由于Scala和Play有关的API都在play.api下面,所以其实Action的过程是这样的:

play.api.mvc.Action(play.api.mvc.Request=> play.api.mvc.Result)

例如:

def echo = Action { request =>
  Ok("Got request [" + request + "]")
}

最简单的构建Action的模式如下:

Action {
  Ok("Hello world")
}

有一个参数的Action可以构建如下:

Action { request =>
  Ok("Got request [" + request + "]")

}

设置成隐式的request可以让其他的API在需要的时候调用:

Action { implicit request =>
  Ok("Got request [" + request + "]")

}

引入特定的BodyParser参数方式如下:

Action(parse.json) { implicit request =>
  Ok("Got request [" + request + "]")
}

控制器(Controllers)是Action的生成器

控制器用来产生Action类型的值,可以被定义为一个利用依赖注入特性的类或对象。依赖注入是一种用来从依赖中分离组件行为的设计模式,Play框架在scala中同时支持运行时依赖注入和编译时依赖注入。运行时依赖注入在运行时才会创建依赖关系图,并根据关系验证特定组件是否存在依赖。

依赖注入的目标:(1)同一个组件可以绑定多个接口,当用接口来实例化组件或者注入接口用于测试时很有用;(2)避免了全局静态。

Play中依赖注入的实现:通过在routes文件中的配置来创建路由,同时控制器注入构造器,创建Application的实例。另外,Play框架还提供内置的trait来允许创建在编译时与app关联的Scala接口。

当一个组件需要依赖另一个组件时,使用@Inject注解,譬如放在构造器的声明中:

import javax.inject._
import play.api.libs.ws._

class MyComponent @Inject() (ws: WSClient) {
  // ...

}

注解的声明位置必须在构造器名和参数名之间。

Play框架使用依赖注入控制器的方式有两种:

(1)注入routes generator,产生控制器把他们自己作为依赖注入的路由,在build.sbt中添加如下配置:

routesGenerator := InjectedRoutesGenerator

(2)静态routes generator,如下加入到build.sbt:

routesGenerator := StaticRoutesGenerator

如果使用静态路由,每一个Action都有一个由@作为前缀修饰的已经注入的控制器:

GET        /some/path           @controllers.Application.index

最简单的定义action generator的方式是定义一个返回Action实例的无参方法:

package controllers

import play.api.mvc._

class Application extends Controller {

def index = Action {
    Ok("It works!")
  }

}

action generator 的有参数方法如下,其中参数会被Action闭包所捕获:

def hello(name: String) = Action {
  Ok("Hello " + name)

}

简单HTTP请求的结果包含如下内容:

一个状态码、一个HTTP header集合、以及将被发送到web客户端的body,结果被play.api.mvc.Result所定义:

import play.api.http.HttpEntity

def index = Action {
  Result(
    header = ResponseHeader(200, Map.empty),
    body = HttpEntity.Strict(ByteString("Hello world!"), Some("text/plain"))
  )

}

用OK定义的简单结果:

def index = Action {
  Ok("Hello world!")

}

这和前面获得的结果几乎相同,因为源码中OK就表示状态码为200的Status对象。

play.api.mvc.Results接口及其伴生类可以看到许多种Result的创建方式:

val ok = Ok("Hello world!")
val notFound = NotFound
val pageNotFound = NotFound(<h1>Page not found</h1>)
val badRequest = BadRequest(views.html.form(formWithErrors))
val oops = InternalServerError("Oops")

val anyStatus = Status(488)("Strange response type")

把浏览器重定向到新的URL也是一种简单Result的类型,不带web响应主体:

def index = Action {
  Redirect("/user/home")

}

def index = Action {
  Redirect("/user/home", MOVED_PERMANENTLY)

}

还没实现的Action接口:

def index(name:String) = TODO

转载于:https://blog.51cto.com/12435523/1885189

Scala下Play框架学习笔记(Actions,Controllers and Results)相关推荐

  1. SpringMVC框架--学习笔记(下)

    接上篇:SpirngMVC框架--学习笔记(上):https://blog.csdn.net/a745233700/article/details/81038382 17.全局异常处理: 系统中异常包 ...

  2. mybatis框架--学习笔记(下)

    上篇:mybatis框架--学习笔记(上):https://blog.csdn.net/a745233700/article/details/81034021 8.高级映射: (1)一对一查询: ①使 ...

  3. php框架费尔康,GitHub - majixian/study-phalcon: phalcon(费尔康)框架学习笔记

    phalcon(费尔康)框架学习笔记 以实例程序invo为例(invo程序放在网站根目录下的invo文件夹里,推荐php版本>=5.4) 环境不支持伪静态网址时的配置 第一步: 在app\con ...

  4. JeeSite 框架学习笔记

    JeeSite 框架学习笔记 目录 JeeSite 框架学习笔记 一.全局配置 1. 获取 Resource资源实际路径 DefaultResourceLoader 2. 配置前端 js css 二. ...

  5. 27Vert.X框架学习笔记

    vert.x框架学习笔记 文章目录 1 Vert.x简明介绍 1.1 Vert.x能干什么 1.2 Vert.x快速体验 1.3 Vert.x的简单介绍 1.4 Vert.x的一些优势 1.4.1 异 ...

  6. SpringMVC框架--学习笔记(上)

    1.SpringMVC入门程序: (1)导入jar包:spring核心jar包.spring-webmvc整合Jar包 (2)配置前端控制器:web.xml文件中 <?xml version=& ...

  7. mybatis框架--学习笔记(上)

    使用JDBC操作数据库的问题总结: (1)数据库连接,使用时创建,不使用时立即释放,对数据库进行频繁连接开启和关闭,造成数据库资源浪费,影响数据库性能. 设想:使用数据库连接池管理数据库连接. (2) ...

  8. JavaSE中Map框架学习笔记

    前言:最近几天都在生病,退烧之后身体虚弱.头疼.在床上躺了几天,什么事情都干不了.接下来这段时间,要好好加快进度才好. 前面用了三篇文章的篇幅学习了Collection框架的相关内容,而Map框架相对 ...

  9. python表单提交的两种方式_Flask框架学习笔记之表单基础介绍与表单提交方式

    本文实例讲述了Flask框架学习笔记之表单基础介绍与表单提交方式.分享给大家供大家参考,具体如下: 表单介绍 表单是HTML页面中负责数据采集功能的部件.由表单标签,表单域和表单按钮组成.通过表单,将 ...

最新文章

  1. 世界上首个被数学证明安全的OS微内核seL4成立基金会
  2. 【HDU - 5878】I Count Two Three(打表)
  3. Sharding-JDBC读写分离_MySql主从配置(2)_Sharding-Sphere,Sharding-JDBC分布式_分库分表工作笔记016
  4. 查看其他计算机的共享资源,NetResView (共享资源查看)
  5. 使用IntelliJ IDEA 前最好修改的配置
  6. iOS-推送通知详解
  7. cmosfixr插件怎么用_Excel处理临床数据:插件篇
  8. 驱动程序(13) 将Windriver编写的程序制成DLL供其他程序调用
  9. Python笔记 之 dict模块
  10. java特殊字符大全_java 字符串特殊符号
  11. The authentication type 10 is not supported
  12. svg转成jpg/png图片跨域图片
  13. 数据库面试题SQL篇
  14. webp文件上传格式转换前端解决方案及php端解决方案
  15. 线性回归的推导与java代码
  16. 技术人在互联网如何变现
  17. 擦窗机器人不用时怎么收纳_擦窗机器人如何保证不会高空掉落,这些措施必不可少...
  18. 微型计算机的储存体系如何,存储体系结构
  19. Python生成随机试卷及答案
  20. 轻松解决桌面或者开始菜单里的图标显示异常

热门文章

  1. 2020中央财经大学901c语言大纲,2017年中央财经大学信息学院901C语言程序设计考研导师圈点必考题汇编...
  2. V4L2 驱动层分析
  3. 汉诺塔自动解题动画中的iOS开发技巧
  4. IOS中结构体(struct)
  5. Python数据可视化之随机点图
  6. Typora远程解绑设备的方法
  7. WordPress编辑器支持pdf上传
  8. 计算机网络中型网吧规划设计,中小型网咖网络规划设计开题报告
  9. RPG Maker mv框架代码解析之窗口图片显示
  10. 京东实习笔试——拍卖