0

私が達成したいのは、CQ 5 モバイル アプリケーション開発の初心者です。モバイル デバイスがページにリクエストを送信すると、モバイル ブラウザ、モバイル ブラウザのバージョン、モバイル OS、モバイル OS バージョンなどのモバイルの属性がキャプチャされます。この情報をログに記録し、後の段階でこれを使用して、異なるデバイス グループに分類し、異なるデバイス グループの異なるコンポーネントをレンダリングします。

注: これらのリンクのいくつかは既に 確認済みです CQ5 Mobile Development Docs

http://www.cognifide.com/blogs/cq/adobe-cq-5-5-mobile-improvements/ http://wurfl.sourceforge.net/help_doc.php

デバイスにnull値があるため、Null Pointer Exceptionをスローするこのコードを試しました。どこかで間違っている場合は修正してください

SlingHttpServletRequest slingRequest = this.request.getSlingRequest();
    Device device = slingRequest.adaptTo(Device.class);
    Map<String, String> deviceAttributes = device.getAttributes();
    LOG.info("Request is sent from Device with OS"+deviceAttributes.get("device_os"));

このコードをテストする方法は次のとおりです。エミュレーターの1つからモバイルデバイスの属性をログに記録するこのコンポーネントを持つページにリクエストが送信されるたびに、ログファイルを確認します

モバイル デバイスの属性を取得するためのコードまたはメソッドに問題がある場合は、助けてください。これについてさらに詳細が必要な場合はお知らせください。

よろしく、 ヤシュ

こんにちは、これのスタック トレースは次のとおりです。

Caused by: org.apache.sling.api.SlingException: An exception occurred processing JSP page /apps/companyname/components/content/mobilebreadcrum/mobilebreadcrum.jsp at line 5
at org.apache.sling.scripting.jsp.jasper.servlet.JspServletWrapper.handleJspExceptionInternal(JspServletWrapper.java:571)
at org.apache.sling.scripting.jsp.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:496)
at org.apache.sling.scripting.jsp.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:448)
at org.apache.sling.scripting.jsp.JspServletWrapperAdapter.service(JspServletWrapperAdapter.java:59)
at org.apache.sling.scripting.jsp.JspScriptEngineFactory.callJsp(JspScriptEngineFactory.java:173)
at org.apache.sling.scripting.jsp.JspScriptEngineFactory.access$100(JspScriptEngineFactory.java:84)
at org.apache.sling.scripting.jsp.JspScriptEngineFactory$JspScriptEngine.eval(JspScriptEngineFactory.java:388)
at org.apache.sling.scripting.core.impl.DefaultSlingScript.call(DefaultSlingScript.java:358)
... 147 more Caused by: javax.el.ELException: Error reading 'modelName' on type com.companyname.www.components.content.mobilebreadcrumb.MobileBreadCrum
at javax.el.BeanELResolver.getValue(BeanELResolver.java:66)
at javax.el.CompositeELResolver.getValue(CompositeELResolver.java:53)
at org.apache.el.parser.AstValue.getValue(AstValue.java:97)
at org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:186)
at org.apache.sling.scripting.jsp.jasper.runtime.PageContextImpl.proprietaryEvaluate(PageContextImpl.java:923)
at org.apache.jsp.apps.companyname.components.content.mobilebreadcrum.mobilebreadcrum_jsp._jspService(mobilebreadcrum_jsp.java:160)
at org.apache.sling.scripting.jsp.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
at org.apache.sling.scripting.jsp.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:419)
... 152 more Caused by: java.lang.NullPointerException
at com.companyname.www.components.content.mobilebreadcrumb.MobileBreadCrum.getModelName(MobileBreadCrum.java:35)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at javax.el.BeanELResolver.getValue(BeanELResolver.java:62)
... 160 more

JSP コードは次のとおりです。

<%@include file="/apps/companyname/components/global.jsp"%><ct:component
className="com.companyname.www.components.content.mobilebreadcrumb.MobileBreadCrum"
name="mobilebreadcrum" />${mobilebreadcrum.modelName}

Java コードは次のとおりです。

    public String getModelName() {
    SlingHttpServletRequest slingRequest = this.request.getSlingRequest();
    String resourceType = slingRequest.getResource().getResourceType();
    String resourceSuperType = slingRequest.getResource().getResourceSuperType();
    LOG.info("RESOURCE TYPE:"+resourceType);
    LOG.info("RESOURCE SUPER TYPE:"+resourceSuperType);
    Device device = request.getCurrentPage().adaptTo(Device.class);
    device.getAttributes();
    return modelName;
}

他に欲しいものがあれば教えてください

よろしく、 ヤシュ

4

3 に答える 3

0

これを行うには、エミュレーターではなく、実際のデバイスを使用する必要があります。デバイスを検出するために、CQ はリクエスト内のユーザー エージェント データを調べます。そのため、デスクトップ ブラウザでページを開くと、モバイル デバイスではないユーザー エージェント データを含むリクエストが送信されます。この機能をテストするには、ユーザー エージェント スイッチャーのようなものを使用できます (例: chrome 用)。ただし、その場合、CQ はエミュレーター ラッパーを使用および描画せず、モバイル デバイスの使用を前提とします。今、適切なユーザー エージェントとデスクトップ上でのエミュレーターの描画を組み合わせる方法を考えています。結果順に掲載します。

于 2013-02-06T09:37:32.520 に答える
0

/system/console/adapters に移動して、適切なアダプター SlingHttpServletRequest → Device があることを確認してください。そこから診断を始めます。私の場合、対応する行は次のようになります。

適応クラス: org.apache.sling.api.SlingHttpServletRequest

アダプタ クラス: com.day.cq.wcm.mobile.api.device.DeviceGroup、com.day.cq.wcm.mobile.api.device.DeviceGroupList、com.day.cq.wcm.mobile.api.device.Device

提供バンドル: com.day.cq.wcm.cq-wcm-mobile-core (190)

ありがとう、マックス。

于 2013-01-30T14:50:01.937 に答える