您的位置:首页 > 其它

play框架使用起来(5)

2016-11-03 14:55 267 查看
1、逆向生成URL

Play路由器是按照Java调用生成URL的,所以可以将URI表达式都集中到同个配置文件中,使得重构应用变得更加便捷。比如,为conf/routes文件添加如下路由配置:

GET    /clients/{id}      Clients.show


      之后在Java代码中,就可以调用Client.show来生成URL:

map.put("id", 1541);
String url = Router.reverse("Clients.show", map).url;   //     GET /clients/1541


注意:

URL的生成已经集成到框架的大部分组件当中,一般我们不需要直接调用Router.reverse方法。

     如果增加的参数不包含在URI表达式中,这些参数会被添加到查询字符串中:

map.put("id", 1541);
map.put("display", "full");
String url = Router.reverse("Clients.show", map).url;   //    GET /clients/1541?display=full


      同样地,路由器会根据优先顺序匹配最适的URL。

2、设置content type

  Play会根据request.format设定的值,选择指定的media类型来响应HTTP请求。该值通过文件扩展名来决定使用何种视图模板进行渲染,并且通过Play框架中的mime-types.properties文件进行映射处理(映射关系详见play\framework\src\play\libs\mime-types.properties文件),为media类型设定Content-type响应。

      Play请求的默认格式为html,因此index()控制器方法默认的渲染模板文件为index.html。如果需要指定其他的格式,有以下四种方式:

      (1)可以在程序代码调用render()方法之前进行格式设置。比如将media类型设置为text/css,就可以使用CSS文件进行渲染:

public static void index() {
    request.format = "css";
    render();
}


      (2)推荐一种更直接的做法,直接在routes文件中使用URL来指定格式。以下列路由配置为例:首先客户端通过index.xml请求服务器,服务器端将响应格式设置为xml,最后使用index.xml模版进行渲染。

GET   /index.xml                        Application.index(format:'xml')


      同样地,我们也可以使用CSS进行渲染:

GET   /stylesheets/dynamic_css                css.SiteCSS(format:'css')


      (3)Play还可以直接从URL中获取请求格式,动态指定渲染的模板类型。参考如下路由配置:

GET   /index.{format}                        Application.index


      当请求为/index.xml时,服务器会将返回格式设置为xml并使用相应的XMl文件进行渲染;请求为/index.txt时,则会使用文本进行渲染。

      (4)使用Play中的HTTP内容协商进行格式设置,详见以后更新的内容。

3、HTTP内容协商



 Play与其他REST架构的框架一样,直接使用HTTP方法,而不是试图隐藏HTTP或者在上面构建抽象层。内容协商是HTTP的特性,它允许HTTP服务器根据客户端的请求类型,实现同个URL提供不同的media类型响应。客户端可以在Accept header中设置media属性,指定可接收的响应类型。如果用户需要XML响应,则进行如下设置:

Accept:application/xml


      客户端可以指定多种media类型,或使用cacth-all通配符(*/*)来指定任何media类型。

Accept:application/xml,image/png,*/*


      常规的Web浏览器总是在Accept header中包含了通配符的值,这样浏览器便会接受任何media类型。Play将HTML作为默认格式进行渲染,因此在客户端使用HTTP内容协商就显得特别有用:通过Ajax请求返回JSON格式,或是使文档以PDF和EPUB形式显示等


3.1 在HTTP头中设置content type#

      如果Accept header中包含了text/html,application/xhtml或者通配符 */*,Play会选择使用其默认的请求格式(即HTML)。只有当通配符的值被显式指定时,Play才会选择其默认的请求格式。

      Play内置了一些常规格式支持:html、txt、json、xml。下例代码定义了控制器方法(Action)进行数据渲染:

public static void index() {
   final String name = "Peter Hilton";
   final String organisation = "Lunatech Research";
   final String url = "http://www.lunatech-research.com/";
   render(name, organisation, url);
}


      如果在浏览器中访问http://localhost:9000,Play默认会使用index.html模板进行渲染,因为浏览器发送了包含text/html的Accept header。

      通过将请求的格式设置为xml,可以使用index.xml模板响应标识为Accept: text/xml的请求:

<?xml version="1.0"?>
<contact>
<name>${name}</name>
<organisation>${organisation}</organisation>
<url>${url}</url>
</contact>


      下表针对index()控制器方法给出了Play内置的Accept header请求格式映射:Accept header包含了Play能够映射成的所有格式(最后转化为相应的模板文件),如表3.1:

(表3.1 Play内置的Accept header请求格式映射)
Accept headerFormatTemplate file namemapping
nullnullindex.htmlnull格式请求提供默认模版扩展
image/pngnullindex.htmlmedia类型没有映射为指定格式
*/*, image/pnghtmlindex.html默认将media类型映射为html格式
text/htmlhtmlindex.html内置映射
application/xhtmlhtmlindex.html内置映射
text/xmlxmlindex.xml内置映射
application/xmlxmlindex.xml内置映射
text/plaintxtindex.txt内置映射
text/javascriptjsonindex.json内置映射
application/json, */*jsonindex.json内置映射, 忽略默认media类型


3.2 自定义格式#

      在Play中可以通过检查HTTP请求头,为应用选择相应的media类型来实现自定义格式。比如使用@Before标签拦截该控制器下的所有Action,检查请求的media类型是否为text/x-vcard:

@Before
static void setFormat() {
    if (request.headers.get("accept").value().equals("text/x-vcard")) {
        request.format = "vcf";
    }
}


      如果检查后发现请求头中media类型为text/x-vcard时,将调用index.vcf模板渲染:

BEGIN:VCARD
VERSION:3.0
N:${name}
FN:${name}
ORG:${organisation}
URL:${url}
END:VCARD


4 关于REST



  REST全称为Representational State Transfer,即表述性状态传输。它是一种为分布式超媒体系统(比如万维网)而设计的软件架构方式。REST定义了一些关键的规则:
应用的所有功能都被划分为资源。
每个资源都使用URI来唯一访问。
所有资源共享统一的接口用于客户端与资源之间进行状态传输。

      如果应用使用的是HTTP协议,那么这些接口是通过一系列可用的HTTP方法来定义的。HTTP协议往往通过以下方法来使用资源的状态:
客户端-服务器模式。
无状态模式。
缓存模式。
分层模式。

      如果应用遵循了REST设计规则,那么该应用就可以被称为RESTful了。Play框架可以很容易地构建RESTful应用:
Play的路由器通过解析URI和HTTP方法,将请求路由至Action方法。基于正则表达形式的URI为开发提供了更好的灵活性。
协议是无状态的,这意味着在两次成功的请求之间不会把任何状态保存在服务器中。
Play将HTTP作为关键的特性,因此框架提供了对HTTP信息的完全访问。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: