0

ServiceDirectoryControllerHTML (Web ページ) 表現と非 HTML (Web サービス) 表現の両方を提供したいRESTful リソース ( ) 用の Spring MVC コントローラーがあります。ビュー名と JSP を使用して HTML 表現を生成したいHttpMessageConverterのですが、他の表現には s を使用します。それ、どうやったら出来るの?

非 HTML 表現のリクエスト処理メソッドを実装しました。私の内部 (ドメイン モデル) 表現はThingNamesであり、適切なメッセージ コンバーターがあるため、要求処理方法は単純です。

 @RequestMapping(value = { "/directory/" }, method = RequestMethod.GET)
 @ResponseBody
 public ThingNames retrieveThings() {
    ...
 }

次に、JSP ページのリクエスト処理メソッドを追加します。したがって、ビュー名を示し、適切なモデルを提供するメソッドが必要です。したがって、やるべきことは明らかです:

 @RequestMapping(value = { "/directory/" }, method = RequestMethod.GET)
 public String retrieveThings(Map< String, Object > model) {
    ...
 }

ビュー名を戻り値として使用します。

しかし、それは機能しますか?Spring は、HTML 表現を 2 番目の方法で処理し、他のすべての表現には最初の方法を使用する必要があることを理解できるほど賢いでしょうか? そうでない場合、JSP/HTML 表現と非 JSP/HTML 表現の両方を処理するにはどうすればよいですか?

4

1 に答える 1

2

Paul Chapman によるSpring のブログ投稿によると、私のコントローラーは、 PPA Content Negotiation Strategyを設定すると書かれたとおりに機能します。つまり、必要なコンテンツ タイプに関する手がかりを次の優先度の降順で検討するように Spring を構成するとします。

  1. パス拡張子 ( .htm.tsvなど)
  2. リクエストパラメータ ( ?format=htm, ?format=xls)
  3. Accept ヘッダー (適切な HTTP コンテンツ ネゴシエーション。悲しいことに、HTML ブラウザーではうまく機能しません)。

さらに、提供されている SpringContentNegotiationManagerFactoryBeanはまさにその順序で動作します。


consumesさらに、コントローラー内のハンドラー メソッドにアノテーションを付けて、アノテーションのおよびproduces値を使用して、それらのメソッドが HTML コンテンツを処理する必要があることを Spring が認識できるようにする必要があります@RequestMapping。つまり、単に書くのではなく、

 @RequestMapping(value = { "/directory/" }, method = RequestMethod.GET)
 @ResponseBody
 public String retrieveThings(Map< String, Object > model) {
    ...
 }

書きます

 @RequestMapping(value = { "/directory/" }, method = RequestMethod.GET,
    produces = MediaType.TEXT_HTML_VALUE)
 @ResponseBody
 public String retrieveThings(Map< String, Object > model) {
    ...
 }
于 2013-06-14T12:49:57.720 に答える