Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Aem CQ5:如何通过编程找到给定URL的资源?_Aem_Sling - Fatal编程技术网

Aem CQ5:如何通过编程找到给定URL的资源?

Aem CQ5:如何通过编程找到给定URL的资源?,aem,sling,Aem,Sling,根据ResourceResolver接口: 有三种方法可以解析资源的路径或请求: 资源解析(HttpServletRequest请求) 不赞成。从2.0.4开始,改用resolve(HttpServletRequest,String) 资源解析(HttpServletRequest请求,字符串absPath) 从给定路径解析资源 HttpServletRequest,例如主机请求头的值 资源解析(字符串absPath) 从给定的绝对路径解析资源 但是如果我有一个随机给定的URL字符串(例如ht

根据ResourceResolver接口:

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

  • 资源解析(HttpServletRequest请求)
    不赞成。从2.0.4开始,改用resolve(HttpServletRequest,String)

  • 资源解析(HttpServletRequest请求,字符串absPath)
    从给定路径解析资源 HttpServletRequest,例如主机请求头的值

  • 资源解析(字符串absPath)
    从给定的绝对路径解析资源


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

    如果URL中的主机名/端口为CQ,则CQ将尝试解析提供的URL

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

    ResourceResolver resourceResolver = slingRequest.getResourceResolver();
    String resourcePath = new URI("http://www.mycompany.com/whatever.html").getPath();
    Resource res = resourceResolver.resolve(resourcePath);
    
    请记住,要使上述短URL和域正常工作,您需要在实例上进行配置

    在JSP中,只要调用了
    标记,就可以使用:

    <sling:defineObjects>
    <%
        String resourcePath = new URI("http://www.mycompany.com/whatever.html").getPath();
        Resource res = resourceResolver.resolve(resourcePath);
    %>
    
    以上两个问题都应解析为同一个资源

    如果您想测试CQ是否可以解析您提供的URL,请尝试系统控制台中的jcr解析器页面
    http://localhost:4502/system/console/jcrresolver
    查看url是否已映射,如果它不包含完整的/content/。。在小路上。应该能够解决任何问题。

    类被实现以返回资源。具体来说,存在用于此类型解析的resolve()函数。但是,即使有三个重载的resolve()函数,它们都不接受URL字符串

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


    有关完整的解决方案和代码示例,请参见“”

    您已经找到了正确的API。您的问题是如何在JSP/Servlet中使用它?问题是,所述API不接受URL字符串,只接受absPath字符串。我的实验表明getResource(path)中的路径根本不接受协议/主机名/端口。因此,上面的代码很可能返回null。问题是在给定URL字符串的情况下找出资源。解析中的absPath(字符串absPath)不接受URL字符串。使用resolve()的示例不是一个解决方案,你是对的。资源解析程序使用一个助手,该助手获取URL并仅使用URL中的路径,而忽略协议/主机/端口。我已经更新了这个示例,在解析之前使用java.net.URI获取路径。
    Resource res = resourceResolver.resolve("http://localhost:4502/content/geometrixx.html");
    Resource res = resourceResolver.resolve("/content/geometrixx.html");