我正在尝试将现有的组件代码从JSP转换为Sightly。为此,我需要在后端获取paragarph对象,即java并将其发送到sightly(HTL)。
JSP中的现有代码:
<%
ParagraphSystem parSys = ParagraphSystem.create(resource, slingRequest);
for (Paragraph par: parSys.paragraphs()) { %>
<sling:include resource="<%= par %>"/><%
} %>
通过这种方式,组件中包含了一个资源。
以下是新的&amp; amp;上面的jave代码:
爪哇:
public class AnchorList extends WCMUsePojo{
private List<Paragraph> paragraphs;
public List<Paragraph> getParagraphs() {
return paragraphs;
}
public void setParagraphs(List<Paragraph> paragraphs) {
this.paragraphs = paragraphs;
}
public void activate() throws Exception{
paragraphs = new LinkedList<Paragraph>();
Resource resource = getResource();
SlingHttpServletRequest slingRequest = getRequest();
ParagraphSystem parSys = ParagraphSystem.create(resource, slingRequest);
for (Paragraph par: parSys.paragraphs()) {
paragraphs.add(par);
}
}
}
悦目:
<div data-sly-use.anchorList="com.xxx.components.AnchorList"data-sly-unwrap>
<div data-sly-list.paras="${anchorList.paragraphList}" data-sly-unwrap>
<div data-sly-test.paraList="${paras}" data-sly-unwrap></div>
<div class="anchorlistitem section collapsed">
<div data-sly-resource="${@ resource=paraList}" data-sly-unwrap></div>
</div>
</div>
我在这里遇到两个问题。首先,我无法使用sightly从java到前端获取段落对象。我试图通过使用以下内容显示段落对象的值来验证它:
<div>
para object is ${paras}
</div>
但它没有任何价值。我能够在java类中看到段落对象值,但是它无法在sightly中读取它。
第二个问题是,我需要JSP的等效代码才能在组件中包含资源。我不确定我使用data-sly-resource编写的代码是否正确。
以下是我在尝试运行上述java / htl代码时遇到的错误日志:
19.12.2016 00:22:51.778 ERROR [0:0:0:0:0:0:0:1 [1482124971543] GET /website/en/home/what-is-totalinsight/investing.html HTTP / 1.1] com.day.cq.wcm.core.impl.WCMDebugFilter例外:org.apache.sling.api.request.RecursionTooDeepException:/ content / websitet / en / home / what-is-totalinsight / investing / jcr:content / page_content / achorlist org.apache.sling.scripting.sightly.SightlyException:org.apache.sling.api.request.RecursionTooDeepException:/ content / website / en / home / what-is-totalinsight / investing / jcr:content / page_content / com.adobe.cq.sightly.WCMScriptHelper.includeResource(WCMScriptHelper.java:143)的com.adobe.cq.sightly.WCMScriptHelper.includeResource(WCMScriptHelper.java:86)com.adobe.cq.sightly.internal上的achorlist。 extensions.ResourceExtension.call(ResourceExtension.java:99)位于apps.pnc_total_insight.components.elements.achorlist的org.apache.sling.scripting.sightly.impl.engine.runtime.RenderContextImpl.call(RenderContextImpl.java:89)。 SightlyJava_achorlist.render(SightlyJava_achorl ist.java:116)org.apache.sling.scripting.sightly.impl.engine.runtime.RenderUnit.render(RenderUnit.java:52)at org.apache.sling.scripting.sightly.impl.engine.SightlyScriptEngine。来自org.apache.sling.scripting.core.impl.DefaultSlingScript.call的org.apache.sling.scripting.sightly.impl.engine.SightlyScriptEngine.eval(SightlyScriptEngine.java:83)中的evaluateScript(SightlyScriptEngine.java:95)( DefaultSlingScript.java:361)
答案 0 :(得分:0)
您无法直接使用资源对象。相反,您可以使用资源路径和资源类型包含资源,如下所示。
$pip --version
pip 9.0.1 from /usr/local/lib/python2.7/dist-packages (python 2.7)
$ python --version
Python 2.7.11+
此外,您可以使用<sly data-sly-use.anchorList="com.xxx.components.AnchorList">
<sly data-sly-list.paras="${anchorList.paragraphList}">
<div class="anchorlistitem section collapsed">
<sly data-sly-resource="${paras.resourcePath @ resourceType=paras.resourceType}"></sly>
</sly>
</sly>
标记,而不是对每个元素使用<sly>
。
答案 1 :(得分:0)
您的代码存在以下问题:
AnchorList#getParagrahs
,但您可以从HTL / Sightly脚本中将其作为anchorList.paragraphList
调用。您应该使用anchorList.paragraphs
data-sly-test.paraList="${paras}"
件是不必要的。您可以使用迭代器变量paras
访问当前项目,无需重新分配它。data-sly-resource="${paras.path @ resourceType}"
。在较新版本的HTL / Sightly中,您可以直接使用实际资源:https://issues.apache.org/jira/browse/SLING-5811 根据您使用的HTL / Sightly的版本,您可能希望将<div data-sly-unwrap...>..
替换为<sly..>..