根据ResourceResolver接口:
http://dev.day.com/docs/en/cq/current/javadoc/org/apache/sling/api/resource/ResourceResolver.html
有三种方法可以解析路径或请求资源:
Resource resolve(HttpServletRequest request)
已过时。从2.0.4开始,使用resolve(HttpServletRequest,String)代替。
Resource resolve(HttpServletRequest request, String absPath)
解析来自给定absPath的资源可选择
HttpServletRequest考虑到了,例如Host请求头的值。
Resource resolve(String absPath)
从给定的绝对路径中解析资源。
但是,如果我有一个随机的给定URL字符串(例如http://www.mycompany.com/whatever.html
),我如何以编程方式找出给定URL的相应资源?
答案 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”