play框架手冊-02HTTP路由_第1頁
play框架手冊-02HTTP路由_第2頁
play框架手冊-02HTTP路由_第3頁
play框架手冊-02HTTP路由_第4頁
play框架手冊-02HTTP路由_第5頁
已閱讀5頁,還剩8頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

1、router組件負責將http請求交給對應的Action處理(一個static/public的控制器方法)。一個http請求在mvc框架里被當作一個mvc事件看待。這個事件包含了兩個主要信息: 包含在查詢字符串里的請求路徑 (比如/clients/1542, /photos/list。 HTTP方法(GET, POST, PUT, DELETE關于RESTRepresentational state transfer (表述性狀態(tài)轉(zhuǎn)移REST是一種應用于分布式超媒體系統(tǒng)(如www)的軟件架構設計風格(注意:不是標準)。REST規(guī)定了幾個關鍵的設計原則: 應用程序功能都被當作資源看待 每個資源都

2、有唯一的可尋址URI地址 所有的資源共享同一個接口來傳送客戶端和資源間的狀態(tài) 其表現(xiàn)形式為每個超鏈接都不帶有參數(shù)如果你正在使用http,那么這些接口都是通過一系列可用的http方法進行定義。協(xié)議用于訪問屬于下列狀態(tài)的資源: 客戶端服務器Client-server 無狀態(tài)的Stateless 可緩存的Cacheable 可分層的Layered如果某個應用程序遵循主要的REST設計原則,那么這個應用程序就是RESTful的。play框架很容易創(chuàng)建RESTful風格的應用程序: Play router把所有的URI和HTTP方法都進行解析,并把請求路由一一對應到相應的java調(diào)用?;谡齽t表達式的U

3、RL范示使這個操作過程更靈活。 協(xié)議是stateless的,也就是說你不能在服務器上為兩個連接的請求存儲任何狀態(tài)。 Play把http當作關鍵特性進行考慮,因此play框架提供了讓你完全訪問http信息的能力。routes文件語法Router使用conf/routes文件作為配置文件。此文件列出了所有應用程序所需要的路由。每個路由都由一個HTTP方法+ URI 范示來表示一個Java調(diào)用。示例:GET /clients/id Clients.show 每個route開始于一個http方法,接著是一個URL范示,最后一個元素是java調(diào)用定義。你可以使用#為路由添加一個注釋# Display a

4、 clientGET /clients/id Clients.show HTTP方法HTTP方法可以是以下幾個http協(xié)議支持的任何方法: GET POST PUT DELETE HEAD這些方法也支持WS(web service)作為action方法來指明一個WebSocket 請求:如果使用*作為http方法,則route將匹配所有的http方法請求,如:* /clients/id Clients.show 路由將接受下面兩個請求:GET /clients/1541PUT /clients/1212URI范示 PatternURI范示定義了路由的請求路徑。請求路徑的某些部分可以是動態(tài)的。任

5、何動態(tài)的部分都必須使用大括號進行界定,如:/clients/all將精確匹配:/clients/all但/clients/id可以匹配下面的請求:/clients/12121/clients/toto一個URI范示可以有多個動態(tài)部分:/clients/id/accounts/accountId對于動態(tài)部分的默認匹配策略使用的是正則表達式 /+/,因此,我們可以為動態(tài)部分定義自己的正則表達式。下面的正則表達式只能匹配數(shù)字值作為id:/clients/<0-9+>id下面的表達式只允許4至10個小寫字母作為id:/clients/<a-z4,10>id在這里,可以使用任何可

6、用的正則表達式。注意! 凡是被命名了的動態(tài)部分,控制器隨后可以從http參數(shù)map里得到動態(tài)部分的值。默認情況下,play會把URL后的反斜線/當作不同的值,比如:此路由只會匹配/clients URL路徑,不會匹配/clients/。如果你打算匹配這兩個URL路徑,那么你需要在路徑后增加一個/?作為結(jié)束標志,比如:注意:在這里,除了反斜線外,URI范示不能含有任何可選部分。Java調(diào)用定義route定義的最后一部分就是java調(diào)用,通過使用action方法的完整名稱來進行定義。action方法必須是控制類的public static void方法,而且這個控制器類必須定義于controlle

7、rs包里,且是的子類。如果控制器類不在controllers包下,則需要在控制器類名稱前添加java包名稱。默認的controllers包可以直接使用,因此在此包下的控制器不需要單獨指定包名。GET /admin admin.Dashboard.index 把404當作action來用你可以直接使用400作為路由action,用于標記那些應用程序必須忽略的URL路徑,如忽略網(wǎng)站ico請求:# Ignore favicon requestsGET /favicon.ico 404指派靜態(tài)參數(shù)在某種情況下,你可能會重復使用一個存在的基于某些參數(shù)值的路由,如下:public static void

8、page(String id Page page = Page.findById(id;render(page;相應的route:現(xiàn)在,我打算為一個id為hame的頁面定義一個URL別名,我可以定義一個具有靜態(tài)參數(shù)的其他路由:GET /home Application.page(id:'home'當頁面的id值為home時,第一個路由與第二路由造價。但是,既然第一個具有更高優(yōu)先級,那么這個路由將用作Application.page方法處理id為home時的默認路由。變量和腳本在路由里,也可使用$ 語法來在路由中使用變量,使用%語法來在路由中使用腳本,和你在模板中使用變量和腳本的

9、情況是一樣的,比如:% context = play.configuration.getProperty('context', '' %# Home page另外一個例子就是在CRUD模塊里的路由文件使用crud.types標簽來循環(huán)調(diào)用所有的model types,以為每種類型生成控制器路由定義。路由優(yōu)先級許多路由定義可能會匹配同一個請求,如果產(chǎn)生了沖突,那么只采用第一個路由(遵照下面的聲明順序)。比如:照此定義,則下面的URL:/clients/all將調(diào)用第一個路由指定的Clients.listAll方法(那怕第二個路由也同樣匹配這個URL。服務器靜態(tài)資源

10、staticDir: mapping使用特定的action staticDir,可以用來定位每個你打算當作靜態(tài)資源容器進行發(fā)布的文件夾。比如:GET /public/ staticDir:public當提供的請求含有/public/* 路徑時,Play將把應用程序/public目錄下的文件發(fā)布出去。其優(yōu)先權和標準的路由優(yōu)先權相同。staticFile: mapping也可直接映射一個URL路徑到一個靜態(tài)文件。# Serve index.html static file for home requestsURL 編碼由于不可能對URL解碼或重新編碼 (比如你并能確定URL里的斜線是否就是真正的斜

11、線或%2F, URL應該明確進行編碼。play默認使用UTF-8進行編碼,但你也可以使用ISO-8859-1, UTF-16BE, UTF-16LE, UTF-16當成默認的WebEncoding配置參數(shù)。詳見。比如:映射/stéphane時可以使用如下方法:反轉(zhuǎn)路由:用于生成某些URLRouter可以用于在一個java調(diào)用里生成一個URL。因此,你就可以把所有的URI范示集中到一個配置文件里,這樣,在重構應用程序時,你就更有把握了。比如,下面的路由定義:在代碼里,同樣可以生成URL,以便調(diào)用Clients.show:map.put("id", 1541;Stri

12、ng url = Router.reverse("Clients.show", map.url;/結(jié)果為 GET /clients/1541URL生成器已經(jīng)被集成到許多框架的組件里,你根本就不需要使用Router.reverse進行操作。比如,如果你添加的參數(shù)并沒有包含到URI范示里,那么這些參數(shù)將加到查詢字符串里:map.put("id", 1541;map.put("display", "full"/結(jié)果為:GET /clients/1541?display=fullString url = Router.re

13、verse("Clients.show", map.url;優(yōu)先權順序再次用于查找最特別的路由,以生成URL。設置內(nèi)容風格(CSSPlay選擇依照request.format的值來為http response選擇合適的media type。 這個值通過文件擴展名確定哪個視圖模板將會被使用,同時設置response的Content-type的值為Play的perties文件映射格式確定的媒體類型。 play請求的默認格式為html。因此,index(控制器方法的默認模板就是index.html文件。如果指定了一個不同的格式,就需要選擇對應格式的模板

14、。你可以在調(diào)用render方法前以編程的方式設定格式。比如,為了使用媒體類型為text/css的CSS,你可這樣處理:request.format = "css" 然而,更清晰的方法就是在rourtes文件里使用URL來指定格式。你可以通過為控制器方法指定格式來特定的路由添加格式,比如:下面的路由將處理來自/index.xml的請求,Application.index(方法將設置格式為xml,并使用index.xml模板進行渲染。GET /index.xml Application.index(format:'xml' 類似的還有:GET /styleshe

15、ets/dynamic_css css.SiteCSS(format:'css'在下面的路由里,Play也可直接從URL里提取格式: GET /index.format Application.index 在這個路由里,/index.xml請求將設置格式為xml,同時使用XML模板進行渲染; /index.txt請求將使用原始的text模板進行渲染。 Play也可使用http內(nèi)容協(xié)商自動設置格式。HTTP 內(nèi)容協(xié)商 negotiationplay和其他RESTful架構一樣,直接使用http提供的功能,而不是試著隱藏http或是在其之上放置一個抽象層。http的內(nèi)容協(xié)商(Con

16、tent negotiation)特性允許http服務器依照http客戶端請求的媒體類型為同一個URL提供不同的媒體類型media types??蛻舳颂囟ǖ目山邮艿膬?nèi)容類型是通過Accept header確定的,比如需要一個xml response就定義為:Accept: application/xml客戶端可以指定多個媒體類型,并且可以指定(*/*)來表示可接受任意媒體類型: Accept: application/xml, image/png, */*傳統(tǒng)的Web瀏覽器總是在其Accept header里包含了通配符:這樣,他們就可以接收任意媒體類型,當然包括play提供的默認html類型

17、。內(nèi)容協(xié)商更多是用于定制的客戶端,比如一個要求返回JSON的Ajax請求,或一個e-book閱讀器需要的PDF或EPUB版本的文檔。從http headers開始設置內(nèi)容類型 如果Accept header包含了text/html或application/xhtml以及作為*/*通配符的結(jié)果時, Play選擇其默認格式html。如果通配符值為空時,默認格式將不被選擇。Play對html, txt, json和 xml媒體格式提供了內(nèi)建支持。比如,下面定義了一個用于渲染某些數(shù)據(jù)的控制器方法: public static void index( final String name = "

18、Peter Hilton" final String organisation = "Lunatech Research" final String url = "http:/www.lunatech- render(name, organisation, url; 在一個瀏覽器里,如果請求的URL映射到這個方法時,那么play將渲染模板,因為瀏覽器發(fā)送的Accept header里包含了text/html值。通過設置請求格式為xml,Play響應的結(jié)果Accept header類型為:text/xml,同時使用模塊進行渲染,比如: $name $org

19、anisation $url Accept header內(nèi)建的格式對應的格式以及對應的模板文件見下表(以index(控制器方法為例):Accept header Format Template file name Mapping null null index.html Default template extension for null format image/png null index.html 媒體類型沒有映射到格式 */*, image/png html index.html 默認媒體類型映射到html格式 text/html html index.html Built-in format application/xhtml html index.html Built-in format text/xml xml index.xml Built-in format application/xml xml index.xml Built-in format text/plain txt

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論