Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
REST、SpringMVC3和使用AJAX的PUT请求_Ajax_Spring_Spring Mvc - Fatal编程技术网

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;
    }
    
完成后,我想让用户保持在同一屏幕上,让表单触发PUT而不是POST。这很好,我可以通过jQuery实现这一点,但只要我再次提交表单,客户机就不再位于
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请求
这对我有用。利用Knockout.JS也有很大帮助


再次感谢

我认为你仍然需要那个隐藏字段。不,没有必要每次都放置额外的隐藏字段。Spring本身就是这样做的。