1、play编程基础

1、Action、Controller、Result

Action指的是动作,play中大多数请求可以使用action来处理,一个请求对应一个动作也就是一个java方法,然后处理请求返回一个响应,这个响应用Result来体现

Controller就是一个继承了 play.mvc.Controller 的java类,他的返回值也是一个Result,也可以用来处理请求

Result用于返回请求的处理响应信息,它提供了一些html生成器,帮助开发者直接返回

上边这些都可以包含响应的参数。Play还提供了一种返回方式重定向,使用redirect实现

2、请求的处理-HTTP路由

Rouing路由是一种用于将传入到服务器的http请求转换成操作调用的组件,例如:将请求对应到一个controller中的公共方法,mvc框架将没有给请求看成一个事件,一个动作。每一个请求都有两个属性:请求方式、请求路径,而开发者就可以在play的路由配置文件(conf下的routes文件)中配置请求的这两个属性

play的默认路由生成器创建一个路由器类,该类接受@inject注释的构造函数中的控制器实例。这意味着类适用于依赖项注入,也可以使用构造函数手动实例化。

路由的配置格式说明,每个路由从HTTP方法开始,然后是URI模式,最后一个元素是调用定义。如下: 

路由的第一部分是HTTP方法,Play路由中支持的http方法有:GET, PATCH, POST, PUT, DELETE, HEAD, OPTIONS

路由的第二部分是配置的URI模式,大致可分为两类:静态路由和动态路由,静态路由就是URI中没有任何可变参数,是什么就是什么,例如:

而动态路由则表示URI中可以包含可变的参数,例如想要根据ID来获取user信息:

又例如静态资源的访问,可以使用*来代替URI中的多段:

也可以在路由器中使用正则来进行模式匹配:

路由的第三部分是动作生成器,也就是对应的请求处理方法,处理方法可以带有参数,获取参数时会现在URI中进行查找,如果没有对应参数,则去request中查找,两种方式如下:

上图中show方法接收参数page,如果page类型是字符串时,可以默认不标明参数类型,如果想要其他类型参数,则应该显示声明,例如:

如果接收的参数使用了泛型,例如:List,那么在配置时应该使用[]来表示泛型而不是<>

传入的参数也可以设为定值,如下:

传入的参数也可以设置默认值,当请求中找不到此参数时,则使用此默认值,如下:

传入的参数可以设置为可选值,就是当参数为空时,则抛弃这个参数,如下:

上边说的都是将请求对应到一个Controller,也可以通过为动作生成器设置参数,将参数设置成request,将他发送到一个action,如下:

路由具有优先级,当一个请求同时对应多个路由时,则会以第一个路由对应的方法为准。

路由器可以用来从Java调用中生成URL。这使得可以将所有的URI模式集中在一个配置文件中,对于路由文件中使用的每个控制器,路由器将在路由包中生成“反向控制器”,具有相同的操作方法和相同的签名,但返回play.mvc.call而不是play.mvc.result。play.mvc.call定义一个HTTP调用,并提供HTTP方法和URI。调用使用方式如下:

有些情况下,返回相对路径而不是绝对路径可能很有用。play.mvc.call返回的路由总是绝对的(它们以/开头),当对Web应用程序的请求被HTTP代理、负载均衡器和API网关重写时,这可能会导致问题。(此处没有理解透)

3、响应的处理

对于响应信息,play提供了ok方法来帮助完成,可以根据返回的内容来自动的生成对应内容类型的响应信息,例如:

Play会总动根据返回的内容生成对应内容的响应信息,一个是text/plain类型的,一个是application/json类型的。如果不想让其自动生成,可以使用.as方法来设置内容的类型(Content-Type),如下:

开发者也可以自己设置响应的头信息,如下:

开发者也可以在响应中添加和清空cookie信息,如下:

返回的文本信息,play默认使用的字符编码是utf-8,也支持用户自定义编码方式,如下:

4、session和flash域

Play中的Session和flash域中的数据不存储在服务器中,而是使用cookie的方式添加到每个后续的HTTP请求中。存储的数据大小最大不能超过4KB,play中的Session不能用作缓存,因为它的实质相当于一个cookie,当用户关闭浏览器结束此次会话时,session就过期了,达不到作为缓存的目的,如果想用缓存可以使用play内置的缓存机制,也可以使用第三方缓存,例如:redis。

Session中存储的数据在整个用户会话期间都可用,在一次会话中可以通过设置session过期:在application.conf中添加配置play.http.session.maxAge。Session cookie中的值使用密钥进行了加密,因此客户端无法修改cookie数据。

flash作用域中存储的数据只对下一个请求可用。其用法和session相同,只不过flash cookie中的值没有经过加密,可以被修改,所以一般使用flash域来存储响应状态信息。

5、请求(体)解析器

Play中将request的头信息封装到RequestHeader类中,将request的body信息封装到BodyParser中。

play是一个异步框架,传统的IO不能用于读取请求体,当试图读取时,输入流会被阻塞,对应线程必须等待数据可用。因此play使用异步流库AKKA流。Akka Streams是反应流的一种实现,它是一种SPI,允许许多异步流API无缝地协同工作。

一般使用play默认的解析器即可满足要求,解析器可以将application/json格式的内容封装到一个JsonNode对象中:

其他的格式内容封装:

使用默认的解析器缓冲请求体时,可能在内存和磁盘上都有缓冲区,为了避免恶意的大量数据缓冲,可以配置缓冲区的大小,在application.conf文件中配置两个缓冲区的大小:

内存中缓存区限制:play.http.parser.maxMemoryBuffer = 256k

磁盘上缓存区限制:play.http.parser.maxDiskBuffer = 1024k  

上边是使用play默认的解析器,还允许开发人员写自己的解析器,需要实现 BodyParser 类,具体如下:

使用新建的解析器:

更复杂的操作可以访问官网

6、动作组合

我们知道当访问一个路径时,最终指向的是一个action中方法,一个只能对应一个,而动作组合则可以实现在执行指定方法之前执行别的动作,play中使用 @with 注解来实现。首先需要我们先写一个可以和别的方法组合的action,如下:

组合时直接用with注解即可,如下:

这是请求就会先到达VerboseAction中执行相应操作,然后通过call方法,请求再进入到verboseIndex方法中,有点前置动作的意思。注意:每一个请求都必须对应一个实例,否则可能出现问题。

Play允许自己声明动作组合的注解,此注解必须@with注解进行注释,开发者想组合的动作类需要填充到with注解中,如下:

可以直接使用注解VerboseAnnotation实现动作组合即可,可以使用动作组合(动态绑定)的方式实现权限控制或者日志的记录。可以用动作组合的注释直接修饰控制器类,将应用于该控制器类中所有操作方法。

可以将组合动作中的数据传递到要访问的对应的请求中,如下:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/321515.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【动态规划】城市交通

城市交通 Description 有n个城市&#xff0c;编号1~n&#xff0c;有些城市之间有路相连&#xff0c;有些则没有&#xff0c;有路则当然有一个距离。现在规定只能从编号小的城市到编号大的城市&#xff0c;问你从编号为1的城市到编号为n的城市之间的最短距离是多少&#xff1f…

AspNetCoreApi 跨域处理(CORS )

如果咱们有处理过MV5 跨域问题这个问题也不大。&#xff08;1&#xff09;为什么会出现跨域问题&#xff1a;浏览器安全限制了前端脚本跨站点的访问资源&#xff0c;所以在调用WebApi 接口时不能成功访问资源&#xff0c;原因“同源策略”的存在&#xff1a;同源指以下几点相同…

【动态规划】求最长不下降序列

求最长不下降序列求最长不下降序列求最长不下降序列 Description 设有n(n<1000)个不相同的整数(小于32767)组成的数列&#xff0c;记为&#xff1a; a1,a2,…,an,其中任意两个数不相同。 例如&#xff1a;3,18,7,14,10,12,23,41,16,24。 若有 且有 。则称为长度为e的不…

jzoj3860-地壳运动(mst)【最小生成树,三分】

正题 题目链接:https://jzoj.net/senior/#contest/show/3002/1 题目大意 nnn个点mmm条边&#xff0c;每条边有(u,v)(u,v)(u,v)两个权值。 qqq个询问&#xff0c;每次询问一个(k1,k2)(k1,k2)(k1,k2)&#xff0c;将所有边的权值变为u∗k1v∗k2u*k1v*k2u∗k1v∗k2后求最小生成树。…

读人人都是产品经理__2

1、做产品和做项目 对产品经理来说&#xff0c;最重要的是判断力和创造力&#xff0c;产品经理决定做不做、做什么&#xff0c;保证方向正确&#xff0c;要把它实现。对项目经理来说&#xff0c;最终的是执行力和控制力&#xff0c;项目经理决定怎么做&#xff0c;谁来做&#…

业务配置开发平台qMISPlat 2.0 产品介绍

qMISPlat是什么qMISPlat(业务配置开发平台)是一套基于.net core 2.0、跨平台的&#xff0c;面向开发人员和具有一定技术水平的业务人员使用的业务配置开发平台。基于此平台您只需通过配置和少量开发即可快速搭建满足用户需求的业务系统&#xff0c;大大降低项目开发工作量。平台…

jzoj2755-[2012东莞市选]树的计数【dp,高精度】

正题 题目链接:https://jzoj.net/senior/#main/show/2755 题目大意 求有多少个nnn个点直径为ddd的标号树。 解题思路 定义fi,jf_{i,j}fi,j​表示iii个点&#xff0c;深度不超过jjj的标号树数量。 然后有转移fi,j∑k1i−1Ci−2k−1∗k∗fk,j−1∗fi−k,jf_{i,j}\sum_{k1}^{i…

2、异步HTTP编程

1、处理异步结果 在内部&#xff0c;play框架是自下而上异步的。Play以异步、非阻塞方式处理每个请求。应用程序代码应尽量避免阻塞控制器&#xff0c;这种阻塞操作的常见例子有JDBC调用、流式API、HTTP请求和长计算。因此应尽量通过保持控制器异步的方法使得应用进行扩展&…

【动态规划】最大子矩阵之和

最大子矩阵 Description 给出一个N [2<N<100]&#xff0c;并给出一个N*N的矩阵&#xff0c;矩阵中的数为[-127,127]之间。求出矩阵中一块子矩阵的最大和。 比如&#xff1a; 0 -2 -7 0 9 2 -6 2 -4 1 -4 1 -1 8 0 -2 和最大的子矩阵应该是这个&#xff1a; 9 2 …

3、play中的模板引擎

1、模板格式 Play默认的模板引擎是一种基于scala的安全模板引擎&#xff0c;尽管模板引擎使用Scala作为表达式语言&#xff0c;但是非常简单易学。参数类型使用后缀语法指定&#xff08;例如&#xff1a; id&#xff1a;Long&#xff09;&#xff0c;泛型类型是使用[]符号&…

jzoj3500-物语【最短路】

正题 题目链接:https://jzoj.net/senior/#contest/show/3005/0 题目大意 nnn个点mmm条边的无向图&#xff0c;有一条边的边权会变化&#xff0c;qqq次变化&#xff0c;每次询问最短路。 解题思路 可变边(x,y)(x,y)(x,y) 路径无非就三种 1−>n1->n1−>n1−>x−>…

Problem G. Graph 2015-2016 acmicpc neerc 拓扑排序模拟

一道好题 题目详见题目连接G graph 显然模拟拓扑排序的步骤是必不可少了。 假设我们当前有t个点&#xff0c;他们的入度均为0.我们不知道该选取哪一个。 我们把这t个点按从小到大排好序&#xff08;放入小顶堆&#xff09;&#xff0c;假设我们目前有k条边&#xff08;k &l…

【动态规划】石子合并

石子合并石子合并石子合并 Description 在一个操场上一排地摆放着N堆石子。现要将石子有次序地合并成一堆。规定每次只能选相邻的2堆石子合并成新的一堆&#xff0c;并将新的一堆石子数记为该次合并的得分。请设计一个程序&#xff0c;计算出将N堆石子合并成一堆的最小得分。…

.NET Core调用WCF的最佳实践

现在.NET Core貌似很火&#xff0c;与其他.NET开发者交流不说上几句.NET Core都感觉自己落伍了一样。但是冷静背后我们要也看到.NET Core目前还有太多不足&#xff0c;别的不多说&#xff0c;与自家的服务框架WCF集成起来就不咋地&#xff0c;从最初不支持&#xff0c;到现在有…

4、表单提交和验证

1、启用/禁用表单module sbt启动应用时默认就启用了表单&#xff0c;也可以在build.sbt中添加启用libraryDependencies javaForms&#xff0c;想要移除表单时使用PlayMinimalJava 插件 2、play接收表单数据 play.data中的类可用于处理HTTP表单数据提交和验证&#xff0c;操…

Boring Homework 二叉搜索树的打印,模拟

写了好长时间&#xff0c;注意递归的使用&#xff0c;思路一定要清晰。 还有注意的地方&#xff1a;打印的时候一定要先打印到缓存buffer中&#xff0c;然后再输出到屏幕上面。 #include <bits/stdc.h> using namespace std; int idx 0; int val[100],lft[100],rgt[100…

jzoj3501-消息传递【换根法,树形dp】

正题 题目链接:https://jzoj.net/senior/#contest/show/3005/1 题目大意 一棵树&#xff0c;一个信息开始给一个人&#xff0c;每次得到信息的人可以选择相邻节点中的一个传递&#xff0c;求最短多久可以传到所有人。 解题思路 我们先考虑如何求一根的答案&#xff0c;farif…

【贪心】最佳浏览路线问题

最佳浏览路线问题最佳浏览路线问题最佳浏览路线问题 题目描述 某旅游区的街道成网格状&#xff08;见图&#xff09;&#xff0c;其中东西向的街道都是旅游街&#xff0c;南北向的街道都是林荫道。由于游客众多&#xff0c;旅游街被规定为单行道。游客在旅游街上只能从西向东…

Ooui:在浏览器中运行.NET应用

在过去数年中&#xff0c;桌面应用开发人员一直处境艰难&#xff0c;因为人们的主要关注点聚焦于Web和移动应用。由于Microsoft未来Windows平台的计划未定&#xff0c;并且UWP应用也没有突破性进展&#xff0c;因此技术落伍的责任也不应由.NET开发人员来承担。当前迫切需要解决…

5、play中的json数据处理

1、play中的json库 Play使用Jackson JSON库将对象转换为JSON和JSON之间的对象。play的操作使用JsonNode类型&#xff0c;play.libs.json包中有操作json数据的方法 2、java对象和json数据 将java对象转成play中的JsonNode类型&#xff1a; 将JsonNode格式的数据解析到java对象…