9

Spring MVC ベースの Web アプリケーションがあります。次に、スマートフォンで適切にレンダリングされるように、このアプリケーションを変更する必要があります。

このために、スマートフォン用に個別の JSP を作成します。そのため、ブラウザからリクエストが送信された場合は、リクエストがデスクトップから送信されているかどうかを確認し、通常の JSP を表示します。リクエストがモバイルから送信されている場合は、スマートフォン用の JSP を表示します。

これには spring Mobile を使用します。

場合によっては、スマートフォンのデータを制限したい場合もあります。JSP 内のすべてのデータが表示されない場合があります。

例: メニューにいくつかのアイテムのみを表示する必要がある場合があります。デスクトップ Web アプリケーションではフル メニューが表示されますが、スマートフォンではメニュー項目が少なく表示されます。デスクトップ メニューとモバイル メニューの JSP は異なりますが、メニュー項目はデータベースから取得されます。

これに役立つ設計パターンはありますか? デバイス タイプをチェックする if else 条件を記述したくありません。

4

7 に答える 7

1

他の提案されたソリューションのほとんどは過剰に設計されており、Keep It Simple の原則に従います。

JSP を使用して、XML でページの標準化された抽象化を生成します。JSP は、クライアント デバイスの種類に基づいて、含めるための適切な異なるスタイル シートを選択します。これにより、特定のデバイスに縛られることなく、プレゼンテーションからコンテンツを適切に分離できます。

于 2013-02-06T12:29:26.950 に答える
1

UI の観点からメニューの問題が見られる場合は、Abstract Factoryデザイン パターンを使用できます。一般に、メニューを生成する共通のインターフェイスが 1 つあります。

interface MenuFactory {
    Object createMainMenu();
    Object createSomeOtherMenu();
}

および 2 つの実装:

public class DesktopAppMenuFactory implements MenuFactory {
    public Object createMainMenu() {
         ask dao for menus intended for desktop variant
         return ...
    }

    public Object createSomeOtherMenu() {
         ask dao for menus intended for desktop variant
         return ...
    }
}

public class MobileAppMenuFactory implements MenuFactory {
    public Object createMainMenu() {
         ask dao for menus intended for mobile variant
         return ...
    }

    public Object createSomeOtherMenu() {
         ask dao for menus intended for mobile variant
         return ...
    }
}

次に、クライアント タイプを指定して適切なファクトリを作成するメソッドを記述します。

public static MenuFactory createMenuFactory(String clientType) {
    if( clientType is desktop.. ) {
        return new DesktopAppMenuFactory();

    } else if( clientType is mobile.. ) {
        return new MobileAppMenuFactory();
    }
}

どのバリアントであるかを気にせずに、コントローラーと JSP で MenuFactory を使用します。これは、上記のユーティリティ メソッドにある唯一の if ステートメントですcreateMenuFactory()

一方、データの観点から問題を見る場合は、サービス層に適用される戦略パターンが適切です。しかし、コードコードは上記と非常によく似たものになり、*Factory名前が変更され*Service、実装はファクトリではなく戦略と呼ばれます。

于 2013-02-04T07:54:16.860 に答える
0

スマートフォンには複数のサイズがあることを忘れないでください。つまり、2つのビューでは不十分です。HTML5を見てください。2つのビューは必要ない場合もあります。レスポンシブウェブページを用意します。レスポンシブページは、大小のフォームファクタに収まるようにサイズを変更します。例:http ://twitter.github.com/bootstrap/index.html 。上記のリンクのページのサイズを変更してみてください。小さい画面でそれ自体を圧縮する(または一部の項目を削除する)メニューを作成できます。アプリケーションでタッチが重要な場合は、タッチを行うjava-scriptフレームワークを確認してください。http://verekia.com/initializr/response-templateも参照してください

于 2013-02-08T16:38:49.230 に答える
0

あなたの主な目的がモバイル Web のサポートを追加することである場合、私が検討する代替案は、レスポンシブなサイトのバージョンを 1 つだけにすることです。

多くの css フレームワークでそれを実現できます。最も人気のあるフレームワークの 1 つはTwitter の Bootstrapです。

このアプローチでは、画面サイズが小さくても大きくても、それに応じて画面のサイズが変更されます。この例で流体レイアウトを確認できます: Bootstrap Fluid

このようにして、Web アプリのレイアウトとコンテンツ (メニューと画像を含む) のサイズを変更し、複数の画面サイズで使用できるようにします。

于 2013-02-08T16:57:03.517 に答える
0

Spring 3 MVC を使用していて、Controller メソッドが View を返すという通常のパターンに固執している場合、最も簡単で最も正しい方法は、モバイル デバイスを処理する別のメソッドを用意するか、同じメソッドを用意することだと思います。 、ただし、別のビューを返します (ビュー リゾルバーを介して)。

したがって、たとえば、私のメソッドは次のようになります。

@RequestMapping
public String default(Model uiModel, HttpServletRequest request) {
  // Do common stuff here, like load your model

  if(request.getHeader("User-Agent").indexOf("Mobile") != -1) {
    return "normalForm";
  } else {
    return "mobileForm";
  }
}

iphone は "form_iphone" を取得し、Chrome は "form_chrome" を取得するなど、事前に定義されたパターンに基づいて、凝った名前を動的に作成することもできます。

于 2013-02-01T19:26:43.197 に答える
0

サポートをあらゆるタイプのデバイスに拡張する意図があると仮定すると、これを支援するために何らかのサポートを作成します。簡単なアプローチを考えることができますが、多くのことを想定しています(例では、ユーザーの許可に基づいてメニューがレンダリングされます...)。

ユーザーの現在のデバイスに基づいてユーザーのアクセス許可を変更します (デスクトップ ユーザーはすべてを表示できますが、モバイル ユーザーはアクセス許可が少ないため、メニューのいくつかのアイテムを表示できません)。ユーザーにログインし、デバイスに基づいてユーザーの許可を後処理できます。

これは、メニュー テーブルに列を追加するか、一部のデバイスでレンダリングできないメニュー要素を削除するために何らかのプロセッサを作成することで作成できます。

于 2013-02-04T17:16:42.130 に答える