• 来玩Play框架02 响应


    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明。谢谢! 

     

    我上一章总结了Play框架的基本使用。这一章里,我将修改和增加响应。

    HTTP协议是按照“请求-响应”的方式工作。Play框架的核心是用动作(Action)来完成“请求-响应”。一个动作负责处理一种请求。一个项目可能要定义许多动作。复杂的网站,可能要定义上百个动作。所以,Play使用控制器(Controller)和URL路由(URL routing)来组织管理动作。控制器用于给动作分类。URL路由(routes)记录了URL和动作的对应关系。

     

    IDE

    在开发代码之前,先简单介绍如何使用Eclipse,开发Play项目。

    在项目的根目录下,使用命令:

    play eclipse

    成功后,打开Eclipse,在File->Import中,选择General->Existing Projects into Workspace。在Select root directory中,选择项目的根目录。随后,项目被引入Eclipse。

     

    Java是静态语言,可以在编译时就决定对象的类型,因此能方便的实现代码自动提示补齐、自动寻找类所在的包并import。在写程序的过程中,也能有很多友好提示。

    后面的代码中,如果没有写明import的包,可以在Eclipse环境下自动寻找。

     

    理解响应

    我先来介绍控制器和URL路由。我以Play默认生成的动作为例讲解。你可以在Play项目中找到下面文件。

    一个请求进入服务器后,由URL路由引导到正确的动作来处理。URL路由根据请求的方法和URL来识别这一请求,再寻找对应动作。

     

    URL路由是一个文件,即项目根目录下的conf/routes。文件的每一行是一条记录,规定了某个URL的对应动作。比如:

    # Home page
    GET     /                           controllers.Application.index()

    #开始的行是注释

    记录分为三个部分。第一部分为请求的方法,第二个部分为请求的URL,第三个是请求的对应动作。这里Application是一个控制器,位于app/controllers/Application.java中。一个控制器也是一个Java类。而动作index()是类的一个方法。

     

    我对默认生成的Application.java略作修改。新的app/controllers/Application.java为:

    package controllers;
    
    import play.*;
    import play.mvc.*;
    
    import views.html.*;
    
    public class Application extends Controller {
    
        public static Result index() {
            return ok("Hello World!");
        }
    
    }

    可以注意到,作为控制器的Application,需要继承自Controller类。

    一个动作必须是一个静态(static)的方法。一个动作返回一个Result类型的对象。ok("Hello World!")返回的就是这么一个Result对象,代表了一个HTTP响应。ok()返回的响应都是200状态,即ok(正常回复)。在这个例子中,响应的主体内容为"Hello World!"。

     

    你可以启动Play服务器,访问上面的URL(localhost:9000/)。使用Chrome的network工具监视回复。页面如下:

    根据network工具的监视,响应的状态码为200。响应的类型为text/plain。这是ok()生成Result对象时自动决定的。我可以手动控制响应类型,比如将index()的返回语句改为:

    return ok("Hello World!").as("text/html");

    这样,响应的主体类型为html。

     

    其它状态的响应

     

    除了ok()之外,Play还提供了其他的一些便捷方法,用以生成不同状态的响应。这些方法的名字和状态的名字相同,比如:

    return badRequest("bad request"); // 400, 坏请求
    return unauthorized("You are forbidden"); // 401, 未授权
    return redirect("/new");    // 303, 重新定向

    这些方法返回对应的状态码。浏览器根据状态码和回复的内容,做出反应。比如收到303时,重新定向到新的URL。

     

    此外,我还可以直接使用status()来说明数字形式的状态码

    return status(200, "good");

     

    更多的响应生成方式可参考Results

     

    练习

    在上面的控制器Application中,增加一个新的动作,用于显示

    <p>See you!</p>

    修改routes,并验证效果。

     

    URL路由

    URL路由是由一行一行的记录组成的。上面我们看到了GET方法,还可以是其它HTTP方法,比如POST:

    POST    /somePost                   controllers.Application.somePost()

    我要在Application类中增加somePost()动作来处理该请求,比如:

    public static Result somePost() {
        return ok("posted");
    }

    POST方法常用于向服务器提交数据。我将在以后深入。

    url还可以有用户定义的变量,从而让一行记录对应不止一个请求,比如:

    GET    /record/:id            controllers.Application.record(id: Long)

    上面的:id是一个名为id的变量。":"是一个提示符。id将从":"开始,直到结束或者另一个"/"。

    当我们访问/record/1234时,id就是1234。对应的动作包含有一个参数,来接收id变量。我这里把参数类型定义为Long。Play将负责类型的转换。

    相应的record()动作为:

    public static Result record(Long id) {
        return ok("record:" + id.toString());
    }

    可以看到,该动作与之前的动作有点不一样,它接受一个参数,即来自url的变量。

    除了":"之外,还有另一个提示符"*"。与":"不同,"*"表示的区间不受"/"限制。

    GET    /newRecord/*name           controllers.Application.newRecord(name: String)

    如果我们访问/newRecord/abc/def,那么name将对应字符串"abc/def"

    总结

    动作、控制器、URL路由

    ok()

     

    欢迎继续阅读“Java快速教程”系列文章

     

     

  • 相关阅读:
    Out of Hay POJ
    Sum Problem hdu 1001
    N! hdu 1042
    线性表的链式表示和实现(插入删除建空合并)
    NYOJ 1007
    NYOJ 954
    NYOJ 998
    NYOJ 455
    NYOJ 975
    数据结构复习0---线性表
  • 原文地址:https://www.cnblogs.com/vamei/p/3704839.html
Copyright © 2020-2023  润新知