【记录十七】Sling JCR Resources
什么是資源
資源是Sling的核心部分之一。從JCR的《一切都是內容》擴展到現在,Sling認為一切都是資源。因此,Sling維護著一個虛擬的資源樹,它是JCR存儲庫中實際內容與所謂資源提供者提供的資源的合并。通過這樣做,Sling非常適合REST體系結構的范式。
資源屬性
Path 路徑
資源是資源樹的一部分。這樣,每個資源都有一條路徑,該路徑是通過將所有資源的名稱沿根目錄連接到以斜杠分隔的資源而形成的。好的,實際上,這很像URL路徑或文件系統路徑,其中斜杠(/)是分隔符。
Name 名稱
資源的名稱是路徑中的最后一個元素(或段)。
Resource Type 資源類型
每個資源都有一個資源類型,Servlet和腳本解析器使用它來查找適當的Servlet或腳本來處理對資源的請求。
Resource Super Type 資源超類型
資源的(可選的顯式)超級類型。有關更多詳細信息,請參見下面的資源類型部分。
Adapters 轉接器
資源是始終存在的Adaptable,因此可以適應不同的視圖。有關更多詳細信息,請參見下面的資源適配器部分。
Metadata 元數據
通常,資源支持ResourceMetadata提供對值的訪問,例如二進制資源的長度(可以流式傳輸)或資源的內容類型。資源類型
設置資源的資源類型的確切方法取決于實際的資源提供者。對于Sling提供的四個主要資源提供程序實現,分配如下:
提供者(JCR、File System、Bundle、Servlet)
JCR
資源類型 : sling:resourceType屬性值或主節點類型(如果未設置屬性)(名稱空間分隔符冒號用斜杠替換,例如nt:file主節點類型映射到nt/file資源類型)
資源超類型: sling:resourceSuperType時訪問的資源節點或資源超類型的資源的指向的資源類型(ResourceResolver.getResource(String)
File System
資源類型 : 基于文件的資源是類型nt/file; 基于文件夾的資源的類型nt/folder與相應的JCR主節點類型相對應
資源超類型: 沒有
Bundle
資源類型 : 基于文件的資源是類型nt/file; 基于文件夾的資源的類型nt/folder與相應的JCR主節點類型相對應
資源超類型: 沒有
Servlet
資源類型 : 帶后綴的資源的絕對路徑 .servlet
資源超類型: sling/bundle/resource
Adapters 轉接器
資源可以適應的對象類型主要取決于提供資源的資源提供者。例如,所有基于JCR節點的資源始終適應javax.jcr.Node對象。
如果實際的Resource對象類實現是從該類擴展的SlingAdaptable,則在嘗試適應Resource時,還將考慮所有AdapterFactory服務適應Resource對象。通常,建議資源提供者擴展其資源實現,AbstractResource以保證資源實現從SlingAdaptable適配器工廠擴展,從而支持適配器工廠。
如何獲得資源
要獲得資源,您需要一個ResourceResolver。該接口定義了四種訪問資源的方法:
絕對路徑映射資源解析:調用resolve(HttpServletRequest, String)和resolve(String)方法以應用一些特定于實現的路徑匹配算法來查找資源。這些方法主要用于將外部路徑(例如請求URL的路徑組成部分)映射到資源。為了支持創建可在URL中使用的外部路徑,map(String)定義了第三個方法,該方法允許往返。
絕對或相對路徑解析(包括搜索路徑):getResource(String path)和getResource(Resource base, String path)方法可用于直接使用絕對路徑訪問資源。如果找不到,則假定該路徑是相對路徑,getSearchPath()并且從中檢索的搜索路徑用于檢索資源。這種機制類似于使用PATH您喜歡的操作系統中的環境變量解析程序。
資源枚舉:為了枚舉資源并因此迭代資源樹,listChildren(Resource)可以使用該方法。此方法返回Iterator列出所有資源的列表,這些資源的路徑前綴是給定Resource的路徑。當然,此方法還將跨越已注冊ResourceProvider實例的邊界,以實現對整個資源樹的迭代。
資源查詢:目前僅通過findResources(String query, String language)和queryResources(String query, String language)方法支持JCR資源查詢資源。
如何獲得ResourceResolver
通常,您可以ResourceResolver通過OSGi服務獲得ResourceResolverFactory。該接口提供了創建ResourceResolver的不同方法:
ResourceResolverFactory.getResourceResolver(java.util.Map authenticationInfo)。您必須提供一些身份驗證信息詳細信息才能起作用。這些都高度依賴于實施ResourceProvider。有關更多詳細信息,請參見以下各節。
ResourceResolverFactory.getServiceResourceResolver(java.util.Map authenticationInfo)。可以選擇通過身份驗證信息密鑰進一步進行參數化sling.service.subservice。有關更多詳細信息,請參閱ServiceAuthentication。
ResourceResolverFactory.getThreadResourceResolver()。使用綁定到當前線程的資源解析器。
已棄用ResourceResolverFactory.getAdministrativeResourceResolver(…)。而是使用方法2。
至關重要的ResourceResolver是,ResourceResolver.close()一旦不再使用通過這些方法之一檢索的每個數據,就必須關閉它們。
絕對路徑映射
正如人們所說的,絕對路徑映射方法 resolve(HttpServletRequest, String) 和 ==resolve(String)==應用一些實施的具體路徑匹配算法找到資源。兩種方法之間的區別在于,前一種HttpServletRequest在解析資源時可能考慮到更多屬性,而后一種則有絕對的工作路徑。
這兩種方法的一般算法如下:
調用HttpServletRequest.getScheme(), .getServerName(), getServerPort以獲取請求URL中的絕對路徑:[scheme] / [host]。[port] [path](resolve(HttpServletRequest, String)僅該方法)
檢查是否有任何虛擬路徑與絕對路徑匹配。如果存在這樣的匹配項,則使用該匹配項進入下一步。
應用映射列表以創建映射路徑。假定解析為資源的第一個映射路徑成功,并且返回找到的資源。
如果沒有映射創建尋址現有資源的映射路徑,則該方法將失敗并返回NonExistingResource(對于
resolve(String)和resolve(HttpServletRequest,String))或null(對于getResource(String path)和getResource(Resource base, String path)方法)。
虛擬路徑映射可用于為否則較長且復雜的URL創建快捷方式URL。此類URL的示例可能是CMS系統的主管理頁面。因此,管理員可以訪問Web應用程序的根目錄并定向到主管理頁面。
路徑映射功能可用于從請求URL空間隱藏內部資源組織。例如,為了更好地控制存儲庫的結構,您可能決定將所有可訪問的數據存儲在/content子樹中。為了向用戶隱藏這一事實,可以定義一個映射以將所有傳入路徑作為前綴,/content以獲取實際資源。
在map(String)應用于以相反的順序的路徑映射算法。即,首先將路徑映射顛倒,然后檢查所有虛擬映射。因此,/content/sample可能會映射路徑/sample以反轉/content前綴。或者主管理頁面(例如/system/admin/main.html)可以映射到虛擬URL /。
相對路徑
有時需要解析到資源的相對路徑。這種用例的一個示例是Script和Servlet解析,該解析以包含Resource類型,可選選擇器和請求擴展或方法名稱的相對路徑開頭。通過掃描這些相對路徑的搜索路徑,系統提供的資源可能會被某些用戶定義的實現所覆蓋。
例如,考慮系統將提供一個Servlet來呈現type的資源nt:file。該Servlet將在path下注冊/libs/nt/file/html。對于某些Web應用程序,此默認HTML呈現可能不合適,因此將創建腳本/apps/nt/file/html.jsp和自定義HTML呈現。通過將搜索路徑定義為[/apps,/libs]Servlet解析器,將ResourceResolver.getResource(String)使用相對路徑調用該方法,nt/file/html并為其提供第一個匹配資源- /apps/nt/file/html.jsp在此示例中。
查詢資源
為了方便起見,ResourceResolver提供了兩種資源查詢方法,findResources并且queryResources這兩種方法都將JCR查詢字符串和查詢語言名稱作為參數。這些參數與QueryManager.createQuery(String statement, String language)JCR API方法的參數定義匹配。
這兩種方法的返回值在用例中有所不同:
findResources返回Iteratory與查詢匹配的所有資源中的一個。這種方法相當于調用getNodes()在QueryResult從執行JCR查詢返回。
queryResources返回Iterator<Map<String, Object>>。在迭代的每一項都是一個Map<String, Object表示JCR結果Row在RowIterator從執行JCR查詢返回。映射由列名稱索引,每個條目的值是作為Java Object的命名列的值。
這些方法是方便的方法,可以更輕松地僅使用標準Java功能將查詢發布到存儲庫并以非常直接的方式處理結果。
請注意,當前僅基于存儲庫的資源支持資源查詢。這些查詢方法未反映在ResourceProvider用于將非資源庫資源注入到資源樹中的接口中。
提供資源
資源訪問器方法resolve并getResource提供訪問權的虛擬資源樹是由一組注冊ResourceProvider實例實現的。主要的資源提供者當然是基于存儲庫的JcrResourceProvider,它支持基于節點和屬性的資源。此資源提供程序始終在Sling中可用。其他資源提供者可能存在或可能不存在。
每個資源提供者都使用必需的服務注冊屬性注冊為OSGi服務provider.roots。這是一個多值String屬性,列出了絕對路徑,資源樹條目充當提供的子樹的根。例如,如果使用服務注冊屬性provider.roots設置為/ some / root來注冊/some/root資源提供程序,則首先在給定的資源提供程序中查找所有以開頭的路徑。
在已注冊的資源提供者中查找資源時,會ResourceResolver應用最長前綴匹配算法以找到最佳匹配。例如,考慮以下三個注冊的資源提供程序:
JCR資源提供者為 /
資源提供者R1為 /some
資源提供者R2為 /some/path
當使用路徑訪問資源時,首先會詢問/some/path/resource資源提供者R2。如果不能提供資源,則詢問資源提供者R1,最后詢問JCR資源提供者。將使用具有帶有所請求路徑的資源的第一資源提供者。
基于JCR的資源
基于JCR的資源帶有default JcrResourceProvider。該資源提供者始終可用,并且總是被最后詢問。也就是說,其他資源提供者提供的資源可能永遠不會被基于存儲庫的資源所取代。
這些是的支持的authenticationInfo key(可與一起使用ResourceResolverFactory.getResourceResolver(java.util.Map authenticationInfo))JcrResourceProvider:
官方doc : https://sling.apache.org/documentation/tutorials-how-tos/46-line-blog.html
總結
以上是生活随笔為你收集整理的【记录十七】Sling JCR Resources的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 网易互娱AI Lab视频动捕技术iCap
- 下一篇: FPGA中利用ICAP原语实现Multi