CQ5:如何以编程方式找到给定URL的资源?

时间:2014-01-14 02:57:49

标签: cq5 sling aem

根据ResourceResolver接口:

http://dev.day.com/docs/en/cq/current/javadoc/org/apache/sling/api/resource/ResourceResolver.html

有三种方法可以解析路径或请求资源:

  1. Resource resolve(HttpServletRequest request)  已过时。从2.0.4开始,使用resolve(HttpServletRequest,String)代替。

  2. Resource resolve(HttpServletRequest request, String absPath)  解析来自给定absPath的资源可选择  HttpServletRequest考虑到了,例如Host请求头的值。

  3. Resource resolve(String absPath)  从给定的绝对路径中解析资源。

  4. 但是,如果我有一个随机的给定URL字符串(例如http://www.mycompany.com/whatever.html),我如何以编程方式找出给定URL的相应​​资源?

2 个答案:

答案 0 :(得分:5)

如果网址中的主机名/端口为mapped to a content repository location,CQ将尝试解析所提供的网址。

在servlet中,可以从slingRequest获取ResourceResolver:

ResourceResolver resourceResolver = slingRequest.getResourceResolver();
String resourcePath = new URI("http://www.mycompany.com/whatever.html").getPath();
Resource res = resourceResolver.resolve(resourcePath);

请注意,对于上述短网址和域名,您需要在实例上配置mapping

在JSP中,只要您调用了<sling:defineObjects/><cq:defineObjects/>标记,就可以使用:

<sling:defineObjects>
<%
    String resourcePath = new URI("http://www.mycompany.com/whatever.html").getPath();
    Resource res = resourceResolver.resolve(resourcePath);
%>

"Getting Resources and Properties in Sling"

中提供了更多信息

测试一些你知道很好的网址。例如:

Resource res = resourceResolver.resolve("http://localhost:4502/content/geometrixx.html");
Resource res = resourceResolver.resolve("/content/geometrixx.html");

以上两者都应该解析为相同的资源。

如果您想测试CQ是否可以解析您提供的URL,请尝试系统控制台中的jcr解析程序页面 http://localhost:4502/system/console/jcrresolver查看url是否已映射,如果它不包含路径中的full / content / ..任何mapped都应该能够得到解决。

答案 1 :(得分:0)

实现了

ResourceResolver类来返回Resource。具体而言,此类解析存在resolve()函数。但是,即使有三个重载的resolve()函数,它们都不会占用URL String。

鉴于ResourceResolver接受HttpServletRequest作为输入,如果我可以使用HttpServletRequestWrapper将给定的URL转换(调整)为HttpServletRequest,则问题将得到解决。因此,解决方案是实现一个扩展HttpServletRequestWrapper的ResolverRequest类。

有关完整的解决方案和代码示例,请参阅“Programmatically find the Sling Resource from a Given a URL