2014-05-07 21 views
0

我一直在組件上工作,目前我正在嘗試根據爲組件選擇的選擇器做不同的事情。如何通過RequestPathInfo正確檢查選擇器和擴展

所以基本上,如果我有這樣的結構

myComponent/ 
    dialog.xml 
    myComponent.jsp 
    altView.jsp 

我知道,如果我有resourceType爲myComponent的節點,我可以通過請求通過瀏覽器請求ALT視圖組件「路徑/到/組件/內容.altView.html「,而且一切都很豪華。

同樣地,我可以做一個CQ包括和做類似:

# with cq include 
<cq:include path="my/path.altView" resourceType="myComponent"/> 

# or with sling include 
<sling:include path="my/path" resourceType="myComponent" replaceSelectors="altView"/> 

然而,當我在處理請求,我看RequestPathInfo對象時看到了一些有趣的現象。

例如,如果我們看一下上面的情況下,所有3我可能有這樣的事情:

# http://path/to/component/content.altView.html 
slingRequest.getRequestPathInfo().getSelectors(); // {altView} 
slingRequest.getRequestPathInfo().getExtension(); // html 

# <sling:include path="my/path" resourceType="myComponent" replaceSelectors="altView"/> 
slingRequest.getRequestPathInfo().getSelectors(); // {altView} 
slingRequest.getRequestPathInfo().getExtension(); // html 

# <cq:include path="my/path.altView" resourceType="myComponent"/> 
slingRequest.getRequestPathInfo().getSelectors(); // [] 
slingRequest.getRequestPathInfo().getExtension(); // altView 

我明白爲什麼CQ:包括返回不同的結果(我們正在做的請求,我/path.altView和.altView在這種情況下巧合地用作擴展)。我很好奇,如果有一個標準化爲什麼拉「altView」(或選定的視圖),無論它是否被用作擴展或選擇器。或者,如果這是正常的,我只需要單獨檢查擴展和選擇器。

selectors = get selectors(); 
if selectors 
    do stuff 
else check extensions 
    do stuff 

再次非常感謝您的見解,這個社會是真棒。

[編輯]

針對一個答案,我想我給多一點背景下我在做什麼。基本上,我們的組件結構已經建立,以便我們的每個組件都有一個處理業務邏輯的相關Java類。 (IE應用程序/ myapp/components/myComponent將映射到com.mypackage.components.MyComponent)也就是說,在我的組件的類中,我需要根據組件的調用方式來處理控制流(即選擇器/擴展名/等等)。例如,如果我的組件被正常調用,我會執行基本行爲,但如果它被選擇器調用(例如)「altView」,我需要以不同的方式處理替代視圖,並且在這個替代視圖中,不同的數據將會可等

我的問題是沿基礎,它似乎我可以給「路徑」一個屬性「CQ:包括」標記我想使用的選擇:

<cq:include path="my/path.altView" resourceType="myComponent"/> 

然而,當我檢查我的組件類中的我的RequestPathInfo來決定工作流時,「altView」作爲擴展返回,而不是在String []選擇器中。注意,上面的代碼編譯得很好,它選擇了用於渲染的正確的.jsp文件,RequestPathInfo對象只是將數據存儲在不同的地方。

我開始猜測,將選擇器放入路徑屬性的工作原理是因爲選擇器和擴展修改器改變行爲的方式相似。 mycomponent.altView.html解析爲altView.jsp,而如果我要執行mycomponent.altView,它也會嘗試解析mycomponent/altView.jsp,就像它對mycomponent.xml執行mycomponent/XML一樣。jsp

回答

2

看起來你似乎正在解決Sling的問題。在給定組件(比如我的/新/組件)中執行「基於選擇器的不同事情」的最簡單方法是創建不同的渲染器。

例如,假設我要求/content/app/page.html,並且該頁面上是組件my/new/component。或者,如果我請求/content/app/page.selector.html,我希望我的/新/組件的體驗略有不同。

在cq:組件中,我將創建兩個JSP:component.jsp和component.selector.jsp。 Sling will automatically know,基於請求中的選擇器,使用哪個呈現器。顯然,每個渲染器都可以產生不同的體驗。

擴展也是如此。在這個例子中,component.jsp和component.selector.jsp實際上等同於component.HTML.jsp和component.selector.HTML.jsp。 HTML只是暗示。然而,你可以做component.XML.jsp和component.selector.XML.jsp,並且Sling會再次選擇最相關的選擇器,這取決於請求的選擇器和擴展。

現在,如果你不希望選擇在頁面請求的URL顯示(在我看來,你不應該)是什麼?

可以使用吊索包括您的組件:包括添加選擇器,就像你所做的一樣。

需要說明的是,吊帶:包括工作方式稍有不同,CQ:包括,所以只有當你需要使用這個。相反,您也可以使用Sling映射來隱藏用戶的選擇器。大多數時候我會推薦這種方法。

我不確定你想將選擇器添加到「路徑」屬性中。我不認爲這會做任何事情。 「路徑」是定義資源名稱(如果資源不是synthetic,則爲節點名稱)。在那裏包含選擇器將不會做任何事情,除了使資源名稱包含句點和選擇器。

+0

感謝您的支持。但是,我認爲我的問題是關於一些有點不同的問題。鏈接到綜合資源的巨大榮譽,我有幾個可以派上用場的例子。我實際上對「合成」或「模擬」資源的概念以及如何利用這一概念感到好奇。 – Brodie

+0

現在我很好奇。我誤解了你的問題? – ryanlunka

+0

我很好奇爲什麼使用myRes/altView.jsp進行渲染,即使在檢查RequestPathInfo對象時,cq:include也將altView作爲擴展名,但sling:include將其包含在選擇器列表中。我很好奇cq:include是否做了一些特別的事情。不過,我認爲我正在失去一個事實,即選擇器和擴展在使用它們來定位某個jsp進行渲染時是有效的。 (對不起,這很適合評論) – Brodie

2

我的問題是沿着看來,我可以給的 「路徑」屬性的基礎「CQ:包括」標記我想使用的選擇:

<cq:include path="my/path.altView" resourceType="myComponent"/> However, when I check my RequestPathInfo in my component class to 

決定工作流程, 「altView」作爲擴展名返回,不在 String []選擇器中。

作爲反對cq:include標籤,可以替代地使用sling:include標籤,它提供的屬性來修改選擇所述請求&後綴:

<sling:include resourceType="myComponent" path="my/path" addSelectors="altView"/>

<sling:include resourceType="myComponent" path="my/path" replaceSelectors="altView"/> 

如果您已經對請求中的選擇器不想應用到myComponent上。


在吊帶之間的差異方面包括& CQ包括,人們似乎很少,除了後者還支持腳本包含。從文檔:

您是否應該使用<cq:include><sling:include>

  • 在開發AEM組件時,Adobe建議您使用 <cq:include>
  • <cq:include>允許您在使用腳本屬性時按名稱直接包含腳本文件 。這需要考慮組件 和資源類型繼承,並且通常比使用選擇器和 擴展對Sling的腳本解析嚴格遵守 簡單。