JSP 表单标签动作属性 URI Spring MVC
JSP form tag action attribute URI Spring MVC
我有这样的控制器
@Controller
@RequestMapping("/pizza")
public class PizzaController {
@RequestMapping(value = "/", method = RequestMethod.GET)
public String viewPizzas(Model model) {
model.addAttribute("pizzas",
pizzaService.getAllPizzas());
return "pizzas";
}
@RequestMapping(value = "/create", method = RequestMethod.GET)
public String create() {
return "newpizza";
}
@RequestMapping(value = "/addnew", method = RequestMethod.POST)
public String addNewPizza(@ModelAttribute Pizza newPizza) {
pizzaService.addPizza(newPizza);
return "redirect:";
}
}
@RequestMapping(value = "/edit", method = RequestMethod.GET)
public String edit(@RequestParam("pizzaid") Long id,
Model model) {
if (id<=0) throw new IllegalArgumentException("ID<0");
Pizza pizza = pizzaService.getPizzaById(id);
if (pizza == null)
throw new NotFoundPizzaException("Pizza id" + id + " not found" );
model.addAttribute("pizza", pizza);
return "newpizza";
}
}
和JSP的:pizzas.jsp
<body>
<table border="1">
......................
<form method="get" action="edit" >
<input type="hidden" name="pizzaid" value="${pizza.id}" />
<input type="submit" value="Edit" />
</form>
</table>
<a href="create"> Create new pizza </a> <br/>
</body>
和newpizza.jsp
<body>
<form action="addnew" method="post">
<input type="hidden" name="id" value="${pizza.id}"/>
Name : <input type="text" name="name" value="${pizza.name}"/></br>
Type : <input type="text" name="type" value="${pizza.type}"/></br>
Price : <input type="text" name="price" value="${pizza.price}"/></br>
<input type="submit" value="Create"/></br>
</form>
</body>
这工作正常,直到我尝试更改控制器中的 URI,例如:
@RequestMapping(value = "/addnew/add", method = RequestMethod.POST)
@RequestMapping(value = "/edit/add", method = RequestMethod.GET)
并在表单标签中:
<form action="addnew/add" method="post">
<form action="edit/add" method="get">
我得到 HTTP Status 404
。我有一个问题:我应该如何使用 action
属性,才能有机会请求这样的映射 @RequestMapping(value = "/edit/add"
...
您最有可能的问题是,在您当前使用 action
属性的方式中,它被视为相对路径,并被添加到当前 url。根据浏览器中的当前 url,它们可能会或可能不会工作。
为避免这种情况,请在 action
属性中使用绝对路径,例如
<form action="${pageContext.request.contextPath}/pizza/addnew/add" method="post">
<form action="${pageContext.request.contextPath}/pizza/edit/add" method="get">
我有这样的控制器
@Controller
@RequestMapping("/pizza")
public class PizzaController {
@RequestMapping(value = "/", method = RequestMethod.GET)
public String viewPizzas(Model model) {
model.addAttribute("pizzas",
pizzaService.getAllPizzas());
return "pizzas";
}
@RequestMapping(value = "/create", method = RequestMethod.GET)
public String create() {
return "newpizza";
}
@RequestMapping(value = "/addnew", method = RequestMethod.POST)
public String addNewPizza(@ModelAttribute Pizza newPizza) {
pizzaService.addPizza(newPizza);
return "redirect:";
}
}
@RequestMapping(value = "/edit", method = RequestMethod.GET)
public String edit(@RequestParam("pizzaid") Long id,
Model model) {
if (id<=0) throw new IllegalArgumentException("ID<0");
Pizza pizza = pizzaService.getPizzaById(id);
if (pizza == null)
throw new NotFoundPizzaException("Pizza id" + id + " not found" );
model.addAttribute("pizza", pizza);
return "newpizza";
}
}
和JSP的:pizzas.jsp
<body>
<table border="1">
......................
<form method="get" action="edit" >
<input type="hidden" name="pizzaid" value="${pizza.id}" />
<input type="submit" value="Edit" />
</form>
</table>
<a href="create"> Create new pizza </a> <br/>
</body>
和newpizza.jsp
<body>
<form action="addnew" method="post">
<input type="hidden" name="id" value="${pizza.id}"/>
Name : <input type="text" name="name" value="${pizza.name}"/></br>
Type : <input type="text" name="type" value="${pizza.type}"/></br>
Price : <input type="text" name="price" value="${pizza.price}"/></br>
<input type="submit" value="Create"/></br>
</form>
</body>
这工作正常,直到我尝试更改控制器中的 URI,例如:
@RequestMapping(value = "/addnew/add", method = RequestMethod.POST)
@RequestMapping(value = "/edit/add", method = RequestMethod.GET)
并在表单标签中:
<form action="addnew/add" method="post">
<form action="edit/add" method="get">
我得到 HTTP Status 404
。我有一个问题:我应该如何使用 action
属性,才能有机会请求这样的映射 @RequestMapping(value = "/edit/add"
...
您最有可能的问题是,在您当前使用 action
属性的方式中,它被视为相对路径,并被添加到当前 url。根据浏览器中的当前 url,它们可能会或可能不会工作。
为避免这种情况,请在 action
属性中使用绝对路径,例如
<form action="${pageContext.request.contextPath}/pizza/addnew/add" method="post">
<form action="${pageContext.request.contextPath}/pizza/edit/add" method="get">