如何在不使用 javascript 的情况下在 sightly 页面中使用 sling 服务?

How do I use a sling service in sightly page without using javascript?

我必须使用我创建的吊索服务,例如

@Component
@Service
public class SearchServiceImpl implements SearchService {
    public SearchResults search() {
     SearchResults results = new SearchResults();
     .....
     return results;
    }
}

现在我想在不使用 javascript 的情况下直接调用此服务,因为有些用户在访问我的服务时可能不会使用 javascript。如何调用此服务?

你可以去使用API。这需要提供一个实现 WCMUse 接口的搜索组件 class。

...
import com.adobe.cq.sightly.WCMUse;

public class Search extends WCMUse {

   @Reference
   private SearchService searchService

   public SearchResults listResults(){ 
   ...

搜索组件使用您的服务获取实际结果并将数据模型提供给视觉模板。

<div data-sly-use.search="Search">
    <ul data-sly-list.result="${search.listResults}">
      <li>${result.title}</li>
    </ul>
</div>

官方文档对我们实现目标很有帮助。 https://docs.adobe.com/docs/en/aem/6-1/develop/sightly/use-api-in-java.html 详情

@Reference 无法正常工作。您必须在此处使用 sling 脚本助手 class。

请看下面的代码片段:

public class Search extends WCMUse {

    SearchService service

    @Override
    public void activate() throws Exception {
        service = getSlingScriptHelper().getService( SearchService.class );
    }

由于您提到的是 Sling,而不是 AEM,因此您可以使用 data-sly-use 直接获取对服务的引用。看看 https://issues.apache.org/jira/browse/SLING-4554.

这将在 AEM 6.2 中提供。

在 AEM 6.2 中,您只需将服务放入 HTL 代码即可实现此目的:

<p data-sly-use.search="com.your.package.SearchServiceImpl">
   ${search.results}
</p>

最佳答案是按照 AEM 6.2

在 WCMUSEPOJO class 中使用 getSlingScriptHelper().getService()

以下link足以更好地解释它。

http://adobeaemclub.com/access-osgi-ser%C2%ADvice-from-the-wcmuse-class-in-sightly/