`
desert3
  • 浏览: 2158623 次
  • 性别: Icon_minigender_1
  • 来自: 合肥
社区版块
存档分类
最新评论

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();
    }
 
}

获取HTTP参数:
  • 简单类型参数
  • 高级Java类型参数
  • Date参数
  • Calendar参数
  • File参数
  • 数组、集合参数
  • POJO(简单Java对象)参数
  • JPA对象参数
  • 自定义参数绑定@play.data.binding.As @play.data.binding.NoBinding play.data.binding.TypeBinder @play.data.binding.Global

Response返回类型:action方法必须生成HTTP Response。最简单的方法就是发出一个Result对象。当Result对象被发出后,正常的代码执行流就会被中止,方法被返回。即发出Result对象后,后续的代码将不再被执行!
public static void show(Long id) {
    Client client = Client.findById(id);
    render(client);
    System.out.println("This message will never be displayed !");
}

  • renderText
  • renderBinary
  • 下载文件
  • 返回默认匹配的模板render 模板参数:renderArgs.put("client", client);
  • 指定返回特定的模板 renderTemplate("Clients/showClient.html", id, client);
  • 重定向redirect("http://www.zenexity.fr");
  • action链:链式调用

自定义response编码 response.encoding = "ISO-8859-1";
自定义request编码 accept-charset告诉浏览器使用什么编码发送数据 _charset_隐藏域告诉play框架发送的请求使用的是什么编码

HTTP拦截器:
  • @Before: 注解表明在控制器的每个action方法被调用之前,调用这个拦截器
  • @After: 注解表明在控制器的每个action方法被正常调用之后,调用这个拦截器
  • @Finally: 在每个action方法调用后(不管是正常调用还是异常结束),调用这个拦截器
  • @Catch: 特定异常拦截器,异常拦截优先顺序 priority = 1
  • @With: 由于Java不允许多重继承,因此使用继承层次的拦截器会有一定的限制,这时,你可以在不同的类中定义不同的拦截器方法,然后用@With注解来调用 @With(Secure.class)

继承的控制器会自动继承父类的拦截器
对于@Before,@After和@Finally拦截器,可以使用unless或者only参数来指定、排除特定的action方法  @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 {
    
    …
}

Session and Flash:它们的数据都不保存在服务器端,保存在加密的客户端Cookie中。它们的值是通过Cookie机制加到http请求中的。所以只能最大保存4KB的数据,并且只能保存字符串值
  • Session:用户会话进程中起作用
  • Flash:下个请求中起作用

action链:链式调用playframework 1.2.3 Controllers Action chaining
playframework中没有和Servlet api中forward相应的功能。一个Http请求只能调用一个action方法。如果你要调用另外的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 

playframework相应的处理机制:
  • 浏览器发送一个POST请求到/clients url
  • playframework Router模块调用Clients控制器的create方法
  • create方法执行时调用控制器的show 方法
  • Router模块解析这个包含id参数的Clients.show方法的调用请求,并且生成相应的url
  • Http Response返回状态码302,并伴随重定向的url信息 Location:/clients/3132.
  • 浏览器然后发送http重定向请求到/clients/3132
  • 因此最终返回的Http状态码是302, 而不调用其他控制器方法的action正常执行完成后,一般返回的Http状态码是200
  • 避免Http状态码的改变同时要迁移到非默认的模板页面,可以通过调用renderTemplate("Application/show.html",something);方法来实现

参考:playframework 1.2.3 Controllers
分享到:
评论

相关推荐

    2023全球人工智能研究院观点报告:生成式人工智能对企业的影响和商业前景

    内容概要:报告详细介绍了生成式人工智能对企业和消费者的影响及其商业前景。生成式人工智能通过生成与训练数据相似的新颖数据,提升了人工智能从‘赋能者’到‘协作者’的角色。报告讨论了生成式人工智能的技术基础,如Transformers,以及在消费者和企业中的应用案例。文中指出,生成式人工智能可以优化企业的工作流程,提高效率和创新能力,但同时强调了安全性、数据隐私和道德等问题。 适合人群:企业高管、技术领导者、数据科学家、产品经理等。 使用场景及目标:帮助企业理解和评估生成式人工智能的商业潜力,优化内部流程,提高效率和创新力,以及防范潜在的风险。 其他说明:生成式人工智能正处于快速发展的初期阶段,各行业都有广阔的应用前景,但需要注意监管和风险管理。

    2024年第三季度深圳房地产市场回顾-CBRE.pdf

    2024年第三季度深圳房地产市场回顾-CBRE

    【java毕业设计】springboot南皮站化验室(springboot+vue+mysql+说明文档).zip

    项目经过测试均可完美运行! 环境说明: 开发语言:java 框架:ssm jdk版本:jdk1.8 数据库:mysql 5.7+ 数据库工具:Navicat11+ 管理工具:maven 开发工具:idea/eclipse 部署容器:tomcat7+

    【路径规划】基于matlab单障碍物和多障碍物的机器人避达问题仿真【Matlab仿真 7339期】.md

    CSDN Matlab武动乾坤上传的资料均有对应的代码,代码均可运行,亲测可用,适合小白; 1、代码压缩包内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2019b;若运行有误,根据提示修改;若不会,私信博主; 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可私信博主或扫描博客文章底部QQ名片; 4.1 博客或资源的完整代码提供 4.2 期刊或参考文献复现 4.3 Matlab程序定制 4.4 科研合作

    ccc2.4.13 内置inspector改造

    ccc2.4.13 内置inspector改造

    “人力资源+大数据+薪酬报告+涨薪调薪”

    人力资源+大数据+薪酬报告+涨薪调薪,在学习、工作生活中,越来越多的事务都会使用到报告,通常情况下,报告的内容含量大、篇幅较长。那么什么样的薪酬报告才是有效的呢?以下是小编精心整理的调薪申请报告,欢迎大家分享。相信老板看到这样的报告,一定会考虑涨薪的哦。

    基于android北京地铁小助手有导航功能.zip

    内容概要:本资源聚焦 Android 编程实战,包含毕业设计示例、完整的 Android 项目源码及文档分享。采用 MVC 模式进行架构设计,结合 JSP 技术与 SQL Server 2000 数据库管理系统,实现高效的 Android 应用开发。 适用人群:Android 开发初学者、计算机专业学生进行毕业设计参考、希望提升 Android 开发技能的程序员。 实用场景及目标:适用于开发各类 Android 应用项目,帮助开发者快速构建稳定、功能丰富的应用程序,同时为毕业设计提供优质的模板和思路。 说明:资源提供了详细的代码注释和文档说明,方便学习者理解和上手,助力提升 Android 开发能力和项目实战经验。

    仿新浪微博下拉刷新继承FrameLayout.zip

    内容概要:本资源聚焦 Android 编程实战,包含毕业设计示例、完整的 Android 项目源码及文档分享。采用 MVC 模式进行架构设计,结合 JSP 技术与 SQL Server 2000 数据库管理系统,实现高效的 Android 应用开发。 适用人群:Android 开发初学者、计算机专业学生进行毕业设计参考、希望提升 Android 开发技能的程序员。 实用场景及目标:适用于开发各类 Android 应用项目,帮助开发者快速构建稳定、功能丰富的应用程序,同时为毕业设计提供优质的模板和思路。 说明:资源提供了详细的代码注释和文档说明,方便学习者理解和上手,助力提升 Android 开发能力和项目实战经验。

    vgg模型-通过CNN卷积神经网络的历史遗迹识别-不含数据集图片-含逐行注释和说明文档.zip

    本代码是基于python pytorch环境安装的。 下载本代码后,有个环境安装的requirement.txt文本 首先是代码的整体介绍 总共是3个py文件,十分的简便 本代码是不含数据集图片的,下载本代码后需要自行搜集图片放到对应的文件夹下即可 需要我们往每个文件夹下搜集来图片放到对应文件夹下,每个对应的文件夹里面也有一张提示图,提示图片放的位置 然后我们需要将搜集来的图片,直接放到对应的文件夹下,就可以对代码进行训练了。 运行01生成txt.py,是将数据集文件夹下的图片路径和对应的标签生成txt格式,划分了训练集和验证集 运行02CNN训练数据集.py,会自动读取txt文本内的内容进行训练,这里是适配了数据集的分类文件夹个数,即使增加了分类文件夹,也不需要修改代码即可训练 训练过程中会有训练进度条,可以查看大概训练的时长,每个epoch训练完后会显示准确率和损失值 训练结束后,会保存log日志,记录每个epoch的准确率和损失值 最后训练的模型会保存在本地名称为model.ckpt 运行03pyqt界面.py,就可以实现自己训练好的模型去识别图片了

    【java毕业设计】springboot共享经济背景下校园闲置物品交易平台(springboot+mysql+说明文档).zip

    项目经过测试均可完美运行! 环境说明: 开发语言:java 框架:ssm jdk版本:jdk1.8 数据库:mysql 5.7+ 数据库工具:Navicat11+ 管理工具:maven 开发工具:idea/eclipse 部署容器:tomcat7+

    zadig-2.9.rar

    zadig-2.9.rar USB JTAG/serial debug unit

    竖直SeekBar源码.zip

    内容概要:本资源聚焦 Android 编程实战,包含毕业设计示例、完整的 Android 项目源码及文档分享。采用 MVC 模式进行架构设计,结合 JSP 技术与 SQL Server 2000 数据库管理系统,实现高效的 Android 应用开发。 适用人群:Android 开发初学者、计算机专业学生进行毕业设计参考、希望提升 Android 开发技能的程序员。 实用场景及目标:适用于开发各类 Android 应用项目,帮助开发者快速构建稳定、功能丰富的应用程序,同时为毕业设计提供优质的模板和思路。 说明:资源提供了详细的代码注释和文档说明,方便学习者理解和上手,助力提升 Android 开发能力和项目实战经验。

    weixin295微信小程序选课系统+ssm后端毕业源码案例设计.zip

    weixin295微信小程序选课系统+ssm后端毕业源码案例设计 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。

    【路径规划】基于matlab A_Star多机器人避障路径规划【Matlab仿真 3934期】.md

    CSDN Matlab武动乾坤上传的资料均有对应的代码,代码均可运行,亲测可用,适合小白; 1、代码压缩包内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2019b;若运行有误,根据提示修改;若不会,私信博主; 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可私信博主或扫描博客文章底部QQ名片; 4.1 博客或资源的完整代码提供 4.2 期刊或参考文献复现 4.3 Matlab程序定制 4.4 科研合作

    【java毕业设计】SpringBoot在线智慧考公系统(springboot+vue+mysql+说明文档).zip

    项目经过测试均可完美运行! 环境说明: 开发语言:java 框架:ssm jdk版本:jdk1.8 数据库:mysql 5.7+ 数据库工具:Navicat11+ 管理工具:maven 开发工具:idea/eclipse 部署容器:tomcat7+

    【路径规划】基于matalb A_Star算法求解六边形栅格地图路径规划【Matlab仿真 2623期】.md

    CSDN Matlab武动乾坤上传的资料均有对应的代码,代码均可运行,亲测可用,适合小白; 1、代码压缩包内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2019b;若运行有误,根据提示修改;若不会,私信博主; 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可私信博主或扫描博客文章底部QQ名片; 4.1 博客或资源的完整代码提供 4.2 期刊或参考文献复现 4.3 Matlab程序定制 4.4 科研合作

    基于OpenWrt系统,加入了Phytium CPU和开发板的支持,开发者可以在Phytium CPU上使用OpenWrt系统

    Phytium OpenWrt 是基于OpenWrt系统,加入了Phytium CPU和开发板的支持,开发者可以在Phytium CPU上使用OpenWrt系统。

    JS实现的虚化雪景动态背景特效源码.zip

    JS实现的虚化雪景动态背景特效源码

    ElasticSearch同步MySQL环境搭建笔记

    ElasticSearch同步MySQL环境搭建笔记

    alexnet模型-基于深度学习对水族馆生物识别-不含数据集图片-含逐行注释和说明文档.zip

    本代码是基于python pytorch环境安装的。 下载本代码后,有个环境安装的requirement.txt文本 首先是代码的整体介绍 总共是3个py文件,十分的简便 本代码是不含数据集图片的,下载本代码后需要自行搜集图片放到对应的文件夹下即可 需要我们往每个文件夹下搜集来图片放到对应文件夹下,每个对应的文件夹里面也有一张提示图,提示图片放的位置 然后我们需要将搜集来的图片,直接放到对应的文件夹下,就可以对代码进行训练了。 运行01生成txt.py,是将数据集文件夹下的图片路径和对应的标签生成txt格式,划分了训练集和验证集 运行02CNN训练数据集.py,会自动读取txt文本内的内容进行训练,这里是适配了数据集的分类文件夹个数,即使增加了分类文件夹,也不需要修改代码即可训练 训练过程中会有训练进度条,可以查看大概训练的时长,每个epoch训练完后会显示准确率和损失值 训练结束后,会保存log日志,记录每个epoch的准确率和损失值 最后训练的模型会保存在本地名称为model.ckpt 运行03pyqt界面.py,就可以实现自己训练好的模型去识别图片了

Global site tag (gtag.js) - Google Analytics