I'm trying out Spring MVC 3.0 for the first time and like to make it RESTfull.
This is my controller:
@Co开发者_高级运维ntroller
@RequestMapping(value = "/product")
@SessionAttributes("product")
public class ProductController {
@Autowired
private ProductService productService;
public void setProductValidator(ProductValidator productValidator, ProductService productService) {
this.productService = productService;
}
@RequestMapping(method = RequestMethod.GET)
public Product create() {
//model.addAttribute(new Product());
return new Product();
}
@RequestMapping(method = RequestMethod.POST)
public String create(@Valid Product product, BindingResult result) {
if (result.hasErrors()) {
return "product/create";
}
productService.add(product);
return "redirect:/product/show/" + product.getId();
}
@RequestMapping(value = "/show/{id}", method = RequestMethod.GET)
public Product show(@PathVariable int id) {
Product product = productService.getProductWithID(id);
if (product == null) {
//throw new ResourceNotFoundException(id);
}
return product;
}
@RequestMapping(method = RequestMethod.GET)
public List<Product> list()
{
return productService.getProducts();
}
}
I have 2 questions about this.
I'm a believer in Convention over Configuration and therefor my views are in jsp/product/ folder and are called create.jsp , list.jsp and show.jsp this works relatively well until I add the @PathVariable attribute. When I hit root/product/show/1 I get the following error: ../jsp/product/show/1.jsp" not found how do I tell this method to use the show.jsp view ?
If I don't add the RequestMapping on class level my show method will be mapped to root/show instead of root/owner/show how do I solve this ? I'd like to avoid using the class level RequestMapping.
add your 'product' to Model
and return a String /product/show
instead of Product
. In your show.jsp
, you can access the product object form pageContext
Check out the section in the manual about "Supported handler method arguments and return types".
Basically, when your @RequestMapping
method returns just an object, then Spring uses this as a single model attribute, and, I'm guessing, attempts to use the request URL as the basis for the view name.
The easiest way to return the view and data you want from the same method is probably to just have the method return a ModelAndView
, so you can explicitly specify the viewName and the model data.
精彩评论