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)。