1、play编程基础
1、Action、Controller、Result
Action指的是動作,play中大多數請求可以使用action來處理,一個請求對應一個動作也就是一個java方法,然后處理請求返回一個響應,這個響應用Result來體現
Controller就是一個繼承了 play.mvc.Controller 的java類,他的返回值也是一個Result,也可以用來處理請求
Result用于返回請求的處理響應信息,它提供了一些html生成器,幫助開發者直接返回
上邊這些都可以包含響應的參數。Play還提供了一種返回方式重定向,使用redirect實現
2、請求的處理-HTTP路由
Rouing路由是一種用于將傳入到服務器的http請求轉換成操作調用的組件,例如:將請求對應到一個controller中的公共方法,mvc框架將沒有給請求看成一個事件,一個動作。每一個請求都有兩個屬性:請求方式、請求路徑,而開發者就可以在play的路由配置文件(conf下的routes文件)中配置請求的這兩個屬性
play的默認路由生成器創建一個路由器類,該類接受@inject注釋的構造函數中的控制器實例。這意味著類適用于依賴項注入,也可以使用構造函數手動實例化。
路由的配置格式說明,每個路由從HTTP方法開始,然后是URI模式,最后一個元素是調用定義。如下:?
路由的第一部分是HTTP方法,Play路由中支持的http方法有:GET, PATCH, POST, PUT, DELETE, HEAD, OPTIONS
路由的第二部分是配置的URI模式,大致可分為兩類:靜態路由和動態路由,靜態路由就是URI中沒有任何可變參數,是什么就是什么,例如:
而動態路由則表示URI中可以包含可變的參數,例如想要根據ID來獲取user信息:
又例如靜態資源的訪問,可以使用*來代替URI中的多段:
也可以在路由器中使用正則來進行模式匹配:
路由的第三部分是動作生成器,也就是對應的請求處理方法,處理方法可以帶有參數,獲取參數時會現在URI中進行查找,如果沒有對應參數,則去request中查找,兩種方式如下:
上圖中show方法接收參數page,如果page類型是字符串時,可以默認不標明參數類型,如果想要其他類型參數,則應該顯示聲明,例如:
如果接收的參數使用了泛型,例如:List,那么在配置時應該使用[]來表示泛型而不是<>
傳入的參數也可以設為定值,如下:
傳入的參數也可以設置默認值,當請求中找不到此參數時,則使用此默認值,如下:
傳入的參數可以設置為可選值,就是當參數為空時,則拋棄這個參數,如下:
上邊說的都是將請求對應到一個Controller,也可以通過為動作生成器設置參數,將參數設置成request,將他發送到一個action,如下:
路由具有優先級,當一個請求同時對應多個路由時,則會以第一個路由對應的方法為準。
路由器可以用來從Java調用中生成URL。這使得可以將所有的URI模式集中在一個配置文件中,對于路由文件中使用的每個控制器,路由器將在路由包中生成“反向控制器”,具有相同的操作方法和相同的簽名,但返回play.mvc.call而不是play.mvc.result。play.mvc.call定義一個HTTP調用,并提供HTTP方法和URI。調用使用方式如下:
有些情況下,返回相對路徑而不是絕對路徑可能很有用。play.mvc.call返回的路由總是絕對的(它們以/開頭),當對Web應用程序的請求被HTTP代理、負載均衡器和API網關重寫時,這可能會導致問題。(此處沒有理解透)
3、響應的處理
對于響應信息,play提供了ok方法來幫助完成,可以根據返回的內容來自動的生成對應內容類型的響應信息,例如:
Play會總動根據返回的內容生成對應內容的響應信息,一個是text/plain類型的,一個是application/json類型的。如果不想讓其自動生成,可以使用.as方法來設置內容的類型(Content-Type),如下:
開發者也可以自己設置響應的頭信息,如下:
開發者也可以在響應中添加和清空cookie信息,如下:
返回的文本信息,play默認使用的字符編碼是utf-8,也支持用戶自定義編碼方式,如下:
4、session和flash域
Play中的Session和flash域中的數據不存儲在服務器中,而是使用cookie的方式添加到每個后續的HTTP請求中。存儲的數據大小最大不能超過4KB,play中的Session不能用作緩存,因為它的實質相當于一個cookie,當用戶關閉瀏覽器結束此次會話時,session就過期了,達不到作為緩存的目的,如果想用緩存可以使用play內置的緩存機制,也可以使用第三方緩存,例如:redis。
Session中存儲的數據在整個用戶會話期間都可用,在一次會話中可以通過設置session過期:在application.conf中添加配置play.http.session.maxAge。Session cookie中的值使用密鑰進行了加密,因此客戶端無法修改cookie數據。
flash作用域中存儲的數據只對下一個請求可用。其用法和session相同,只不過flash cookie中的值沒有經過加密,可以被修改,所以一般使用flash域來存儲響應狀態信息。
5、請求(體)解析器
Play中將request的頭信息封裝到RequestHeader類中,將request的body信息封裝到BodyParser中。
play是一個異步框架,傳統的IO不能用于讀取請求體,當試圖讀取時,輸入流會被阻塞,對應線程必須等待數據可用。因此play使用異步流庫AKKA流。Akka Streams是反應流的一種實現,它是一種SPI,允許許多異步流API無縫地協同工作。
一般使用play默認的解析器即可滿足要求,解析器可以將application/json格式的內容封裝到一個JsonNode對象中:
其他的格式內容封裝:
使用默認的解析器緩沖請求體時,可能在內存和磁盤上都有緩沖區,為了避免惡意的大量數據緩沖,可以配置緩沖區的大小,在application.conf文件中配置兩個緩沖區的大小:
內存中緩存區限制:play.http.parser.maxMemoryBuffer = 256k
磁盤上緩存區限制:play.http.parser.maxDiskBuffer = 1024k??
上邊是使用play默認的解析器,還允許開發人員寫自己的解析器,需要實現 BodyParser 類,具體如下:
使用新建的解析器:
更復雜的操作可以訪問官網
6、動作組合
我們知道當訪問一個路徑時,最終指向的是一個action中方法,一個只能對應一個,而動作組合則可以實現在執行指定方法之前執行別的動作,play中使用 @with 注解來實現。首先需要我們先寫一個可以和別的方法組合的action,如下:
組合時直接用with注解即可,如下:
這是請求就會先到達VerboseAction中執行相應操作,然后通過call方法,請求再進入到verboseIndex方法中,有點前置動作的意思。注意:每一個請求都必須對應一個實例,否則可能出現問題。
Play允許自己聲明動作組合的注解,此注解必須@with注解進行注釋,開發者想組合的動作類需要填充到with注解中,如下:
可以直接使用注解VerboseAnnotation實現動作組合即可,可以使用動作組合(動態綁定)的方式實現權限控制或者日志的記錄??梢杂脛幼鹘M合的注釋直接修飾控制器類,將應用于該控制器類中所有操作方法。
可以將組合動作中的數據傳遞到要訪問的對應的請求中,如下:
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的1、play编程基础的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 读人人都是产品经理__1
- 下一篇: 诛仙配置电脑配置要求(诛仙配置电脑配置)