Spring MVC:@PathVariable表单

时间:2017-06-12 14:40:22

标签: java spring

我有一个包含一些项目的数据库。我想创建一个用一些id编辑项目的表单。我做到了,表格打开很好。地址是/ itemproject / edit_item / {id}当我尝试激活POST方法时,问题就开始了。而不是将我引导到带有项目列表的页面(/ itemproject / view_items),programm将我发送到/ 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适用于数据库。

我希望该程序在编辑所选项目并在数据库中更新后将我发送到所有项目的列表。 以下是编辑表单的示例(url:/ 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>

这是我的项目列表页面的样子(url:/ 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>

2 个答案:

答案 0 :(得分:0)

来自Spring docs:

  

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

的值的参数

这意味着当您使用GET方法时@PathVariable注释是合适的,因为当您使用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。

答案 1 :(得分:0)

您可以返回view_items而不是加载项目并返回"redirect:/itemproject/view_items"模板,这将导致调用view_items的处理程序,这将加载项目等。< / p>