2011-07-12 17 views
3

実用的である限り、RESTの原則に従おうとするSpring 3.0 Webアプリケーションがあります。Spring MVC&Rest:同じ「コンテンツ」で異なる「レイアウト」ですか?

私はフォルダを返すコントローラメソッドを持っています(これは私のビジネスエンティティです)。 (GET http://.../folders/ {id})。ユーザーがこのURLにアクセスすると、ヘッダー、フッター、メニュー、およびフォルダーの詳細を含む完全なHTMLページが取得されます。 - ヘッダー、フッター、メニューの "強化"はApache Tilesで行われます。

ここでは、ユーザーにフォルダツリーが表示され、フォルダの1つをクリックすると、フォルダの詳細がAJAX経由で読み込まれ、ツリーの隣に表示されます。この場合、リアルのコンテンツは、ユーザーがフォルダページに直接アクセスしたときのように表示されるため、AJAXレスポンスはレンダリングされたHTML(JSONなし)である必要があります。

私は同じURLを要求すると、サーバーは本物ののコンテンツだけでなく、ヘッダー、フッター、メニューも返します。

私の質問は、私はスタイリッシュ方法でこれを処理する方法である: - もちろん、私は追加のパラメータと異なるタイルテンプレートを持つ2つのコントローラメソッドを使用することができますが、私はそれがためにhtmlのパラメータを使用しているため、素敵ではないと思います「レイアウト」と私は2つのコントローラのメソッド(と周りのすべてのもの)を記述する必要が2つのだけのタイルテンプレート

  • を有するように別のHTML「レイアウト」と同じ「コンテンツ」にアクセスする推奨方法は何ですか休憩方法?
  • タイルテンプレート定義でテンプレートを切り替える方法はありますか(どのように指定するかは、他の質問に対する回答によって異なります)。

答えて

3

ReSTでは、Acceptヘッダーに基づいたコンテンツネゴシエーションによって解決されると思われる問題があります。リクエスタは、test/html、application/jsonなどの予想されるタイプを示します。あなたのAjax呼び出し要求を別の型にすることによってこれを使用します。 Spring 3 MVCを使用しているので、要求された型に基づいて装飾されたビューまたは装飾されていないビューを返すようにViewResolversを構成することができます。これはreasonable exampleのように見えます。 RESTによって

+0

私はコンテンツネゴシエーションを知っています。しかし、私の2つの "レイアウト"の正しい内容は何ですか?なぜなら、両方の**のケースでHTMLなのでです。 text/htmlとapplication/html? – Ralph

+1

同じURLの2種類のドキュメントを配信するために、Content-Acceptヘッダーを誤って使用しているようです。私は "スタイリッシュな"コードの名前のために多くのフープを飛び越えてはいけないと考えています。 –

+1

それどころか、私はヘッダー(Content-AcceptではなくAccept)を使い、人間が読めるようなものにtext/htmlを使うのはかなり標準的だと考えています。あなたがそれを行うことができれば、マシンで読めるバージョンについては、application/xhtml + xmlをお勧めしたいと思います。後者は[IANAカタログ](http://www.iana.org/assignments/media-types/index.html)には記載されていません。 –

1

サーバーベースのアプリケーションで異なるコンテンツを送信するには、ページの「フルバージョン」と「実際のコンテンツ」に異なるURLを要求する必要があります。それを避けることはありません。

コードを複製することに懸念がある場合は、フォルダの1つをクリックしたときと同じメカニズムを使用してページの内部の詳細を読み込むようにメインレイアウトを設計します。コントローラがビューをレンダリングします。

0

あなたは次のオプションがあり

  • 例えば、リソースに新しいIRIを定義します。/resource?layout=x
  • は、たとえばtext/html;layout=xのために、カスタムのMIMEタイプ(またはMIMEのPARAM)を追加し、を求めますその受け入れヘッダからのもの
  • 好きなヘッダを送るPrefer: return=minimal

再利用可能なテンプレートを持ち、JSONデータのみを送信する別の解決策です。

(RESTは多くの制約を持っているので、おそらくあなたのWebサービスは、実際のRESTサービスではありません。)

関連する問題