我有一个包含一些项目的数据库。我想创建一个表单,用于编辑带有某些ID的项目。我做到了,表格打开正常。地址是/ itemproject / edit_item / {id}当我尝试激活POST方法时,问题开始了。程序不是将我引导到带有项目列表(/ itemproject / view_items)的页面,而是将我发送到/ itemproject / edit_item / edit_item。 itemproject是上下文路径(例如)。

@RequestMapping(value = "/edit_item/{id}", method = RequestMethod.GET)
public String editItem(@PathVariable("id") Integer id, Model model) {
    Item item;
    item = dbService.findItem(item).get(0);
    model.addAttribute("item", item);
    return "edit_item";
}
@RequestMapping(value = "/edit_item/{id}", method = RequestMethod.POST)
public String editItemComplete(@PathVariable("id") Integer id, @ModelAttribute("item") Item item, Model model) {
    dbService.updateItem(item);
    model.addAttribute("items",dbService.findAllItems());
    return "view_items";
}


dbService与数据库一起使用。

我希望该程序在编辑所选项目并在数据库中对其进行更新后,将其发送给我所有项目的列表。
这是编辑表单的示例(网址:/ itemproject / edit_item / {id}

<spring:url value="edit_item" var="formURL"/>
            <form:form action="${formURL}"
                       method="post" cssClass="col-md-8 col-md-offset-2"
                       modelAttribute="item"
                       >
                <div class="form-group">
                    <label for="item-stuff">Stuff</label>
                    <form:input id="item-stuff"
                                cssClass="form-control"
                                path="stuff"/>
                </div>
                <button type="submit" class="btn btn-default">Edit item</button>
            </form:form>


这是我的商品列表页面的外观(网址:/ itemproject / view_items)

<body>
<table class="table table-hover">
            <tbody>
                <tr>
                    <th>Stuff</th>
                </tr>
                <c:forEach items="${items}" var="item">
                    <tr>
                        <td><a href="/itemproject/item/${item.id}">${item.stuff}</a></td>
                    </tr>
                </c:forEach>
            </tbody>
        </table>
</body>

最佳答案

从Spring文档:


  在Spring MVC中,您可以在方法上使用@PathVariable批注
  将其绑定到URI模板变量的值的参数


这意味着@PathVariable批注适用于使用GET方法的原因,因为使用GET方法时,您可以传递查询字符串。

而是尝试使用@RequestBody来尝试将POST HTTP正文消息绑定到您的参数

例如:

@RequestMapping(value = "/edit_item", method = RequestMethod.POST)
public String editItemComplete(@RequestBody String body) {
    //in here you'll have to pull the body content
    return "view_items";
}


假设您要在HTTP POST主体上发送一个Integer ID,然后可以像这样从主体中提取数据:

@RequestMapping(value = "/edit_item", method = RequestMethod.POST)
public String editItemComplete(@RequestBody String body) {
    ObjectMapper objectMapper = new ObjectMapper();
    try {
        idJson = objectMapper.readTree(body).path("id").asInt();
    } catch (IOException e) {
        e.printStackTrace();
    }
    return "view_items";
}


假设您要将json从客户端发送到服务。

10-06 09:17