1

MVCパターンの私の古典的な理解では、コントローラーはビューの実装の詳細を知る必要はありません。イベント(a)によってトリガーされ、@RequestMappingモデルを返すコントローラーが必要です。モデルをどのように提示するかは、ビュー次第です。

具体的なユースケースは、ショッピングカートに商品を追加することです。シンプルなHTMLビューとよりリッチなAjaxビューの2つのビューがあります。私の夢のシナリオでは、両方のビューが同じURIにリクエストを送信し、コントローラーの唯一のメソッドにヒットします。

@Controller
public class ShoppingCartController {

    @RequestMapping("/add")
    public String addItem(@RequestParam String itemId, Model model) {
        // …
        model.add(shoppingCart);
        return "cart";
    }

}

私のAjaxビューは/add?itemId = abcにリクエストを送信し、理想的にはJSONでモデルを取得します。私のHTMLビューは同じリクエストを送信し、モデルをJSPにレンダリングします。

addItem()私の現在のアプローチは、JSONを呼び出して返すコントローラーに2番目のメソッドを実装することです。

@RequestMapping(value="/add", headers="x-requested-with=XMLHttpRequest")
public @ResponseBody ShoppingCart addItemByAjax(@RequestParam String itemId, Model model) {
    addItem(itemId, model);
    return model.asMap().get("shoppingCart");
}

すべてのコントローラーをビューに依存するモデルアダプターで装飾するというアイデアはあまり好きではありません。モデルの適切なプレゼンテーションでビューを提供するためのより一般的な方法はありますか?モデルを任意のビューに送信するメソッドをコントローラーに1つだけ入れたい。もちろん、スタックのどこかに、何らかの条件が真の場合にモデルをJSONとして提供することを決定するハンドラーが存在する必要があります(たとえば、x-requested-with = XMLHttpRequest)。

4

1 に答える 1

1

ContentNegotiatingViewResolverMappingJackson2JsonViewデフォルトのビューとして設定されていると役立つようです。ドキュメントを読むよりも試行錯誤でした。さらに、私にとっては、デフォルトのビューをJSONに設定するのはそれほど直感的ではありません。そして、Spring 3.2 の前に、この一般的なユースケースをどのように解決したのだろうか。

于 2012-12-30T23:37:33.860 に答える