一、控制器的介绍
控制器作为应用程序逻辑的处理入口,它会负责去调用你已经实现的一些服务。通常,一个控制器会接收并解析用户的请求,然后把它转换成一个模型交给视图,由视图渲染出页面最终呈现给用户。Spring对控制器的定义非常宽松,这意味着你在实现控制器时非常自由。
二、使用@Controller注解定义一个控制器
@Controller注解表明了一个类是作为一个控制器的角色存在的,可以认为是被标注类的原型。分配器(DispatcherServlet)会扫描所有注解了@Controller注解的类,检测其中通过@RequestMapping注解配置的方法。
需要在配置中加入组件扫描的配置代码来开启框架对注解控制器的自动检测。请使用下面 XML代码所示的spring-context schema:
<context:component-scan base-package="com.hlk.controller"/>
三、使用@RequestMapping注解映射请求路径
我们在上一篇文章中介绍过mvc框架是将url映射到整个Java类或某个特定的Java类的方法上。一般说来,类的注解负责将一个特定的请求路径映射到一个控制器上;方法的注解来细化映射,即根据特定的HTTP请求方法(“GET”“POST”方法等)以及HTTP请求中携带了特定的参数,将请求映射到匹配的方法上。
@Controller
public class BlogController {
@Autowired
BlogRepository blogRepository;
@Autowired
UserRepository userRepository;
// 查看所有博文
@RequestMapping(value = "/admin/blogs", method = RequestMethod.GET)
public String showBlogs(ModelMap modelMap) {
List<BlogEntity> blogList = blogRepository.findAll();
modelMap.addAttribute("blogList", blogList);
return "admin/blogs";
}
// 添加博文
@RequestMapping(value = "/admin/blogs/add", method = RequestMethod.GET)
public String addBlog(ModelMap modelMap) {
List<UserEntity> userList = userRepository.findAll();
// 向jsp注入用户列表
modelMap.addAttribute("userList", userList);
return "admin/addBlog";
}
// 添加博文,POST请求,重定向为查看博客页面
@RequestMapping(value = "/admin/blogs/addP", method = RequestMethod.POST)
public String addBlogPost(@ModelAttribute("blog") BlogEntity blogEntity) {
// 存库
blogRepository.saveAndFlush(blogEntity);
// 重定向地址
return "redirect:/admin/blogs";
}
//查看博文详情
@RequestMapping(value = "/admin/blogs/show/{id}",method = RequestMethod.GET)
public String showBlog(@PathVariable("id") int id,ModelMap modelMap) {
BlogEntity blogEntity = blogRepository.findOne(id);
modelMap.addAttribute("blog",blogEntity);
return "admin/blogDetail";
}
//修改博文内容
@RequestMapping("/admin/blogs/update/{id}")
public String updateBlog(@PathVariable("id") int id,ModelMap modelMap) {
BlogEntity blogEntity = blogRepository.findOne(id);
List<UserEntity> userList = userRepository.findAll();
modelMap.addAttribute("blog",blogEntity);
modelMap.addAttribute("userList",userList);
return "admin/updateBlog";
}
//修改博文内容,Post请求
@RequestMapping(value = "/admin/blogs/updateP",method = RequestMethod.POST)
public String updateBlogP(@ModelAttribute("blogP") BlogEntity blogEntity) {
blogRepository.updateBlog(blogEntity.getTitle(),blogEntity.getUserByUserId().getId(),
blogEntity.getContent(),blogEntity.getPubDate(),blogEntity.getId());
blogRepository.flush();
return "redirect:/admin/blogs";
}
//删除文章
@RequestMapping(value = "/admin/blogs/delete/{id}")
public String deleteBlog(@PathVariable("id") int id) {
blogRepository.delete(id);
blogRepository.flush();
return "redirect:/admin/blogs";
}
}
注:类级别的 @RequestMapping 注解并不是必须的。不配置的话则所有的路径都是绝对路径,而非相对路径。
上面很多地方都用到了@RequestMapping注解。其实我可以在类上直接作用一个/admin
也可以,因为下面所有的路径我都是指示了以/admin
开头的。其中方法上我又对GET和POST请求进行了细分。
上面的案例中,还使用了URI模板,这里给大家稍微介绍一下:
@RequestMapping("/admin/blogs/update/{id}")
public String updateBlog(@PathVariable("id") int id,ModelMap modelMap) {
BlogEntity blogEntity = blogRepository.findOne(id);
List<UserEntity> userList = userRepository.findAll();
modelMap.addAttribute("blog",blogEntity);
modelMap.addAttribute("userList",userList);
return "admin/updateBlog";
}
在这里,使用了URI模板,URI模板可以为快速访问 @RequestMapping 中指定的URL的一个特定的部分提供很大的便利。
比如说,一个这个URI模 板localhost:8080/Blog/admin/blogs/update/{id}
就包含了一个变量名id
。将值10赋给这个变量名后,它就变成了一个URI: localhost:8080/Blog/admin/blogs/update/10
。
在Spring MVC中你可以在方法参数上使用@PathVariable
注解,将其与URI模板中的参数绑定起来。
注:一个方法可以拥有任意数量的@PathVariable注解。