Play framework Controllers控制器、action链式调用、返回的HTTP状态码

Playframework中的控制器放在controllers包中,并集成play.mvc.Controller类。每个public static方法都对应控制器的一个action操作,action方法没有return语句块,一般都通过调用框架的result方法处理Response返回。

package controllers;

import models.Client;
import play.mvc.Controller;

public class Clients extends Controller {

public static void show(Long id) {
Client client = Client.findById(id);
render(client);
}

public static void delete(Long id) {
Client client = Client.findById(id);
client.delete();
}

}

[b]获取HTTP参数:[/b]
[list]
[*]简单类型参数
[*]高级Java类型参数
[*]Date参数
[*]Calendar参数
[*]File参数
[*]数组、集合参数
[*]POJO(简单Java对象)参数
[*]JPA对象参数
[*]自定义参数绑定@play.data.binding.As @play.data.binding.NoBinding play.data.binding.TypeBinder @play.data.binding.Global
[/list]
[b]Response返回类型:[/b]action方法必须生成HTTP Response。最简单的方法就是发出一个Result对象。当Result对象被发出后,正常的代码执行流就会被中止,方法被返回。[color=red]即发出Result对象后,后续的代码将不再被执行![/color]

public static void show(Long id) {
Client client = Client.findById(id);
render(client);
System.out.println("This message will never be displayed !");
}

[list]
[*]renderText
[*]renderBinary
[*]下载文件
[*]返回默认匹配的模板render 模板参数:renderArgs.put("client", client);
[*]指定返回特定的模板 renderTemplate("Clients/showClient.html", id, client);
[*]重定向redirect("http://www.zenexity.fr");
[*]action链:链式调用
[/list]
[b]自定义response编码[/b] response.encoding = "ISO-8859-1";
[b]自定义request编码[/b] accept-charset告诉浏览器使用什么编码发送数据 _charset_隐藏域告诉play框架发送的请求使用的是什么编码

[b]HTTP拦截器:[/b]
[list]
[*]@Before: 注解表明在控制器的每个action方法被调用之前,调用这个拦截器
[*]@After: 注解表明在控制器的每个action方法被正常调用之后,调用这个拦截器
[*]@Finally: 在每个action方法调用后(不管是正常调用还是异常结束),调用这个拦截器
[*]@Catch: 特定异常拦截器,异常拦截优先顺序 priority = 1
[*]@With: 由于Java不允许多重继承,因此使用继承层次的拦截器会有一定的限制,这时,你可以在不同的类中定义不同的拦截器方法,然后用@With注解来调用 @With(Secure.class)
[/list]
[color=red]继承的控制器会自动继承父类的拦截器[/color]
对于@Before,@After和@Finally拦截器,可以使用unless或者only参数来[color=red]指定、排除特定的action方法[/color] @Before(unless="login") @Before(only={"login","logout"})

public class Admin extends Application {

@Before
static void checkAuthentification() {
if(session.get("user") == null) login();
}

@Catch(IllegalStateException.class)
public static void logIllegalState(Throwable throwable) {
Logger.error("Illegal state %s…", throwable);
}

@Finally
static void log() {
Logger.info("Response contains : " + response.out);
}

public static void index() {
List<User> users = User.findAll();
render(users);
}

@Finally
static void log(Throwable e) {
if( e == null ){
Logger.info("action call was successful");
} else{
Logger.info("action call failed", e);
}
}

public static void index() {
List<User> users = User.findAll();
render(users);
}
}

public class Secure extends Controller {

@Before
static void checkAuthenticated() {
if(!session.containsKey("user")) {
unAuthorized();
}
}
}
@With(Secure.class)
public class Admin extends Application {


}

[b]Session and Flash:[/b]它们的数据都不保存在服务器端,保存在[color=red]加密的客户端Cookie[/color]中。它们的值是通过Cookie机制加到http请求中的。所以[color=red]只能最大保存4KB的数据,并且只能保存字符串值[/color]。
[list]
[*]Session:用户会话进程中起作用
[*]Flash:下个请求中起作用
[/list]
[b]action链:链式调用[/b][url=http://www.playframework.org/documentation/1.2.3/controllers#chaining]playframework 1.2.3 Controllers Action chaining[/url]
playframework中没有和Servlet api中forward相应的功能。[color=red]一个Http请求只能调用一个action方法[/color]。如果你要调用另外的action,那么只能使用浏览器redirect 那个action对应的url来完成。这种情况下,浏览器url和执行的action方法一一对应。浏览器的后退、前进、刷新就很容易管理。

你可以简单地通过java的方式调用另外一个action方法,playframework会自动地发送重定向请求到另外的action方法。

public class Clients extends Controller {

public static void show(Long id) {
Client client = Client.findById(id);
render(client);
}

public static void create(String name) {
Client client = new Client(name);
client.save();
show(client.id);
}
}

// 相应路由信息:
GET /clients/{id} Clients.show
POST /clients Clients.create

[b]playframework相应的处理机制:[/b]
[list]
[*]浏览器发送一个POST请求到/clients url
[*]playframework Router模块调用Clients控制器的create方法
[*]create方法执行时调用控制器的show 方法
[*]Router模块解析这个包含id参数的Clients.show方法的调用请求,并且生成相应的url
[*]Http Response返回状态码302,并伴随重定向的url信息 Location:/clients/3132.
[*]浏览器然后发送http重定向请求到/clients/3132
[*][color=red]因此最终返回的Http状态码是302, 而不调用其他控制器方法的action正常执行完成后,一般返回的Http状态码是200[/color]
[*]要[color=red]避免Http状态码的改变同时要迁移到非默认的模板页面[/color],可以通过调用[color=red]renderTemplate[/color]("Application/show.html",something);方法来实现
[/list]
参考:[url=http://www.playframework.org/documentation/1.2.3/controllers]playframework 1.2.3 Controllers[/url]
别再对着ACF/PACF图发懵了!用R语言实战教你一眼分清AR、MA和ARMA模型 本文通过R语言实战详细解析了时间序列分析中AR、MA和ARMA模型的特征图识别技巧。重点讲解了如何通过ACF和PACF图的截尾与拖尾特征快速判断模型类型,帮助数据分析师建立从图形到模型的直觉映射,提升时间序列分析的效率和准确性。 阅读详情

相关推荐

Windows下玩转Spark:零基础本地集群搭建与实战演示

本文详细介绍了在Windows系统下零基础搭建Spark本地集群的完整流程,包括环境准备、集群启动、实战案例演示及性能优化技巧。通过Standalone模式快速部署,结合WordCount等经典案例帮助初学者快速掌握Spark数据处理,特别适合Windows环境下的大数据开发入门学习。

weixin_33734785的博客 399

1、play编程基础

1、Action、Controller、Result Action指的是动作,play中大多数请求可以使用action来处理,一个请求对应一个动作也就是一个java方法,然后处理请求返回一个响应,这个响应用Result来体现 Controller就是一个继承了 play.mvc.Controller 的java类,他的返回值也是一个Result,也可以用来处理请求 Result用于返回请求的处理响应信息,它提供了一些html生成器,帮助开发者直接返回 上边这些都可以包含响应的

chaizepeng的博客 1274

【IxNetwork】史上最全IxNetwork测试仪使用精讲(一),图文教程超赞超详细!!!

IXIA使用的是Server-client模式,Server端在测试仪表的主机上,在开机后会随着主机内的操作系统的启动而自动启动,一般情况下不需要人为的手工启动。因此在通常不需要为主机配置专用的显示器和键盘。client端包括两个测试软件: Ixia Explorer和ScriptMate。这两个软件一般安装在测试用计算机上,在仪表自带的主机中也有这两个软件。根据测试项目的不同来选择使用不同的软件。Ixia Explorer主要提供数据流的测试,针对设备的功能进行测试

风云说通信 1992

Play framework 控制器Controllers

业务逻辑在域模型层中进行管理。作为客户端(通常是Web浏览器)不能直接调用此代码,一个域对象的功能暴露为代表的URI的资源。一个域对象的功能暴露为代表的URI的资源。

OceanSky的专栏 2348

Play Framework 框架的控制器(Controller)

Business logic is managed in the domain model layer. As a client (typically a web browser) cannot directly invoke this code, the functionality of a domain object is exposed as resources represented by

w_j_w2010的博客 1725

Struts2中的Action链式处理

为什么80%的码农都做不了架构师?>>> ...

weixin_33835690的博客 211

Play framework Action、Controller和Result

什么是Action? Play应用程序接收到的大多数请求都是由一个Action操作处理,一个Action基本上是一个Java方法处理请求参数,并产生一个结果发送到客户端。   public static Result index() { return ok("Got request " + request() + "!"); } 一个Action返回一个play.mvc.Resu...

OceanSky的专栏 1349

play framework2学习之旅<2.1>Actions, Controllers and Results

Actions, Controllers and Results What is an Action? Most of the requests received by a Play application are handled by an Action. An action is basically a Java method that processes the req

msz1992的专栏 1047

Play! Framework 学习笔记(一):初识Play

    开篇: 文字块说明: 1)蓝字:正文 2)棕字:小节标题 3)@引用:写给入门阶段的学弟学妹,下面示例: @ 写给入门阶段的学弟学妹 4)需要醒目的文字:比较重要的步骤或者阅读代码中比较重要的部分 5)其他引用:一些解释性的描述,下面示例 这是个问题 这个问题是这样的。。。       自我介绍: 小弟是一名二年级学生,目前正在企业里做Int...

DJb4ke的专栏 611

Play 1.x框架学习之三:控制层发起HTTP请求 (Send Http Request In Controller)

为什么80%的码农都做不了架构师?>>> ...

weixin_34115824的博客 403

Play! Framework 系列(二):play 的项目结构

在 Play! Framework 系列(一)中我们初步了解了一下 Play! 的各种特性以及优势,那么从现在开始我们将正式接触 Play!。本文将介绍一下 Play! 的整体结构,然后通过一个非常简单的例子来阐述各个结构之间的关系以及如何利用 Play! 约定的结构去合理地组织我们的业务逻辑。结构概览上图为基于 Play! 而创建的一个简单的 Web 应用,在上一篇文章中我们说过 Play! 是...

学亮编程手记 4272

调用action的几种方法

1 配置完struts后 用表单调用2 ajax3 在javascrip函数中可以用 windows.location.href="action.action?action=fangfaname"

yuange 3384

playframework--控制器

3.1 控制器概述这是一个控制器:package controllers;import models.Client; import play.mvc.Controller;public class Clients extends Controller { public static void show(Long id) { Client client = Client.find

twx843571091的博客 757

play教程 第五课 play中Controller的用法

Controller(控制器)是play中MVC的“C”部分,在 Play 框架中,控制器其实就是一个 Java类,位于 controllers 包中,继承了父类 play.mvc.Controller。 举个简单的例子:public class Clients extends Controller { public static void show(Long id) {

爱读书的旅行者 1万+

Python 进阶提升(十二):自动化测试与 DevOps 实战

本文系统梳理Python工程化实践,聚焦自动化测试与DevOps闭环。基于测试金字塔理念,以pytest为核心构建单元测试体系,结合Mock隔离依赖、fixture复用资源,实现高效稳定的测试。通过CI/CD流水线集成静态检查、覆盖率统计与容器化部署,配合Prometheus与Sentry实现监控三支柱。最终形成“单元测试为主、集成测试为辅、端到端测试兜底”的可落地工程化方案,支撑持续交付与高质量迭代。

2601_96632650的博客 460

Case Generator · PC 端自动化测试模块

本文档详细介绍了PC自动化工具在窗口管理、截图、元素抓取、录制、编排、调试及执行节点等方面的全面功能升级。核心改进包括:目标窗口与弹窗智能跟随、真实键盘输入修复、控件树优化与虚拟化项隐藏、多实例按最近使用优选、执行节点按应用/节点隔离及30分钟会话回收、调试面板增强断点与变量监控能力,以及端到端测试验证通过。系统支持场景保存、元素库管理、权限控制与跨平台兼容,部署需同步更新执行节点并调整控件树上限参数。

QWERTY55555的专栏 166

AI 时代测试工程师的武器库:实战工具指南

AI时代测试工程师工具链全面升级,覆盖用例生成、自动化脚本、API测试、性能监控及LLM应用专项测试。实战中,AI可3分钟生成结构化用例,Playwright实现智能元素定位与零代码脚本生成,promptfoo助力Prompt多维度自动化评测。关键在于:以AI提效,人工把关边界与安全,构建高效、稳定的测试体系。

梧桐凰的博客 201

Github Copilot 新手快速上手指南

本文基于一线开发经验,系统梳理智能编程助手的落地实践,涵盖环境搭建、账号配置、代码补全、对话交互、测试生成、逻辑优化等核心功能。通过实战案例与排查指南,指导开发者高效集成AI工具,提升编码效率。强调提示词优化与隐私安全,助力构建人机协同的现代化开发模式。

王明的博客 166

AngusTester 与 Postman、MeterSphere:私有化统一测试怎么选

AngusTester 一份 YAML 覆盖协议、Web、移动、LLM 和性能;计划、用例、脚本、报告同台。它和桌面 HTTP 客户端不是一回事。人工 + Agent MCP双支持。

AngusTester 869

Java 项目实战: 外卖平台-Maven工程搭建静态资源映射与消息转换器

本文详细阐述了从零搭建Maven工程并实现前后端分离的完整流程:通过配置GroupId、ArtifactId及JDK 1.8,确保环境正确;继承spring-boot-starter-parent统一依赖管理;配置application.yml实现数据源与MyBatis-Plus驼峰映射、雪花算法主键策略;启动类启用Servlet组件扫描与事务管理;导入前端静态资源后,通过WebMvcConfig扩展静态资源映射与消息转换器,解决Long类型精度丢失问题,最终实现项目可启动、页面可访问、数据序列化正常。

Wang的专栏 216

Day18在接口自动化测试中引入pytest用例管理框架

运行run.py→启动 pytest → 自动搜索test_开头文件和方法,执行所有用例 → 控制台打印每个用例状态。pytest 会自动扫描项目,按规则查找所有符合命名规范的测试模块、测试类、测试方法,自动执行全部用例。

2302_80577107的博客 148
上一篇: Linux time命令、dd命令、测试硬盘读写速度、磁盘备份恢复
下一篇: ftp、sftp、scp、ssh、openssh
desert3
博客等级 码龄20年 18粉丝 353原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值