6

Spring MVC(私は3.0.2で作業しています)では、2つのHTTPメソッドが常にまたはほとんど私が思うように)予約されています(つまり、適切なハンドラーでマップされています)。

@RequestMapping(method=RequestMethod.GET)
public String showForm(Map model)
{
     //Usually retrieve data from the database when the page is loaded.

     return "admin_side/Temp";
}

上記のメソッドは、GET要求が行われたときに呼び出されます。


@RequestMapping(method=RequestMethod.POST)
public String onSubmit(@ModelAttribute("tempBean") @Valid TempBean tempBean, BindingResult error, Map model, HttpServletRequest request, HttpServletResponse response)
{
     //Perform some basic operations with the database like insert, update or delete when the form is submitted (by clicking a submit button or so).

     return "admin_side/Temp";
}

上記のメソッドは、POSTリクエストが行われたときに呼び出されます。@RequestMapping(value="admin_side/Temp")Springコントローラーが注釈で指定されていると仮定します。


さて、Ajaxを使用する必要があり、前述の方法とは異なる機能を実行する必要がある場合はどうなりますか?すでにハンドラーがマップされているため、GETメソッドでもPOSTメソッドでも別のメソッドを処理できません(HTTPメソッドのGETとPOSTは、それぞれshowForm()onSubmit()メソッドを処理するために予約されています)。

デモンストレーションのために、私は次のようなAjaxmethod=RequestMethod.PUTでのアプローチを使用しました

@RequestMapping(method=RequestMethod.PUT)
public @ResponseBody String getStateList(@ModelAttribute("tempBean") @Valid TempBean tempBean, BindingResult error, HttpServletRequest request, HttpServletResponse response)
{
    return "Message";
}

意図したとおりに機能しましたが、最善の解決策ではないと感じました。そのようなシナリオがある場合、Spring MVCでAjaxリクエストをどのように処理しますか(実際、私にとってはごく普通のようです)?私は(常に)使用する必要がありますRequestMethod.PUTか?(または、SpringのAjaxに最適なHTTPメソッドは何ですか?)

同じコントローラーで同じHTTPメソッドを使用して複数のメソッドをマップする方法はありますか(明白な答えはnoである必要があります)?繰り返しますが、Spring MVCでAjaxを使用する必要がある場合、どのアプローチを使用しますか?あなたが私の言いたいことに従うことを願っています!私の英語はまだ初期段階なので、表現するのはかなり難しいです。

4

3 に答える 3

2

本当の質問は:

同じURLとメソッドの組み合わせが、アクセス方法に応じて異なる動作をするのはなぜですか?

フロントエンドでAJAXリクエストを行ってアクセスしているかどうかは誰が気にしますか?呼び出しのセマンティクスが異なる場合は、別のURLを指定してください。そのクラスから機能を複製する必要をなくすために、クラスではなくメソッドで直接URLパターンを指定できます。

于 2012-08-05T18:31:26.187 に答える
2

1つのコントローラーに複数のGETメソッドとPOSTメソッドを含めることができます。この目的には、value属性を使用する必要があります。

元:

@RequestMapping(method=RequestMethod.GET, value = "/showForm")
public ModelAndView showForm(){
}

@RequestMapping(method=RequestMethod.GET, value = "/processAjaxRequest")
public ModelAndView processAjax(){

 ModelAndView modelAndView = new ModelAndView("page.jsp");  
 modelAndView.addObject("ajax_response", ajax_response);
     return modelAndView;
}
于 2012-08-07T06:51:39.253 に答える
1

AJAXの最良の方法などはありません。

どの方法を使うべきかは、建築様式によって異なります。RESTパラダイムとその最も一般的な実用的な解釈であるROA(Resource Oriented Architecture)は、HTTPメソッドのセマンティクスに関して特定の仮定を行います。これはますます人気のあるアプローチであり、読む価値があると思います。ただし、RESTの利点を最大限に活用するには、アプリのデザイン全体を再考する必要があります。この方法で行うことにした場合は、RESTfulアプリケーションのJava標準であるREST、ROA、およびJAX-RSを確認してください。その実装はSpringと統合できます。

または、最も広くサポートされているメソッドとして、GETとPOSTに固執することもできます。Spring自体に関しては、それを行うための合理的な方法は、AJAXベースのAPIを処理するために別のBean(またはおそらくBeanのセット)を提供することです。URLを変えておけば、メソッド「競合」は発生しません。

于 2012-08-05T18:26:01.777 に答える