REST、SpringMVC3和使用AJAX的PUT请求
我想我更多的是寻求建议,而不是任何特定的编码解决方案。以下是场景:REST、SpringMVC3和使用AJAX的PUT请求,ajax,spring,spring-mvc,Ajax,Spring,Spring Mvc,我想我更多的是寻求建议,而不是任何特定的编码解决方案。以下是场景: 我有一个可以创建新用户的表单 通过Spring控制器的GET请求访问此表单 @RequestMapping(value = "/secure/clients", method = RequestMethod.GET) public String prepareNewClient(final Principal principal, final ModelMap map) { map.addAttribute("clie
- 我有一个可以创建新用户的表单
- 通过Spring控制器的GET请求访问此表单
@RequestMapping(value = "/secure/clients", method = RequestMethod.GET) public String prepareNewClient(final Principal principal, final ModelMap map) { map.addAttribute("client", new Client()); return "secure/clients"; }
@RequestMapping(value = "/secure/clients", method = RequestMethod.POST) public @ResponseBody JsonResponse saveClient( @ModelAttribute("client") final Client client, final BindingResult result, final Principal principal, final ModelMap map) { // validate input // save client // prepare JsonResponse object return jsonResponse; }
- 表单已经呈现,一切正常,我使用
$.ajax({})
- 提交触发了一个POST请求,该请求使用相同的URL指向我的控制器上的以下方法
@RequestMapping(value = "/secure/clients", method = RequestMethod.GET) public String prepareNewClient(final Principal principal, final ModelMap map) { map.addAttribute("client", new Client()); return "secure/clients"; }
@RequestMapping(value = "/secure/clients", method = RequestMethod.POST) public @ResponseBody JsonResponse saveClient( @ModelAttribute("client") final Client client, final BindingResult result, final Principal principal, final ModelMap map) { // validate input // save client // prepare JsonResponse object return jsonResponse; }
ModelMap
上
我甚至尝试过将保存的客户端添加到POST方法的ModelMap
,但即使这样也不起作用
我不完全确定我的做法是否正确。老实说,我看过的每个教程都或多或少地使用了我正在做的内容,但是没有一个教程有PUT请求,主要是处理对象的创建,我没有这个问题
我想到的是,我可能需要一个控制器方法映射到/secure/clients/{clientId}
,使用HTTP.GET
和另一个控制器方法映射/secure/clients/{clientId}
,使用HTTP.PUT
但我不确定这是否有意义,所以我有点迷路了
- 我应该完全根据JSON调用创建控制器吗
- 在这个场景中,我是否应该重定向用户并忘记AJAX调用
我们非常感谢您的建议。谢谢大家! HttpMethod不受web浏览器的支持。当两个应用程序使用Restfull API时,PUT requesr工作得很好,但为了浏览器兼容性,最好限制自己发布或获取请求 您还可以在表单中放置override参数,以指示web服务器按照所需的方法处理post
将完成这项工作
Spring sf名称空间为您处理该隐藏字段
<sf:form method="put">
....
</sf:form>
....
此外,您可以使用restclient ui测试控制器,看看问题是来自Web服务器还是客户端。我同意@Daniel的说法
但是您可以使用春季提供的hiddenhttmpmethodfilter。那会使你的工作容易些。您不再需要每次都放置隐藏的字段
希望这有帮助。干杯。@Daniel和@Japan非常感谢您的回答 我想你说的是@Daniel和我最终跳出了框框,换了一种思维方式——效果很好 给你一个想法:
- 插入新客户端时,我实际上会刷新浏览器,而不是停留在页面上
- 调用函数后,用户被重定向到/secure/clients/{clientId}
- 从那里开始,映射一个新函数以及一个新的POST请求
再次感谢 我认为你仍然需要那个隐藏字段。不,没有必要每次都放置额外的隐藏字段。Spring本身就是这样做的。