2013-10-07 3 views
1

Я работаю над компонентом, который требует определенных свойств (которые пользователь устанавливает во время выполнения) для работы в соответствии с назначением.Как получить доступ к свойствам компонента из класса Java

Первоначально, я просто использовал properties.get('foo') для извлечения необходимого свойства из моего компонента, но я пытаюсь удалить все следы кода сценария, передающего код из моего jsp-файла компонента.

Как получить это свойство «foo» (которое задано во время выполнения на моем компоненте) в моем Java-коде? Я помню, что читал где-то, что с помощью ValueMap был самым лучшим образом, поэтому я попытался использовать это: -

public static Map<String, Object> getResourceProperties(String path, 
      SlingHttpServletRequest request) { 
     ResourceResolver resourceResolver = request.getResourceResolver(); 
     Map<String, Object> props= new HashMap<String, Object>(); 
     Resource resource = resourceResolver.getResource(path); 
     if (null != resource) { 
      props.putAll(resource.adaptTo(ValueMap.class)); 
     } 
     return props; 
    } 

и это в моем JSP: - <c:set var="refProperties" value="${xyz:getResourceProperties(properties.path,slingRequest)}" />

Но это не возвращает значение, я хочу.

ответ

5

Этот простой способ для этого состоит в том, чтобы включить /libs/foundation/global.jsp и просто использовать объект properties уже в области ${properties.foo}.

Включите global.jsp в верхней части компонента JSP, как так:

<%@include file="/libs/foundation/global.jsp"%> 

в качестве комментариев в файле указывают, что в основном регистрирует слинг (слинг), CQ (CQ) и JSTL (c, fmt, fn) taglib для использования в JSP.

Затем, с помощью taglib cq:defineObjects, он приносит много полезных объектов в область видимости.

<cq:defineObjects /> 

Вот список:

@param slingRequest SlingHttpServletRequest 
@param slingResponse SlingHttpServletResponse 
@param resource the current resource 
@param currentNode the current node 
@param log default logger 
@param sling sling script helper 

@param componentContext component context of this request 
@param editContext edit context of this request 
@param properties properties of the addressed resource (aka "localstruct") 
@param pageManager page manager 
@param currentPage containing page addressed by the request (aka "actpage") 
@param resourcePage containing page of the addressed resource (aka "myPage") 
@param pageProperties properties of the containing page 
@param component current CQ5 component 
@param designer designer 
@param currentDesign design of the addressed resource (aka "actdesign") 
@param resourceDesign design of the addressed resource (aka "myDesign") 
@param currentStyle style of the addressed resource (aka "actstyle") 

Это означает, что просто с помощью CQ: defineObjects TagLib у вас уже есть доступ к свойствам ValueMap через JSP Expression Language (EL). Дополнительное преобразование не требуется для доступа к свойствам в JSP.

<c:out value="${properties.foo}" /> 

Чтобы получить доступ к свойствам в пределах вашего собственного Java TagLib или боб вы бы просто передать соответствующий объект в свой код, используя стандартные теги JSTL. Вы можете передать весь запрос, текущий ресурс или просто свойства. Передача всего запроса дает вашему Java-коду доступ к текущему ресурсу и ко всем объектам, созданным taglib cq: defineObjects, включая свойства ValueMap.

В JSP:

<jsp:useBean id="mybean" scope="request" class="com.my.impl.TheBean"> 
    <jsp:setProperty name="mybean" property="slingRequest" value="${slingRequest}"/> 
    <jsp:setProperty name="mybean" property="resource" value="${resource}"/> 
    <jsp:setProperty name="mybean" property="properties" value="${properties}"/> 
</jsp:useBean> 

В боба:

public void setSlingRequest(final SlingHttpServletRequest slingRequest) { 
    this.slingRequest = slingRequest; 
    // Use the one created by cq:defineObjects 
    this.properties = (ValueMap)this.slingRequest.getAttribute("properties"); 
    // OR adapt the resource 
    this.properties = this.slingRequest.getResource().adaptTo(ValueMap.class); 
} 

public void setResource(final Resource resource) { 
    this.resource = resource; 
    this.properties = this.resource.adaptTo(ValueMap.class); 
} 

public void setProperties(final ValueMap properties) { 
    this.properties = properties; 
} 
+1

согласился .. это самый простой способ. не знаю, почему я этого не использовал .. Что еще хуже, я действительно изучал глобальное.jsp, и именно там я узнал, как получить доступ к свойствам с помощью 'resource' – bongman1612

0

Получите сеанс JCR в вашем файле Java, затем выполните итерацию через узлы , например content/your_site_name/node/some_parsys. Затем вы можете получить значения, заданные автором во время выполнения.

if(node.hasProperty("title")){ 
    String title=node.getProperty().getValue().getString(); 
} 
1

В данном конкретном случае вы пытаетесь создать Map<String, Object>, содержащий все свойства ресурса. Эта карта будет такой же, как и объект properties (что также является Map), поэтому я предполагаю, что весь метод является избыточным (и - как вы пишете - он не работает). properties Объект не содержит метода path и, вероятно, поэтому он не работает.

Более того, вы, возможно, использовали request.getResource() (вместо того, чтобы получать разрешение и ресурс по пути). Кроме того, вместо адаптации resource к ValueMap у вас может быть простой проход properties от JSP.

Более общий, если вы хотите извлечь логику из JSP в класс Java, я думаю, что это хорошая идея создать класс model, передав slingRequest его конструктору, а затем вызывая его методы в JSP. Пример:

GET.jsp

<c:set var="model" value="<%= new MyModel(slingRequest) %>" /> 
Result of the first method: ${model.firstValue}<br/> 
Result of the second method: ${model.secondValue} 

MyModel.java

public class MyModel { 
    private final SlingHttpServletRequest request; 

    private final Resource resource; 

    private final ValueMap properties; 

    public MyModel(SlingHttpServletRequest request) { 
     this.request = request; 
     this.resource = request.getResource(); 
     this.properties = resource.adaptTo(ValueMap.class); 
    } 

    public String getFirstMethod() { 
     // do some clever things 
     return ""; 
    } 

    public String getSecondMethod() { 
     // do more clever things 
     return ""; 
    } 
} 

Пожалуйста, обратите внимание, что если вы вызываете ${model.firstMethod} вам нужно добавить get префикс к имени метода (getFirstMethod()) ,

+0

Я получаю сообщение об ошибке, как так: - 'Не можете использовать это в статическом context'. Вы знаете, почему это так? Причина, по которой я использовал 'request.getResource()', потому что у моей страницы будет 6 экземпляров одного и того же компонента. Параметр, который автор передает, будет отличаться для всех экземпляров, а это означает, что создание ресурса с 1-м каналом не помогло бы. – bongman1612

+0

Эта ошибка предполагает, что у вас есть метод 'static' (а не конструктор, как в примере), в котором вы пытаетесь использовать ключевое слово this. –

1

Я хотел бы использовать тег useBean, чтобы создать экземпляр класса, который может дать вам всю информацию вам нужно:

<jsp:useBean id="mycomponent" scope="request" class="com.company.components.SomeComponent"> 
    <jsp:setProperty name="mycomponent" property="request" value="<%= slingRequest %>"/> 
</jsp:useBean> 

Тогда просто создать сеттер в классе.

public void setRequest(final SlingHttpServletRequest request) { 
    this.request = request; 
    //or more likely an init() method that inits all your props 
    //you could even use reflection to look for props that match all the field names 
    //to init them automatically 
    ValueMap props=request.getResource().adaptTo(ValueMap.class) 
    this.interestingProp= props.get("interestingProp"); 
} 

public String getInterestingProp(){ 
    return this.interestingProp; 
} 

Затем в JSP:

<c:out value="${mycomponent.interestingProp}"/> 
0

Ну мне удалось ответить на мой собственный вопрос. Все, что я сделал, это использовать resource.path в моей jsp.

ресурс здесь относится к компоненту в вопросе, и поэтому, используя путь я смог создать свой ValueMap правильно.

Таким образом, код в моем файле JSP выглядит следующим образом: -

<c:set var="refProperties" value="${xyz:getResourceProperties(resource.path,slingRequest)}"\> 

Используя это, я теперь могу ссылаться на любое свойство компонента, который я хочу: -

${refProperties.foo} 

Чтобы использовать resource.path, мы также должны указать global.jsp, иначе он не будет распознан.

Смежные вопросы