我在使用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请求。如何修改此代码,以便为不同的AJAX请求提供不同的功能?
答案 0 :(得分:8)
首先,考虑当您从服务器检索数据而不修改该服务器的状态时,通常接受的标准是使用HTTP GET方法,而不是POST。因此,对于前两种方法,您滥用HTTP方法。
其次,您可以使用RequestMapping注释的value属性将各个URL模式映射到特定方法。
第三,表示帐户详细信息资源的最RESTful方式是使用PathVariable注释并在实际路径中包含您的识别值:
@RequestMapping(value="/account/{accountid}/details", method = RequestMethod.GET)
public @ResponseBody String getAccountDetails(@PathVariable(value="accountid") String accountid){
return somefunct.getAccountDetails(accountid);
}
接下来,您可以使用不同的网址格式来表示您的帐户摘要,其中网址就像树一样构建,其中路径的前两部分再次是“帐户”和accountid:
// 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。