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