提问者:小点点

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


根据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的相应资源?


  • 共2个答案

    匿名用户

    如果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中查找吊索资源”