一、Action(play.api.mvc.Action)

大多数的应用的请求都是由action进行处理,并生成一个结果给客户端,Action有多种创建方式:

1.

  1. Action {Ok("Hello world")}

2.

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

3.

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

4.

  1. def action = Action { implicit request =>
  2. anotherMethod("Some para value")
  3. Ok("Got request [" + request + "]")
  4. }
  1. def anotherMethod(p: String)(implicit request: Request[_]) = {
  2. // do something that needs access to the request
  3. }

5.

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

6.空的响应

  1. def index(name:String) = TODO

二、 controller

controller通常是生成Action值的对象,通常把它定义为一个类而不是一个对象,例如:

  1. package controllers
  2. import javax.inject.Inject
  3. import play.api.mvc._
  4. class Application @Inject()(cc: ControllerComponents)extends AbstractController(cc) {
  5. def index = Action {
  6. Ok("It works!")
  7. }
  8. }

三、Result(play.api.mvc.Result)

1.带header和body的http结果

  1. import play.api.http.HttpEntity
  2.  
  3. def index = Action {
  4. Result(
  5. header = ResponseHeader(200, Map.empty),
  6. body = HttpEntity.Strict(ByteString("Hello world!"), Some("text/plain"))
  7. )
  8. }

其他的一些结果

  1. val ok = Ok("Hello world!")
  2. val notFound = NotFound
  3. val pageNotFound = NotFound(<h1>Page not found</h1>)
  4. val badRequest = BadRequest(views.html.form(formWithErrors))
  5. val oops = InternalServerError("Oops")
  6. val anyStatus = Status(488)("Strange response type")

2.重定向到一个新的URL

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

四、Routes(conf/routes)

主要包含http请求方式((GETPATCHPOSTPUTDELETEHEAD)和请求地址

1.动态请求地址

  1. GET /clients/:id controllers.Clients.show(id: Long)

包含多层结构的地址

  1. GET /files/*name controllers.Application.download(name)

/files/images/logo.png中*name代表的是 images/logo.png

带正则表达式的地址

  1. GET /items/$id<[0-9]+> controllers.Items.show(id: Long)

2.函数参数

  1. GET /:page controllers.Application.show(page)
  1. GET / controllers.Application.show(page)

第二个函数的参数,是请求到的内容

例子:

  1. def show(id: Long) = Action {
  2. Client.findById(id).map { client =>
  3. Ok(views.html.Clients.display(client))
  4. }.getOrElse(NotFound)
  5. }
  1. GET /clients controllers.Clients.list(page: Int ?= 1)

函数的参数带默认值

  1. GET /api/list-all controllers.Api.list(version: Option[String])

可选的参数

3.反向路由

  1. package controllers
  2. import javax.inject.Inject
  3. import play.api._
  4. import play.api.mvc._
  5.  
  6. class Application @Inject()(cc:ControllerComponents) extends AbstractController(cc) {
  7. def hello(name: String) = Action {
  8. Ok("Hello " + name + "!")
  9. }
  10. }
  11.  
  12. GET /hello/:name controllers.Application.hello(name)
  13.  
  14. def helloBob = Action {Redirect(routes.Application.hello("Bob"))}

4.相对路由

  1. package controllers
  2. import javax.inject._
  3. import play.api.mvc._
  4. @Singleton
  5. class Relative @Inject()(cc: ControllerComponents) extends AbstractController(cc) {
  6. def helloview() = Action { implicit request =>
  7. Ok(views.html.hello("Bob"))
  8. }
  9. def hello(name: String) = Action {
  10. Ok(s"Hello $name!")
  11. }
  12. }
  13.  
  14. GET /foo/bar/hello controllers.Relative.helloview
  15. GET /hello/:name controllers.Relative.hello(name)
  16.  
  17. @(name: String)(implicit request: RequestHeader)
  18. <h1>Hello @name</h1>
  19. <a href="@routes.Relative.hello(name)">Absolute Link</a>
  20. <a href="@routes.Relative.hello(name).relative">Relative Link</a>
  21.  
  22. <!DOCTYPE html>
  23. <html lang="en">
  24. <head>
  25. <title>Bob</title>
  26. </head>
  27. <body>
  28. <a href="/hello/Bob">Absolute Link</a>
  29. <a href="../../hello/Bob">Relative Link</a>
  30. </body>
  31. </html>

5.一些默认的

  1. # Redirects to https://www.playframework.com/ with 303 See Other
  2. GET /about controllers.Default.redirect(to = "https://www.playframework.com/")
  3.  
  4. # Responds with 404 Not Found
  5. GET /orders controllers.Default.notFound
  6.  
  7. # Responds with 500 Internal Server Error
  8. GET /clients controllers.Default.error
  9.  
  10. # Responds with 501 Not Implemented
  11. GET /posts controllers.Default.todo

PLAY2.6-SCALA(二) Actions, Controllers ,Results,routes的更多相关文章

  1. scala(二) Future执行逻辑解读

    在scala中是没有原生线程的,其底层使用的是java的Thread机制.但是在scala中对java Thread进行了封装,实现了更便于操作线程的Future. 官方文档: Futures pro ...

  2. scala(二)

    一.映射 1.Scala映射就是键值对的集合Map.默认情况下,Scala中使用不可变的映射. 如果想使用可变集合Map,必须导入scala.collection.mutable.Map    (导包 ...

  3. PLAY2.6-SCALA(十二) 表单的处理

    一.表单处理流程如下 1.定义一个表单,在这里表单最多有22个字段 import play.api.data._ import play.api.data.Forms._ //要使用验证和约束 imp ...

  4. Scala(二)【基本使用】

    一.变量和数据类型 1.变量 语法:val / var 变量名:变量类型 = 值 val name:String = "zhangsan" 注意 1.val定义的变量想到于java ...

  5. Caliburn.Micro学习笔记(二)----Actions

    Caliburn.Micro学习笔记目录 上一篇已经简单说了一下引导类和简单的控件绑定 我的上一个例子里的button自动匹配到ViewModel事件你一定感觉很好玩吧 今天说一下它的Actions, ...

  6. Scala(二):元组、数组、映射

    元组:Tuple,不同类型值的聚集.将固定数量的项目组合在一起,以便它们可以作为一个整体传递. 与数组或列表不同,元组可以容纳不同类型的对象,但它们也是不可变的.元祖的实际类型取决于它的分量的类型,比 ...

  7. Scala(二) —— 函数

    try 表达式 var result = try{ Integer.parseInt("dog") }catch{ case _ => 0 }finally{ println ...

  8. play1.x vs play2.x 对比(转)

    个人看到对比play1.x和play2.x比较的文章中,写的最深入,最清晰的一个.转自:http://freewind.me/blog/20120728/965.html 为了方便群中的Play初学者 ...

  9. Scala详解

    1       快速入门... 4 1.1             分号... 4 1.2             常变量声明... 4 1.2.1         val常量... 4 1.2.2  ...

随机推荐

  1. MUI使用vue示例

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name ...

  2. dom4j和document

    DOM的优点和缺点: 优点:DOM操作思维清晰,简单 缺点:在操作大量数据的时候性能,不能保证 DOM(Document Object Model) // 表示出需要被操作的XML文件的路径,注意是文 ...

  3. oracle基础学习(1)

    -解锁用户,需要使用dba权限conn sys/1234 as dba; alert user scott account unlock;/ --initcap方法,实现字符串首字符大写,其余字符小写 ...

  4. VS2005+VTK读入点云文件

    使用VTK读入点云文件的基础代码: 头文件: 也许不是全部都用到,为了接下来得工程还是全部都包含进去了 #include "vtkRenderer.h" #include &quo ...

  5. springcloud:Eureka的使用

    1.认识Eureka 服务的管理. 问题分析 在刚才的案例中,itcast-service-provider对外提供服务,需要对外暴露自己的地址.而consumer(调用者)需要记录服务提供者的地址. ...

  6. 安装ubuntn16.04重启后出现grub secure界面

    参考:http://jingyan.baidu.com/article/c85b7a640cd7d6003bac95f8.html 安装ubuntn重启后出现grub secure界面的原因是在安装过 ...

  7. OpenLayers测量距离和面积

    <!DOCTYPE html> <html> <head> <title>测量距离和面积</title> <meta http-equ ...

  8. Docker搭建的MySQL容器出现 "Too many connections 1040" 最大连接数修改完未生效的解决方案

    原文:Docker搭建的MySQL容器出现 "Too many connections 1040" 最大连接数修改完未生效的解决方案 版权声明:本文为博主原创文章,未经博主允许不得 ...

  9. 大半夜吃饱了撑的帮人调IE玩

      那高手的也是IE6,我也是IE6,但是他的IE6就总是进recv,我的IE6就进WSARecv,一点都不科学...擦..不调了.

  10. update当根据条件不同时 更新同一个字段的方法 或多表插入

    1.通过存储过程 循环 传值 create or replace procedure p_u isbegin for rs in (select distinct (rks) from rkbz)lo ...