我在将 AJAX 与 Spring MVC 结合使用时遇到了问题。我有一个包含很多字段的表单,每个字段根据单击的关联按钮检索数据。
因此,我的每个按钮都需要调用 AJAX 请求。每个响应都将显示在相关字段上。
我想知道是否可以在我单击不同的按钮后在我的 Spring Controller 中调用不同的方法?
换句话说,我想向同一个 Controller 发出多个 ajax 请求,其中每个请求将调用同一个 Controller 中的不同方法。
看这个例子:
// 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 请求。如何修改此代码,以便我可以针对不同的 AJAX 请求提供不同的功能?
最佳答案
首先,请考虑当您在不修改服务器状态的情况下从服务器检索数据时,普遍接受的标准是使用 HTTP GET 方法,而不是 POST。因此,对于前两种方法,您滥用了 HTTP 方法。
其次,您可以使用 RequestMapping 注释的值属性将各个 URL 模式映射到特定方法。
第三,表示帐户详细信息资源的最 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 模式表示您的帐户摘要,其中 URL 构建得像一棵树,其中路径的前两部分再次是“帐户”和帐户 ID:
// 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 方法是 HTTP POST 方法。替换集合时,HTTP 方法 PUT 是普遍接受的选择方法。
PUT 和 POST 之间的另一个区别因素是 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 的更多信息,请查看 Spring documentation on Spring MVC .
关于java - Ajax 请求 - 在 Spring Controller 上调用不同的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10561116/