5

Spring MVC での AJAX の使用に関して問題が発生しています。多くのフィールドを持つフォームがあり、各フィールドは、クリックされた関連ボタンに応じてデータを取得します。

したがって、ボタンのそれぞれが AJAX リクエストを呼び出す必要があります。各回答は、関連するフィールドに表示されます。

別のボタンをクリックすると、Spring コントローラーで別のメソッドを呼び出すことができるのでしょうか?

つまり、同じコントローラーに対して複数の ajax リクエストを作成し、各リクエストが同じコントローラー内の異なるメソッドを呼び出すようにしたいと考えています。

この例を参照してください:

    // when get account detail is clicked it will call this method  
@RequestMapping(method=RequestMethod.POST)  
    public @ResponseBody String getAccountDetails(@RequestParam(value="accountid") String accountid){  

     return somefunct.getAccountDetails(accountid);  

    }  



// when get account summary is clicked it will call this method  
@RequestMapping(method=RequestMethod.POST)  
    public @ResponseBody String getAccountSummary(@RequestParam(value="accountid") String accountid){  

      return somefunct.getAccountSummary(accountid);  

    }  



/* when submit button is clicked... Form is submitted for saving*/  
@RequestMapping(method=RequestMethod.POST)  
    public String submitForm(){  
        // save here  
        return "myform";  
    };*/  

現在、AJAX リクエストは 1 つしか持てません。このコードを変更して、さまざまな AJAX 要求に対してさまざまな機能を持たせるにはどうすればよいですか?

4

1 に答える 1

8

まず、サーバーの状態を変更せずにサーバーからデータを取得する場合、一般的に受け入れられている標準は、POSTではなくHTTPGETメソッドを使用することであると考えてください。したがって、最初の2つのメソッドでは、HTTPメソッドを誤用しています。

次に、RequestMappingアノテーションのvalueプロパティを使用して、個々のURLパターンを特定のメソッドにマップできます。

第3に、アカウント詳細リソースを表す最もRESTfulな方法は、PathVariableアノテーションを使用し、実際のパスに識別アカウントIDを含めることです。

@RequestMapping(value="/account/{accountid}/details", method = RequestMethod.GET)
public @ResponseBody String getAccountDetails(@PathVariable(value="accountid") String accountid){  

 return somefunct.getAccountDetails(accountid);  

}  

次に、URLがツリーのように構築され、パスの最初の2つの部分が再び「Account」とaccountidである別のURLパターンを使用して、アカウントの概要を表すことができます。

// when get account summary is clicked it will call this method  
@RequestMapping(value="/account/{accountid}/summary", method=RequestMethod.GET)  
public @ResponseBody String getAccountSummary(@PathVariable(value="accountid") String accountid){  

    return somefunct.getAccountSummary(accountid);  

}  

一方、送信方法には副作用があります。これは、このリクエストの終了時にサーバーの状態が異なり、そのリソースに対して行われるGETリクエストは、変更前とは異なることを示すための空想的な言い方です。リソースを変更したり、コレクションにリソースを追加したりするときに使用する適切なHTTPメソッドは、HTTPPOSTメソッドです。コレクションを置き換える場合、HTTPメソッドPUTが一般的に受け入れられている方法です。

PUTとPOSTのもう1つの差別化要因は、PUTがべき等であるということです。つまり、同じ要求を何度も繰り返しても、サーバーの状態は変更されません。同じリクエストを複数回ヒットすると、より多くのレコードが作成される場合は、POSTを使用してください。

最後に、このリクエストはURLにマッピングすることもできます。以下の例では、新しいアカウントレコードを作成し、データベース内のアカウントのコレクションに新しいレコードを挿入していると想定しています。したがって、私はPOSTを使用しました。また、PathVariableを使用してURLパスからaccountidを取得するようにパラメーターリストを変更し、リクエストの本文でオブジェクトを送信できるようにRequestBodyアノテーションを追加しました。これは、Javaオブジェクトに逆シリアル化できます。

/* when submit button is clicked... Form is submitted for saving*/  
@RequestMapping(value="/account/{accountid}", method=RequestMethod.POST)  
    public String submitForm(@PathVariable String accountid, @RequestBody Account account){  
        // save here  
        return "myform";  
}

Spring MVCの詳細については、SpringMVCに関するSpringのドキュメントを確認してください。

于 2012-05-12T05:15:19.863 に答える