`
desert3
  • 浏览: 2158586 次
  • 性别: 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
分享到:
评论

相关推荐

    play framework 框架手册 word 版

    《Play Framework 框架手册》是一份深入介绍Play框架的文档,主要涵盖了从基础概念到高级特性的全面内容,适合初学者和经验丰富的开发者参考。以下是对手册中部分核心知识点的详细阐述: 1. **MVC应用程序模型**:...

    Play framework 2.0 -第一个应用程序

    Play Framework 2.0 是一个开源的Web应用框架,它基于Scala和Java语言,遵循“模式-动作”(Action)架构,提供了一种轻量级、敏捷开发的方式。本篇文章将引导你通过创建一个简单的待办事项(Todo List)应用来了解...

    PlayFramework框架安全模块.pdf

    此外,Play Framework的Secure模块还支持基于角色的授权(Role-based Authorization),你可以通过`requireRole()`方法指定用户必须拥有特定的角色才能访问特定的控制器或动作。例如,添加`requireRole("admin")`...

    Play Framework Cookbook 代码

    在`conf/routes`文件中,你会看到如`GET /index controllers.Application.index`这样的定义,这表示访问"/index" URL会调用`Application`控制器的`index`方法。 3. **模板引擎**:Play支持Ebean和Anorm等数据库操作...

    Play Framework Essentials

    - **控制器(Controllers)**:处理请求并返回响应,负责业务逻辑的实现。 - **模板引擎(Templating)**:利用Scala或Java的模板引擎来渲染HTML输出。 - **模型-视图-控制器(MVC)模式**:这是一种组织代码的设计...

    Play framework 2.0入门教程(四)的源代码,Play留言板(数据库版)

    Play框架是Java和Scala开发Web应用的一个强大工具,它提供了模型-视图-控制器(MVC)架构模式,使得开发者能够快速、高效地构建现代Web应用。在这个“Play框架2.0入门教程(四)的源代码”中,我们主要探讨的是如何在...

    playframework部分介绍及部分功能简介,小实例一个

    Play Framework 是一个基于Java和Scala的开源Web应用框架,它采用了模型-视图-控制器(MVC)架构模式。在本文中,我们将深入探讨Play Framework的一些核心特点、优势以及一个简单的小实例,帮助你理解其工作原理和...

    Laravel中正确地返回HTTP状态码方法示例

    以下是一个具体的代码示例,演示了在Laravel控制器中如何正确地返回HTTP状态码: ```php namespace App\Http\Controllers; use App\Post; use Symfony\Component\HttpFoundation\Response; class PostsController...

    Swift-递归删除控制器-pop返回控制器

    本话题主要探讨的是如何在Swift中实现递归删除控制器以及利用pop返回控制器的技术。这两个概念是iOS应用开发中的重要组成部分,特别是在处理导航栈和视图控制器管理时。 首先,让我们深入理解递归删除控制器的概念...

    play框架手册

    app/controllers - 8 - app/models - 8 - app/views - 8 - 请求生命周期 - 8 - 标准应用程序布局layout - 9 - app目录 - 9 - public目录 - 10 - conf目录 - 10 - lib目录 - 11 - 开发生命周期 - 11 - 连接到java调试...

    play-route

    在Play Framework中,`play-route`是一个至关重要的概念,它涉及到如何将HTTP请求与应用程序的特定功能(即控制器中的Action)关联起来。路由是MVC(模型-视图-控制器)架构的一个关键部分,它负责将HTTP请求转换为...

    PLC可编程逻辑控制器(Programmable Logic Controllers)-2015年最新英文原版,0积分

    PLC可编程逻辑控制器(Programmable Logic Controllers)-2015年最新英文原版,0积分——该书内容丰富,介绍了PLC相关的方方面面,全书419页,是值得参阅的PLC入门书籍。

    play-framework-kotlin,这个存储库将展示如何使用kotlin创建play框架项目.zip

    在Kotlin中,你可以定义带有注解的控制器类,这些类处理HTTP请求并返回响应。例如,`controllers`子目录下的类可能定义了处理GET和POST请求的方法,使用Kotlin的函数式编程特性来简化代码。 `conf`目录下包含应用...

    OC-递归删除控制器-pop返回控制器

    递归删除控制器常用于清理用户导航历史,比如在登录后需要清除所有之前的状态,或者在特定的操作后用户不需要返回到之前的视图。此外,如果有一个包含多个步骤的流程,当用户完成或取消时,也可能需要一次性移除...

    ios-IOS父子控制器滑动导航.zip

    在iOS开发中,父控制器(Container View Controller)是一种可以包含一个或多个子控制器(Child View Controllers)的特殊控制器,用于组合多个视图控制器的功能和界面。这种设计允许开发者创建更复杂的UI结构,...

    ASP.NET MVC框架开发系列课程(5):控制器(Controller)以及Action

    ASP.NET MVC框架是微软开发的一款...课程内容可能包括创建和配置控制器,定义和调用Action,理解路由和参数绑定,以及如何有效地处理请求和响应。配合提供的PPT、视频、文档和示例,将有助于你深入理解和掌握这些概念。

    Rabbit Framework for MVC使用入门

    - **MVC模块通常包含控制器(Controllers)**,它们处理HTTP请求并返回响应。 - **视图(Views)**是用户界面,与控制器配合呈现数据。 - **模型(Models)**代表应用程序的数据和业务逻辑。 **2. 安装最新的MVC ...

    CI跨控制器请求实例讲解

    首先,理解CI的控制器(Controllers)是应用程序的核心部分,它们负责接收用户请求并调用模型、视图或其他必要的资源来处理这些请求。当一个控制器需要从另一个控制器获取数据或执行某些操作时,就涉及到跨控制器...

    (5)asp.net mvc3控制器(Controller)以及Action

    ASP.NET MVC3是一个基于模型-...综上所述,ASP.NET MVC3控制器和Action是构建Web应用的核心元素,它们负责接收请求、执行业务逻辑和返回响应。通过理解并熟练运用这些概念,开发者可以构建出高效、结构清晰的Web应用。

Global site tag (gtag.js) - Google Analytics