3

在我的 Spring Application 中,我正在这样做..

我的 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";
}

编辑1:

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"过使用表单标签。

4

4 回答 4

1

这是您收到错误的原因

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

所以代码执行以下操作

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

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

非javascript

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

如果你愿意

JavaScript 辅助

在表单中有一个参数,用于保存您要保存的标识,通过 JavaScript 设置 THAT 并执行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();
  });
});

假设您的弹簧控制器已连接以处理您的请求,这可能是一种更有趣的方式:

演示

  $(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);
     });
  });
于 2013-04-19T04:32:08.877 回答
1

请尝试这样的事情

<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然后提交表单。

希望这可以帮助。

于 2013-04-20T19:53:18.173 回答
1

您需要methodform标签中指定。是的,您的超链接忽略了表单。因此action,将表单上的属性设置为href_form1并将您的超链接更改为提交输入,或者(我真的不推荐这样做)更改您的超链接以进行 JavaScript 提交。目前,您已经在链接中进行了设置onclick href下面是最佳实践。

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

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

于 2013-04-19T04:34:11.577 回答
0

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

此外,我在代码中看不到正确的 url 映射。你能否确认它是否正确。

于 2013-04-19T04:32:18.457 回答