吊索适配器,用于检测请求页面不工作的设备(在CQ AEM 6.1中)

时间:2016-01-29 18:50:05

标签: jsp adobe cq5 aem sling

<%@ page import="com.day.cq.wcm.mobile.api.device.*"%>
<% 
Device device = slingRequest.adaptTo(Device.class);

if(device != null) {
        DeviceGroup deviceGroup = device.getDeviceGroup();

        String userAgent = device.getUserAgent();
        out.write("  Test\n");
    }

%>  

设备变量始终为 null 。这个问题是在Adobe论坛上提出的,但没有人回答过。如果您能分享您解决此问题的经验,将不胜感激。

注意:slingRequest已在global.jsp

中定义

2 个答案:

答案 0 :(得分:4)

我现在正在做同样的事情。您无法直接从请求中获取设备,首先从中获取DeviceGroup,然后显示您想要的任何内容。

final DeviceGroup deviceGroup =slingRequest.adaptTo(DeviceGroup.class); if(deviceGroup!=null)deviceGroup.drawHead(pageContext);

答案 1 :(得分:0)

刚在我的实例上试过这个:

Device device = request.adaptTo(Device.class);

返回null,而:

DeviceGroup deviceGroup = request.adaptTo(DeviceGroup.class);

另一方面,让我引用一个有效的DeviceGroup对象。

如果您需要设备而非群组,请尝试使用DeviceMapper。看来DeviceMapper确实可用作com.day.cq.wcm.mobile.core.impl.devicemapper.DeviceMapperImpl

实施的服务

因此,在您的JSP中,您只需编写:

<%@ page import="com.day.cq.wcm.mobile.api.device.DeviceMapper" %>

...

<%
  DeviceMapper deviceMapper = sling.getService(DeviceMapper.class);
  Device device = deviceMapper.getDeviceInstance(slingRequest);
%>

如果所有相关配置都正确,那么这应该给你正确的对象。

但是,如果可能,您应该尽量避免在JSP中放置这样的逻辑。 这种代码应该封装在适配器工厂中,或者最好封装在Sling Model中。这样你就可以从表示层中删除所有代码,只需阅读JSP中的简单属性。

您可能还想查看可能适合您特定用例的com.day.cq.wcm.mobile.core.MobileUtil.class

我还想指出,编写后端代码以定位特定设备(而不是组)似乎有点奇怪。在介绍一堆类来检测设备之前,请考虑使用适当的样式,移动站点版本Target(如果目的是为具有不同设备的用户提供不同内容)可以实现相同的结果。或许你应该去AEM Apps