Я работаю над компонентом, и в настоящее время я пытаюсь делать разные вещи в зависимости от селектора, выбранного для компонента.
Итак, в основном, если у меня есть компонент с этой структурой
myComponent/
dialog.xml
myComponent.jsp
altView.jsp
Я знаю, что если у меня есть Node с resourceType myComponent, я могу запросить альтернативное представление через браузер, запросив path/to/component/content.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:include возвращает разные результаты (мы делаем запрос к my/path.altView, и .altView в данном случае совпадает с расширением). Мне любопытно, есть ли нормализованная причина для извлечения altView (или выбранного представления) независимо от того, использовалось ли оно в качестве расширения или селектора. Или, если это нормально, и мне просто нужно проверить как расширения, так и селекторы по отдельности.
i.e
selectors = get selectors();
if selectors
do stuff
else check extensions
do stuff
Еще раз большое спасибо за ваши идеи, это потрясающее сообщество.
[РЕДАКТИРОВАТЬ]
В ответ на ответ я подумал, что дам немного больше контекста тому, что я делаю. В основном наша структура компонентов настроена так, что каждый из наших компонентов имеет связанный класс Java, который обрабатывает бизнес-логику. (IE apps/myapp/components/myComponent будет отображаться в com.mypackage.components.MyComponent). Тем не менее, в классе моего компонента мне нужно по-разному обрабатывать поток управления в зависимости от того, как был вызван компонент (т.е. какие селекторы/расширения/и т. д. ). Например, если бы мой компонент вызывался нормально, я бы выполнял базовое поведение, но если бы он вызывался с селектором (например) altView, мне нужно было бы по-другому обрабатывать альтернативное представление, и в этом альтернативном представлении будут доступны другие данные, и т.п.
Мой вопрос был основан на том, что кажется, что я могу дать атрибуту пути тега cq:include селектор, который я хочу использовать:
<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