🔗 Slingoffers适配 器 模式,以便于转换实现Adaptable接口的 🔗 对象。此接口提供通用的adaptTo()方法,该方法会将对象转换为作为参数传递的类类型。
例如,要将资源对象转换为相应的Node对象,您只需执行以下操作:
Node node = resource.adaptTo(Node.class);
有以下用例:
获取特定于实施的对象。
要求传递内部上下文对象的对象的快捷方式创建。
例如,基于JCR的ResourceResolver
包含对请求的JCR Session
的引用,这反过来又需要对基于该请求会话工作的许多对象的引用,如PageManager
或UserManager
。
服务的快捷方式。
极少数情况 — sling.getService()
也很简单。
adaptTo()
可返回null。
原因有多种,包括:
请务必优雅地处理空值大小写。 对于jsp渲染,如果jsp失败将导致内容为空,则可能可以接受。
为了提高性能,实施可以免费缓存obj.adaptTo()
调用返回的对象。 如果obj
相同,则返回的对象相同。
此缓存适用于所有基于AdapterFactory
的情况。
但是,没有一般规则 — 对象可以是新实例或现有实例。 这意味着您不能依赖任一行为。 因此,在此情景中,对象可重复使用这一点很重要,在AdapterFactory
内尤其如此。
可通过多种方式来实施Adaptable.adaptTo()
:
对象本身;实现方法本身,并映射到特定对象。
通过AdapterFactory
,可映射任意对象。
这些对象仍必须实现Adaptable
接口,并且必须扩展SlingAdaptable
(这会将adaptTo
调用传递到中央适配器管理器)。
这允许将挂接到现有类的adaptTo
机制中,如Resource
。
两者兼有。
对于第一种情况,javaoc可以声明adaptTo-targets
的可能性。 但是,对于特定子类(如基于JCR的资源),通常不可能执行此操作。 在后一种情况下,AdapterFactory
的实现通常是包的私有类的一部分,因此不会在客户端API中公开,也不会在javaoc中列出。 理论上,可以从OSGi服务运行时访问所有AdapterFactory
实施,并查看其“adaptables”(源和目标)配置,但不能将它们相互映射。 最后,这取决于必须记录的内部逻辑。 因此,该参考。
🔗 Resourceataifate为:
节点 | 如果这是基于JCR的资源或引用节点的JCR属性。 |
属性 | 如果这是基于JCR属性的资源。 |
项目 | 如果这是基于JCR的资源(节点或属性)。 |
地图 | 返回属性的映射(如果这是基于JCR节点的资源(或其他支持值的资源映射)。 |
ValueMap | 如果这是基于JCR节点的资源(或其他资源支持值映射),则返回属性的方便使用映射。 还可以使用ResourceUtil.getValueMap(Resource) (句柄空小写等)实现(更简单)。 |
继承值映射 | ValueMap的扩展,在查找属性时,可考虑资源的层次结构。 |
PersistableValueMap | 如果这是基于JCR节点的资源,并且用户有权修改该节点上的属性。 注意:多个可持续映射不共享其值。 |
InputStream | 返回“文件”的二进制内容nt:resource |
AuthorizableResourceProvider org.apache.sling.jackrabbit.usermanager /system/userManager | |
cq:Page cq:PseudoPage | |
cq:Component | |
cq:Page | |
cq:Template | |
cq:Page | |
cq:Tag | |
cq:Preferences | |
cq:ContentSyncConfig | |
cq:ContentSyncConfig |
🔗 ResourceResolveratifate为:
会话 | 请求的JCR会话(如果这是基于JCR的资源解析程序(默认))。 |
PageManager | |
组件管理器 | |
Designer | |
AssetManager | 基于JCR会话,如果这是基于JCR的资源解析程序。 |
TagManager | 基于JCR会话,如果这是基于JCR的资源解析程序。 |
UserManager | 基于JCR会话,如果这是基于JCR的资源解析程序,并且用户有权访问UserManager。 |
可授权 | 当前用户。 |
用户 |
当前用户。 |
权限管理器 | |
首选项 | 当前用户的首选项(如果这是基于JCR的资源解析程序,则基于JCR会话)。 |
首选项服务 | |
PinManager | |
QueryBuilder | |
外部器 | 用于外部化绝对URL,即使不包含请求对象。 |
🔗 SlingHttpServletRequest会根据以下情况进行调整:
尚无目标,但实施了“适应性”,可在自定义AdapterFactory中用作源。
🔗 SlingHttpServletResponse可适应以下情况:
ContentHandler (XML) |
如果这是Sling重写器响应。 |
🔗 页面调整为:
Resource |
页面的资源。 |
LakedResource | 标记的资源(==此)。 |
节点 | 页面的节点。 |
... | 页面资源可以调整的所有内容。 |
🔗 组件可适应:
资源 | 组件的资源。 |
---|---|
LakedResource | 标记的资源(==此)。 |
节点 | 组件的节点。 |
… | 组件资源可以适应的所有内容。 |
🔗 模板可适应:
Resource |
模板的资源。 |
LakedResource | 标记的资源(==此)。 |
节点 | 此模板的节点。 |
... | 模板资源可以适应的所有内容。 |
节点 | 返回用户/组主节点。 |
---|---|
复制状态 | 返回用户/组主节点的复制状态。 |
🔗 资产适应:
资源 | 资产的资源。 |
---|---|
节点 | 资产的节点。 |
… | 资产资源可以调整的所有内容。 |
🔗 标记适应于:
资源 | 标记的资源。 |
---|---|
节点 | 标记的节点。 |
… | 标记资源可以调整的所有内容。 |
此外,Sling / JCR / OCM还为自定义OCM(对象内容映射)对象提供了 [AdapterFactory](https://sling.apache.org/site/adapters.html#Adapters-AdapterFactory)
。