@Controller
@RequestMapping("/user")
public class UserController {
private UserRepository userRepository;
@Autowired
public UserController(UserRepository userRepository) {
this.userRepository = userRepository;
}
/**
* @param username
* @return 根据user从持久层获取用户信息, username==null则返回一个新的user对象,否则从持久层加载User的信息
*/
@ModelAttribute("user")
public User loadModel(@RequestParam(value = "username", required = false) String username) {
return username == null ? createUser() : userRepository.loadUserByUsername(username);
}
/**
* @return 当username未提供时, 将返回一个新的User对象,
* 因为模型在调用了{@link UserController#loadModel} 方法之后,
* {@link org.springframework.web.method.annotation.ModelAttributeMethodProcessor}不会再为{@link UserController#save(com.feexon.domain.User)}方法创建User实例
*/
private User createUser() {
return new User();
}
/**
* 设置@ModelAttribute("user")绑定的属性,其他属性将被忽略
*
* @param binder
*/
@InitBinder("user")
public void setBindingProperties(DataBinder binder) {
binder.setAllowedFields("password");
}
@RequestMapping("/save")
@ResponseBody
public User save(@ModelAttribute("user") User user) {
if (hasRegistered(user)) {
userRepository.saveUser(user);
}
return user;
}
/**
* 当user未注册时,{@link UserController#loadModel(java.lang.String)}返回的值为null.
*
* @param user
* @return
*/
private boolean hasRegistered(User user) {
return user != null;
}
}
本文深入探讨了Spring MVC框架中的Controller组件,包括如何使用注解如@Controller、@RequestMapping等进行路由映射,以及如何通过ModelAndView进行视图跳转。详细介绍了Controller组件在处理HTTP请求、获取和验证参数、调用业务逻辑和服务层、处理异常以及返回响应等方面的功能。此外,还阐述了如何在Controller中使用@ModelAttribute注解进行参数绑定和数据验证,以及如何在不同场景下使用不同的数据绑定策略。
376

被折叠的 条评论
为什么被折叠?



