1. 程式人生 > >play框架04--

play框架04--

1、路由


Play框架中的路由器是負責將傳入的HTTP請求對映為Action呼叫(即控制器中被宣告為public static void的方法)的元件。HTTP請求被MVC框架視為事件,其主要包括以下兩塊內容:

  • 請求路徑(比如/clients/1542,/photos/list),其中可以包含查詢字串。
  • HTTP方法(GET,POST,PUT,DELETE)。

Play路由器使用的配置檔案為conf/routes,該檔案列出了應用需要的所有路由規則。每條路由由HTTP方法和與Java呼叫相關聯的URI組成。以下是路由配置的例子:

GET    
/clients/{id}             Clients.show
      路由配置總是從HTTP方法開始,URI作為中間部分,最後的元素是Java呼叫。在路由檔案中可以使用#進行註釋:
# Display a client
GET    
/clients/{id}             Clients.show    


1.1 HTTP方法
#

      HTTP協議支援以下所列的方法,用於指定客戶請求伺服器的動作,其中GET和POST是最為常用的兩種方法:

  • GET
  • POST
  • PUT
  • DELETE
  • HEAD


 Play同時也支援以WebSocket的方式來呼叫伺服器端的Action方法

 如果在路由檔案中指定*作為HTTP方法,那麼這個路由會匹配任何HTTP請求:

*   /clients/{id}             
Clients.show    

      使用上述的路由配置,以下兩個HTTP請求都會被框架接受:

GET /clients/1541
PUT
/clients/1212

1.2 URI表示式#

      URI表示式定義了路由規則需要的請求路徑,請求路徑中允許存在動態內容,但必須被宣告在{}中。


/clients/all
      以上的路由配置只能精確匹配到:
/clients/all


      但是如果以包含動態部分配置路由規則:

/clients/{id}
      則可以分別匹配:
/clients/12121
      和
/clients/toto


      如果某條路由配置的URI中需要包含多個動態部分,可以採用下例方法進行配置:

/clients/{id}/accounts/{accountId}

      預設情況下,動態部分的匹配策略採用的是正則表示式/[^/]+/。也可以為動態部分定義自己的正則表示式,以下是使用正則表示式的例子。

      路由規則只允許接受id為數字的值:

/clients/{<[0-9]+>id}

      路由規則確保id是長度為4到10字元的小寫單詞:

/clients/{<[a-z]{4,10}>id}

      正則表示式的使用非常靈活,還可以定義更多的路由規則,本節就不做贅述了。

注意:

動態部分指定後,控制器可以在HTTP引數map中獲取該值。


      預設情況下,Play將URI尾部的斜線(“/”)作為重要的組成部分,因為有無“/”將會出現不同的結果。比如:

GET     /clients         Clients.index

      該路由規則會匹配/clients,而不是/clinets/(注意這裡的區別),但可以通過在斜線後面增加問號來同時匹配兩個URI:

GET     /clients/?       Clients.index
注意:

URI除了尾斜線不允許有其他可選的部分。


1.3 定義Java呼叫#

      路由定義的最後部分為需要呼叫的Java方法:控制器中必須定義指定的Action方法,否則會提示找不到控制器方法的錯誤資訊;必須宣告為public static void方法;控制器需作為play.mvc.Controller的子類定義在controllers包中。

      如果控制器沒有在controllers包中定義,在配置路由規則時可以在其名稱之前增加Java包(比如admin.Dashboard.index)的說明。由於controllers包本身被Play預設包含,所以使用者在配置路由時不需要顯式地指定。

GET    /admin             admin.Dashboard.index   

1.4 404作為Action#

      可以直接使用404作為路由配置中的Action部分。如果這樣進行配置,對應的URL路徑就會被Play應用所忽略。比如:

# 忽略favicon請求
GET    
/favicon.ico            404


1.5 指定靜態引數#

      在某些情況下,可能會需要基於不同的引數值定義特殊路由。以下是預先定義好的Action:

public static void page(String id) {
   
Page page = Page.findById(id);
    render
(page);
}

      針對該Action,常規的路由配置為:

GET            /pages/{id}                    Application.page

      現在給引數id=home的頁面指定一條特殊的URL,需要通過設定靜態引數來實現:

GET            /home                          Application.page(id:'home')
GET            
/pages/{id}                    Application.page

      當引數id=home時,兩條路由配置等價,但是由於前者具有較高的優先順序,所以被作為預設的URL來呼叫Application.page。



1.6 變數和指令碼#

      與模板中的使用方法類似,在routes檔案中可以使用${...}作為變量表達式,使用%{...}作為指令碼表示式,比如:

%{ context = play.configuration.getProperty('context', '') }%
 
# 主頁
GET    $
{context}         Secure.login
GET    $
{context}/        Secure.login

      在路由檔案中定義變數和指令碼的典型例子是CRUD模組的routes檔案。該檔案中使用crud.types標籤對model型別進行迭代,為每種型別生成控制器路由定義。以後文章會詳細介紹CRUD模組的使用。

#{crud.types}
GET                    
/?                                              ${type.controllerClass.name.substring(12).replace('$','')}.index
GET                    
/${type.controllerName}                         ${type.controllerClass.name.substring(12).replace('$','')}.list
GET                    
/${type.controllerName}/new                     ${type.controllerClass.name.substring(12).replace('$','')}.blank
GET                    
/${type.controllerName}/{id}                    ${type.controllerClass.name.substring(12).replace('$','')}.show
GET                    
/${type.controllerName}/{id}/{field}            ${type.controllerClass.name.substring(12).replace('$','')}.attachment
GET                    
/${type.controllerName}/{id}/edit               ${type.controllerClass.name.substring(12).replace('$','')}.edit
POST                    
/${type.controllerName}                         ${type.controllerClass.name.substring(12).replace('$','')}.create
POST                    
/${type.controllerName}/{id}                    ${type.controllerClass.name.substring(12).replace('$','')}.save
DELETE                  
/${type.controllerName}/{id}                    ${type.controllerClass.name.substring(12).replace('$','')}.delete
#{/crud.types}

Play會按照宣告的順序,優先選擇最先宣告的路由,比如:

GET             /clients/all                       Clients.listAll
GET            
/clinets/{id}                      Clients.show

      在上例的路由配置中,雖然請求/clients/all可以同時匹配這兩條路由配置,但按照宣告的優先順序會被第一條路由攔截,並呼叫相應的Clients.listAll方法。


  如果id引數需要匹配5個數字,在不使用重複規則的前提下,只能連續使用五個\d元字元,而使用重複規則後,規則的如下:

GET          /clinets/{<\d{5}>id}                    Clients.index

      以下路由規則匹配2個大寫字母以及3-4個數字:

GET          /clinets/{<[A-Z]{2}[0-9]{3,4}>id}       Clients.index

1.7 staticDir:mapping#

      Play的路由配置使用特殊的Action(staticDir)將存放靜態資源的public目錄開放。該目錄裡包含的資源可以是圖片,Javascript,Stylesheet等,這些資源將直接響應給客戶端,並不需要伺服器做進一步加工處理:

GET    /public/           staticDir:public

      當客戶端請求/public/*路徑時,Play會從應用的public資料夾中獲取相應的靜態資源。這裡的優先順序與標準路由配置一樣適用。


1.8 staticFile:mapping#

      還可以直接將URL路徑對映為靜態檔案:

            
           

相關推薦

play框架04--

1、路由 Play框架中的路由器是負責將傳入的HTTP請求對映為Action呼叫(即控制器中被宣告為public static void的方法)的元件。HTTP請求被MVC框架視為事件,其主要包括以下兩塊內容: 請求路徑(比如/clients/1542,/photos/list),其中

基於OpenGL編寫一個簡易的2D渲染框架-04 繪制圖片

著色器 drawtext 結構 渲染 images ron renderer make 制圖 閱讀文章前需要了解的知識,紋理:https://learnopengl-cn.github.io/01%20Getting%20started/06%20Textures/  

MUI框架-04-切換頁面頭部文字重疊

開發 圖片 height sdn watermark 完美解決 個人 title src MUI框架-04-切換頁面頭部文字重疊 從現在開始就只分享 MUI 框架開發時遇到的問題了 開發不懂請查看:官方文檔 問題情況 切換頁面 title 文字重疊,覆蓋 截圖:

play框架在idea開發工具上的簡單配置

    新公司使用的是play框架,並使用idea作為開發工具,作為一名一貫使用SSM+eclipse黨來說,真心的迷糊啊,初期各種配置搞得人慾仙欲死,欲罷不能,欲哭無淚!       idea這裡的基本使用就不做贅述

Vue 框架-04-計算屬性 computed

Vue 框架-04-計算屬性 計算屬性是什麼? 大家可以去看官網解釋:計算屬性和偵聽器 今天的第一個小例項: 為啥先放折磨一個例項,之前資料繫結的就已經可以實現了,看起來那麼簡單,就是為了告訴大家,當點選第一個按鈕【Add to A】的時候, Age + A = 這

階段01Java基礎day18集合框架04

18.01_集合框架(Map集合概述和特點) A:Map介面概述 檢視API可以知道: 將鍵對映到值的物件 一個對映不能包含重複的鍵 每個鍵最多隻能對映到一個值 B:Map介面和Collection介面的不同

play框架08--Job非同步處理

8.1、Job實現     在Play中建立Job只需要繼承play.jobs.Job類: package jobs; import play.jobs.*; public class MyJob extends Job {  &nbs

play框架07--域模型

7.1屬性模擬    檢視Play提供的示例應用,模型類裡面會頻繁地使用宣告為public的變數。即使是經驗尚淺的Java開發者,也懂得慎用public型別的變數。在Java開發中(當然還有其他的面嚮物件語言),實踐經驗是這樣告訴我們的:將所有的成員變數宣告為私有,只提供獲取與

play框架06--模板語法、模板繼承

   Play具有高效的模板體系,採用Groovy作為其表示式語言,允許動態生成HTML、XML、JSON或者任何基於文字格式的文件,並且具有建立可重用標籤(tag)的功能。模板儲存在Play應用的app/views目錄下。 1、模板語法  與其他的語言一樣

play框架05--控制層--action、攔截器

5.4Action鏈   Play中的Action鏈與Servlet API中的forward不盡相同。Play的每次HTTP請求只能呼叫一個Action,如果需要呼叫其他的Action,那麼必須將瀏覽器重定向到相應的URL。在這種情況下,瀏覽器的URL始終與正在執行的Action保

play框架05--控制層--結果返回

5.3結果返回    Action方法需要對客戶端作出HTTP響應,最簡單的方法就是傳送結果物件。當物件傳送後,常規的執行流程就會中斷。以下面這段程式碼為例,最後一句System.out.println的輸出不會被執行: public static void show(

play框架05--控制層

5.1、概述   Play的控制層位於應用的controllers包中,其中的Java類即為控制器(Controller)。如圖4.1所示,Application.java和MyController.java都屬於控制層。 (圖4.1 控制器為controllers包中的Jav

play框架03--建立專案

安裝Play 從下載頁面下載最新的二進位制包,然後在你喜歡的地方解壓它。 如果你用的是Windows,最好避免在路徑中混入空格。比如c:\play就是個比c:\Documents And Settings\user\play更好的選擇。 1 為了方便操作,你需要新增Pl

play框架02--細說目錄結構

    play的目錄結構製作的相當精簡,以下是從play官網截下的圖片:        app → Application

play框架01--介紹

概論: Play框架顛覆了臃腫的企業級Java EE規範,以Restful為目標並專注於開發效率,是Java敏捷開發的最佳參考方案。開發者只要具備Java以及資料庫的相關基礎知識就可以輕鬆上手,從而讓Web應用開發變得更加容易,提高專案催化速度。     

Play框架_Java記憶體溢位之PermGen OOM深入分析

          配置:引數: -Xmx1024m -Xms1024m -XX:PermSize=512m -XX:MaxPermSize=512m -XX:-UseSplitVerifier{ 解決 JD

play框架 JOB

    Job 由於Play是Web應用框架,所以大部分的應用邏輯是由響應HTTP請求的控制器來完成的。但是有時候我們需要在HTTP請求之外執行一些應用邏輯操作,比如初始化工作,維護任務或者在不阻塞HTTP請求執行池的情況下執行一些時間花費較長的任務。這時就可以利用P

idea配置play框架

原文地址 注意:第五步最後一張圖片’D;\work\yours’不完整。 補充: 轉載正文: 1)解壓,解壓之後需要配置環境變數,如下: 2)在dos命令敲:play ,如果出現如下圖所示,即為配置成功, 3)在一個資料夾下,進入dos命令,輸入:play

play框架入門(1)

2015-06-03 周海漢 2015.6.3 概述: play框架是用scala寫的scala和java的框架,支援高併發,web和JPA。play框架得到一些網際網路新興企業的喜愛,相較spring,struts和hib

Play框架獲取資料單個欄位與獲取部分欄位集合

Play 框架不提供針對某一個欄位求和方法,那麼一般出現這種情況都會去寫原生sql去執行,非常簡單: String sql = "select sum(count) as count from book "; Long sum; Object sumFlag = JPA.em().cre