`
sky3380
  • 浏览: 5769 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

play2.0文档-面向java开发者(2)

    博客分类:
  • play
阅读更多

 

HTTP routing


内置的HTTP router


router 组件的功能是把收到的HTTP request 转换成对action的调用(controller 里的一个 static,public 方法).

一个HTTP请求被MVC框架看作是一个事件,这个事件包含两个主要的信息:

  • 请求路径(例如 /clients/1542/photos/list),包括查询字符串.
  • HTTP 方法(GET, POST, ...).

Routes 是在 conf/routes 文件中定义的,它会被编译,也就是说你可以直接在浏览器中看到route的错误。

routes 文件语法

conf/routes 是router使用的配置文件。这个文件列出了应用程序所需要的所有routes。每个route由一个HTTP方法和一个与action调用相关联的  URI pattern  组成。

来看一下route是怎样定义的:

GET   /clients/:id          controllers.Clients.show(id: Long)  

注意在对action的调用中,参数类型在参数名称的后面,这有点像scala的定义方式。

每个route的开头是 HTTP方法,后面跟着 URI pattern ,最后面定义了会调用哪个action。

你也可以在route文件中添加评论,用 # 来标识:

# Display a client. GET   /clients/:id          controllers.Clients.show(id: Long)  


HTTP 方法

 

HTTP方法可以是HTTP支持的任何一种有效的方法(GETPOST,PUTDELETEHEAD).

URI pattern

URI pattern表示route的请求路径. 这个请求路径的某些部分可以是动态的。

静态路径

例如,为了提取与 GET /clients/all 相匹配的请求,你可以这样定义:

GET   /clients              controllers.Clients.list()


动态部分

如果你想定义一个通过id来获取一个client的路由,你就需要添加一个动态的部分:

GET   /clients/:id          controllers.Clients.show(id: Long)  

注意一个URI pattern 可以有不止一个动态部分.

对于动态部分的默认匹配策略是由正则表达式 [^/]+ 定义的,这意味着任何被定义成 :id 的动态部分将会被准确的匹配到一个URI的路径部分。

跨越多个/的动态部分

如果你想用一个动态部分来捕获多个独立的URI路径段, 你可以使用正则表达式的*id 语法来定义一个动态部分:

GET   /files/*name          controllers.Application.download(name)  

对于一个像 GET /files/images/logo.png 的请求来说,name的动态部分将会捕获 images/logo.png 这个值

自定义的正则表达式动态部分


你也可以使用$id<regex> 语法来为动态部分定义自己的正则表达式:

GET   /clients/$id<[0-9]+>  controllers.Clients.show(id: Long)  


调用action的产生器方法


route定义的最后一部分是调用。这部分必须定义一个有效的对action方法的调用。

如果方法没有定义任何参数,就只需给出一个合法的方法名:

GET   /                     controllers.Application.homePage()

 

如果action方法定义了参数,相对应的参数值需要从请求的URI中寻找,或者从URI路径本身提取,或者从查询字符串中提取。

# Extract the page parameter from the path. # i.e. http://myserver.com/index GET   /:page                controllers.Application.show(page)

或:

# Extract the page parameter from the query string. # i.e. http://myserver.com/?page=index GET   /                     controllers.Application.show(page)

这是一个 在 controllers.Application 中定义的与show方法对应的controller

public static Result show(String page) {   String content = Page.getContentOf(page);   response().setContentType("text/html");   return ok(content); }


参数类型


对于String类型,参数类型是可选的。如果你想把收到的参数转换成指定的scala类型,你可以显示的添加上。
GET   /client/:id           controllers.Clients.show(id: Long)

并且在controller中相应的action方法参数也需要使用相同的类型。

public static Result show(Long id) {

  Client client = Client.findById(id); 

  return ok(views.html.Client.show(client));

}

注意:参数类型是使用后缀语法定义的,泛型是使用[] 符号定义,而不是像java一样使用<>定义。例如,

List[String]和Java  List<String>是同一种类型


带有固定值的参数

有时候你可能想使用固定值作为参数:

# Extract the page parameter from the path, or fix the value for / GET   /                     controllers.Application.show(page = "home") GET   /:page                controllers.Application.show(page)


带有默认值的参数

你也可以提供一个默认值,如果收到的请求中没找到参数的值就会使用这个默认值。

# Pagination links, like /clients?page=3 GET   /clients              controllers.Clients.list(page: Integer ?= 1)


路由优先级

许多routes可以匹配相同的请求,如果有冲突的话就会使用声明中的第一个route。

反转路由

router可以根据一个java调用来产生一个URL。这使得在一个配置文件里集中配置所有你的URI pattern变得可能,这样,当你做重构是就会更加自信。

对于routes文件中的每一个controller,router都会在 routes 包里生成一个'反转controller', 它有相同的action方法,相同的特征,但是返回的却是一个 play.mvc.Call而不是 play.mvc.Result。

 play.mvc.Call 定义了一个HTTP 调用,而且还提供了HTTP方法和URI.

举个例子,如果你创建一个像这样的controller:

package controllers; 

import play.*; 

import play.mvc.*; 

public class Application extends Controller {

public static Result hello(String name) {

return ok("Hello " + name + "!");

}

}

And if you map it in the conf/routes file:

然后你在conf/routes文件中配置映射关系:

# Hello action GET   /hello/:name          controllers.Application.hello(name)

你就可以通过使用controllers.routes.Application 反转 controller把 URL反转到 hello action 方法

// Redirect to /hello/Bob 

public static Result index() { 

  return redirect(controllers.routes.Application.hello("Bob"));

}

 

分享到:
评论

相关推荐

    Play 2.0 Documentation.pdf

    《Play 2.0 文档》是一份详尽的指南,专为希望利用 Play 框架构建现代 Web 应用程序的 Java 和 Scala 开发者设计。Play 2.0 是一个高生产力的框架,它整合了开发现代 Web 应用所需的各种组件和 API,基于轻量级、无...

    spring2.0 hibernate 3.0 struts1.1 xfire1.2 整合

    这种集成方式在过去的项目中非常常见,但随着技术的发展,现在更多的开发者可能转向使用Spring Boot、Hibernate ORM(取代XFire的现代Web服务框架如Spring Web Services)和更新版本的Struts或替代品如Play ...

    GGScript_2.0.zip

    综上所述,GGScript_2.0.zip 包含的 APK 文件是一个面向 Android 平台的脚本工具,它可能用于游戏开发、自动化任务或者其他需要定制脚本逻辑的场景。用户可以通过安装和使用这个应用来编写、运行和管理 GGScript ...

    SpringMVC文档.zip_spring mvc

    Spring MVC以其模块化、松耦合的设计,以及对依赖注入(DI)和面向切面编程(AOP)的支持,深受开发者喜爱。以下是一些从提供的文档标题中提炼出的关键知识点: 1. **基于Annotation的MVC(Spring 2.5)** - ...

    Scala语法简明教程

    - **面向对象+函数式编程**:Scala融合了面向对象编程和函数式编程的特性,支持类、对象和继承的同时也支持高阶函数、不可变性等函数式编程的核心概念。 - **分布式运行**:Scala设计之初就考虑到了并行和分布式...

    Java Based Software Project Management-开源

    5. **Java框架**:在项目管理中,开发者可能利用Spring Framework、Hibernate ORM、Struts或Play Framework等Java框架来简化开发,提高代码复用性,加速项目进度。 6. **敏捷开发**:在Java软件项目管理中,敏捷...

    2015-Framework:2015年框架

    7. **Groovy与Grails**: Groovy是一种面向Java平台的动态语言,而Grails是基于Groovy的Web应用框架。2015年,Grails 3.x版本发布,带来了许多改进,包括更接近Spring Boot的结构和更快的开发周期。 8. **Apache ...

    buingocduy.github.io

    基于以上信息,我们可以推测"buingocduy.github.io"可能是一个Java开发者或团队的个人网站项目,其中可能包含以下知识点: 1. **GitHub Pages**: GitHub提供的静态网页托管服务,允许用户将仓库中的HTML、CSS和...

    mobile-notification-api:行动通知API

    3. **Java后端开发**:在Java后端,开发者可能使用Spring Boot或Play Framework等框架来构建API服务,这些框架提供了处理HTTP请求、路由、数据访问和事务管理等功能,使得开发高效且易于维护。 4. **RESTful API...

    cds-reimbursement-claim-frontend

    这个项目的描述表明它是一个新存储库,并且其`README.md`文件尚处于初步阶段,意味着项目可能还在开发初期,文档可能不完整,但它是项目开发过程中不可或缺的一部分,通常包含项目简介、安装指南、使用方法等信息。...

    HololiveEN-GEN1-Watson-Amelia-Noises:Amelia Noises Android应用程序的GitHub存储库

    2. **Kotlin/Java编程语言**:Android应用通常用Kotlin或Java编写,Kotlin现在是官方推荐的首选语言。 3. **Android SDK**:开发者会使用Android SDK来访问Android系统的API,实现各种功能,如用户界面、网络通信、...

    SpotifyStreamer:Android Nano度的Project 12

    2. **Java编程**:作为主要编程语言,Java的面向对象特性、类库使用、异常处理以及数据结构等知识将在项目中起到关键作用。 3. **网络通信**:应用需要与Spotify服务器进行交互,因此需要理解HTTP协议和JSON数据...

    SpiritLevel-SL1

    8. **开源许可证**:作为一个开源项目,它应该包含某种形式的开源许可证,例如MIT、Apache 2.0或GPL,这些都会规定其他开发者如何使用和修改源代码。 9. **API集成**:如果应用有更复杂的需求,比如与其他服务集成...

Global site tag (gtag.js) - Google Analytics