<%@ 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
中定义答案 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