【问题标题】:WARNING: Request method 'GET' not supported警告:不支持请求方法“GET”
【发布时间】:2013-04-12 09:48:58
【问题描述】:

在我的 Spring 应用程序中,我正在这样做..

我的Jsp表单点击超链接表单将被发送..

<form:form action="user" modelAttribute="NAME">

   <a href="href_form1" onclick="onClick_Save()" class="save">Save</a>

</fomr:form>
<script>
  function onClick_Save() {
    $("#NAME").attr("action", $('.save').attr("href"));
    $("#NAME").submit();
     });
</script>

在我的 Controller 类中,我编写了方法。

@RequestMapping(value = "href_form1", method = RequestMethod.POST)
public @ResponseBody String href_form1(UserForm userForm,Model model)throws Exception {
    //Database code here.       
    model.addAttribute("NAME", userForm);
    return "User Updated";
}

EDIT1:

WARNING: Request method 'GET' not supported

我收到错误页面。

HTTP Status 405 - Request method 'GET' not supported

编辑:修改如下代码后

   <script>
  $(function() {
   $('.save').on("click",function(e) {
     e.preventDefault();
     $("#NAME").attr("action", $(this).attr("href")).attr("method","POST");
     $("#NAME").submit();
   });
  });
</script>

但是我的表单不会到达我的控制器方法。

我的代码有什么问题吗?我也在表单标签中尝试过method="POST"

【问题讨论】:

    标签: java javascript spring jsp


    【解决方案1】:

    这是您收到错误的原因

    链接的href在点击时调用控制器,因为你没有取消链接的默认操作

    所以代码执行以下操作

    1. 尝试将表单的操作设置为链接的 href
    2. 尝试使用 POST 提交所述表单 - 据我了解,这是您想要实现的目标。
    3. 无论这是否成功,浏览器都会立即跟随链接的 href,它将尝试使用 GET 调用控制器,因为如果 onclick 没有停止该操作,链接将执行此操作。即使代码成功发布表单,该请求也会被最终执行 GET 的新请求杀死

    在我看来,您有以下几种可能性 - 其中一些被认为是比其他更好的做法。

    非javascript

    1. 有一个参数来保存您要保存的内容的标识 - 以及每个参数的表单
    2. 将您的 spring 方法更改为
      method = { RequestMethod.GET, RequestMethod.POST}
      method = RequestMethod.GET - GET 将允许您摆脱表单并仅具有以下链接(当然是在更新 spring 代码之后)李>
     <a href="href_link?user=user1">Save User1</a>
    

    如果你愿意

    JavaScript 辅助

    在表单中有一个参数来保存您要保存的标识,通过 JavaScript 设置它并执行 MANDATORY return falsepreventDefault 以取消链接:

    <!-- this is an example of the rendered form -->
    <form action="href_form1" id="NAME" method="POST">
      <input type="hidden" name="saveItem" id="saveItem" value="" />
    </form>  
    
    <a href="#" class="saveLink" data-save="save item 1">Save item 1</a>
    <a href="#" class="saveLink" data-save="save item 2">Save item 2</a>
    <a href="#" class="saveLink" data-save="save item 3">Save item 3</a>
    

    请注意,我在 href 中没有链接以避免请求某些内容

    与此过程相关的 jQuery:

    $(function() {
      // assuming form ID="NAME"
      $(".saveLink").on("click",function(e) { 
         e.preventDefault(); // do not follow link
         $("#saveItem").val($(this).data("save")); // set the hidden field
         $("#NAME").submit();
      });
    });
    

    假设您的弹簧控制器已连接以处理您的请求,这可能对您来说更有趣:

    DEMO

      $(function() {
       $('.save').on("click",function(e) { // passing event
         e.preventDefault(); // jQuery will normalise it for all modern browsers
         // post the href of the link to the server and return the result in a 
         // container with ID result
         $.post($(this).attr("href"), function(data) { // or $.get if you want
           $('#result').html(data);
         });
      });
    

    【讨论】:

    • 嗯,没有。你的第一个建议没有任何帮助,是不好的做法,并且没有解决所提出的问题。
    • @mplungjan 我建议了你的答案,我认为你熟悉javascript而不是spring ..无论如何我会放弃投票..
    • 返回 false 并不总能阻止事件的传播。使用 e 而不是 event 是 IE8 不兼容的。如果 preventDefault() 没有在 e 上定义(就像在许多旧浏览器中一样),您将遇到未知方法错误。在 JavaScript 中更改表单属性是一种糟糕的做法,完全不利于可读性。您已经分配了具有类属性的特定操作,而不是建议使用新的 id(您知道类和 id 之间的区别吗?)不知何故,我很难相信您多年来一直以这种方式编程作为您的个人资料说。
    • (e) 由 jQuery 规范化。我不想引起您试图煽动的个人巨魔,只是建议您在制作此类 cmets 之前检查一下 jQuery。在像 OP 这样的简单 html 中, return false 就可以了。我使用该类是因为 OP 显然有多个链接,并且使用上面的代码,每个链接都会在单击时将其 href 分配给表单。是的,我有超过 15 年的 JS 实践经验。
    • 我已经完成了对这个问题的回答和评论。每次你在这里回复都很有趣,你也(稍微)改进了你的答案。甚至什么都不会被接受。
    【解决方案2】:

    请尝试类似的方法

    <form:form action="href_form1" modelAttribute="NAME" method="POST">
      <input type="submit"/>
    </form:form>
    
    @RequestMapping(value = "href_form1", method = RequestMethod.POST)
    public @ResponseBody String href_form1(UserForm userForm,Model model)throws Exception {
        //Database code here.       
        model.addAttribute("NAME", userForm);
        return "User Updated";
    }
    

    基本上是一个非常简单的表单提交。一旦你得到这个工作,你就知道你的表单和控制器已经正确设置了。在此之后,如果您想使用锚标记提交表单,请返回之前的建议,preventDefault,然后提交表单。

    希望这会有所帮助。

    【讨论】:

      【解决方案3】:

      您需要在form 标签中指定method。是的,您的超链接忽略了表单。所以将表单上的action 属性设置为href_form1 并将您的超链接更改为提交输入,或者(我不会真的推荐)更改您的超链接以进行JavaScript 提交。目前,您在链接中有onclick href 设置。以下是最佳做法。

      <form:form action="href_form1" modelAttribute="NAME" method="POST">
          <input type="submit" value="Save" />
      

      此外,您的 jQuery 选择器 $("#NAME") 没有找到任何内容,因为您尚未在要获取的表单上设置 id 属性。

      【讨论】:

      • 我已经在再次尝试同样的问题。实际上我点击的是超链接而不是提交按钮,所以他们对这个有什么问题吗?
      • 修改答案以解决您的评论。也摆脱你的jQuery。您不需要它,而且无论如何它都不应该在 JSP 中。您应该针对不同的情况使用不同的表单元素,或者考虑重新设计您的应用程序。
      • 就像一个不了解 Spring 并且认为 JavaScript 可以解决所有问题的人一样。如果他需要发送特定的数据,那么他应该使用不同的表单参数并在Controller中进行处理。这就是创建 MVC 的确切原因,以分离这种东西。
      • 那么您是否有时间更新自己的现代技术,足以消除您对我的编程技能的反对意见和嘲笑?特别是因为我目前的建议中没有任何内容与您向控制器发送不同参数的建议不符
      • 我会接受 jQuery 确实使用了具有任意名称的完全跨浏览器事件对象。曾经有一段时间没有,谨慎很重要。除此之外,我之前的所有观点仍然有效,您仍然会投反对票。您甚至没有看到您的 jQuery $.post() 建议完全忽略了 Spring 表单吗? jQuery 不是这个问题中唯一标记的东西,它肯定不是问题的解决方案。
      【解决方案4】:

      表单提交的默认http方法是GET。既然你想要 POST,请指定它,它会起作用 method="POST"

      我也没有在代码中正确看到 url 映射。请确认是否正确。

      【讨论】:

      • 正确但如果我们提到 method="POST" .. 将无法正常工作.. 我的请求映射也正确吗?我正在编辑源代码。
      • 如果使用 firefox 然后使用 firebug 或在 chrome 中按 F12 并转到网络部分以查看最终形成的 url。
      • 感谢重播。我正在使用@mplungjan java 脚本建议,但表单不会发送,实际上我正在使用 Eclipse 调试透视图。
      • 请在您落实我们提出的各种建议后更新最新的代码。
      • 即使在添加method="POST" 之后,也只是因为他有一个href 属性集被遵循而不是被忽略。这和 action 属性没有改变,因为 JavaScript 没有正确引用表单,因为它没有 id 属性。