跟着Vamei大神-02了解play

来源:互联网 发布:微信水果老虎机源码 编辑:程序博客网 时间:2024/06/06 02:34

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

先做一个简单的demo:

1、在views下新添加一文件dong.scala.html(模板)

模板将视图和数据分开。服务器可以把不同的数据传递给同一个模板,从而产生不同的页面。 Play同样也有一套模板系统。模板的大部分内容都可以用html写,作为视图,而在一些特别的地方,预留给数据参数。在模板中,用Scala语言来调用参数。ok()中接收的是views.html.index.render(),实际上就是app/views/index.scala.html这一模板的render()方法。Play会根据模板,自动生成相应的类。
*** 也可以用import引入views.html.index,而不是使用完整的类路径。

@(message: String,dong:String)表示此页面接受两个参数message和dong都是String。@dong调用参数

注意:在@* *@中加入注释
由于@的特殊功能,为了在模板中显示"@"字符,需要使用@@。

@(message: String,dong:String)<!DOCTYPE html><html>    <head>        <title>@dong</title>        <link rel="stylesheet" media="screen" href="@routes.Assets.at("stylesheets/main.css")">        <link rel="shortcut icon" type="image/png" href="@routes.Assets.at("images/favicon.png")">        <script src="@routes.Assets.at("javascripts/jquery-1.9.0.min.js")" type="text/javascript"></script>    </head>    <body>        @message    </body></html>
2、修改routes文件,添加自己的url映射

GET     /dong                           controllers.Application.dong()

表示get请求,通过/dong(http://localhost:9000/dong),映射到controllers.Application.dong()方法

扩展:(1)GET    /record/:id            controllers.Application.record(id: Long)

http://localhost:9000/record/1234 1234代表id。http://localhost:9000/record/1234/123是错误的访问不到record的方法

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

http://localhost:9000/record/1234 和http://localhost:9000/record/1234/123都能到record的方法

这就是:和*的区别,:后面只能有一个/,而*后面可以有多个/。

# Routes# This file defines all application routes (Higher priority routes first)# ~~~~# Home pageGET     /                           controllers.Application.index()# Home dong add by meGET     /dong                           controllers.Application.dong()# Map static resources from the /public folder to the /assets URL pathGET     /assets/*file               controllers.Assets.at(path="/public", file)
3、修改Application文件,添加自己的方法

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

package controllers;import play.*;import play.mvc.*;import views.html.*;public class Application extends Controller {    public static Result index() {        return ok(index.render("Your new application is ready."));    }    public static Result dong() {        return ok(dong.render("dong ge wei wu ","winter"));    }}
扩展:根据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, 重新定向
此外,我还可以直接使用status()来说明数字形式的状态码
return status(200, "good");
更多的响应生成方式可参考Results

4、然后访问url:http://localhost:9000/dong

看到如下页面:dong ge wei wu

恭喜你。又成功了。

大神语录

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

我还可以用Scala的语法,在模板中实现更复杂的逻辑。比如下面的模板中使用循环:


@(title: String, content: String, lines: List[String])<!DOCTYPE html><html>  <header>    <title>@title</title>  </header>  <body>    <p>@(content) Start using the template.</p>    <ul>    @for(line <- lines) {      <li>@line</li>    }    </ul>  </body></html>
循环是@for实现的。@后面不仅可以是一个对象,还可以是一个完整的Scala语法。

模板中还可以有if选择结构,比如

@if(item) {  <p>True</p>} else {  <p>False</p>}

感谢Vamei大神,我是winter!

0 0