根据ResourceResolver接口:
http://dev.day.com/docs/en/cq/current/javadoc/org/apache/sling/api/resource/ResourceResolver.html
有三种方法可以解析资源的路径或请求:
>
资源解析(HttpServletRequest request)
已弃用。从2.0.4开始,改用解决(HttpServletRequest, String)。
资源解析(HttpServletRequest request, String abpath)
解析来自给定abath的资源,可选地考虑HttpServletRequest,例如Host请求标头的值。
资源解析(String abPath)
从给定的绝对路径解析资源。
但是如果我有一个随机给定的URL字符串(例如http://www.mycompany.com/whatever.html
),我如何以编程方式找出给定URL的相应资源?
如果URL的主机名/端口映射到内容存储库位置CQ将尝试解析提供的URL。
在servlet中,ResourceResolver可以从slingRequest中获得:
ResourceResolver resourceResolver = slingRequest.getResourceResolver();
String resourcePath = new URI("http://www.mycompany.com/whatever.html").getPath();
Resource res = resourceResolver.resolve(resourcePath);
请记住,要使上述短网址和域正常工作,您需要在实例上配置映射。
在JSP中,只要调用了
<sling:defineObjects>
<%
String resourcePath = new URI("http://www.mycompany.com/whatever.html").getPath();
Resource res = resourceResolver.resolve(resourcePath);
%>
“在Sling中获取资源和属性”中提供了更多信息
在您知道不错的几个URL上进行测试。例如:
Resource res = resourceResolver.resolve("http://localhost:4502/content/geometrixx.html");
Resource res = resourceResolver.resolve("/content/geometrixx.html");
上述两者都应解析为同一资源。
如果您想测试CQ是否可以解析您提供的URL,请尝试系统控制台http://localhost:4502/system/console/jcrresolver
中的jcr解析器页面,看看如果路径中不包含完整的/content/… url是否被映射。任何映射都应该能够被解析。
ResourceResolver类被实现为返回Resource。具体来说,对于这种类型的解析,存在解决()函数。然而,即使有三个重载的解决()函数,它们都不接受URL字符串。
鉴于ResourceResolver接受HttpServletRequest作为输入,如果我可以使用HttpServletRequest estWrapper将给定的URL转换(适应)为HttpServletRequest,问题将得到解决。因此,解决方案是实现一个扩展HttpServletRequest estWrapper的ResolverRequest类。
有关完整的解决方案和代码示例,请参阅“以编程方式从给定URL中查找吊索资源”