- 前言
- 第一部分 基础应用开发
- 第 1 章 Spring Boot 入门
- 第 2 章 在 Spring Boot 中使用数据库
- 第 3 章 Spring Boot 界面设计
- 第 4 章 提高数据库访问性能
- 第 5 章 Spring Boot 安全设计
- 第二部分 分布式应用开发
- 第 6 章 Spring Boot SSO
- 第 7 章 使用分布式文件系统
- 第 8 章 云应用开发
- 第 9 章 构建高性能的服务平台
- 第三部分 核心技术源代码分析
- 第 10 章 Spring Boot 自动配置实现原理
- 第 11 章 Spring Boot 数据访问实现原理
- 第 12 章 微服务核心技术实现原理
- 附录 A 安装 Neo4j
- 附录 B 安装 MongoDB
- 附录 C 安装 Redis
- 附录 D 安装 RabbitMQ
- 结束语
3.2 控制器设计
怎样将视图上的操作与模型——数据管理模块联系起来,这中间始终是控制器在起着通信桥梁的作用,它响应视图上的操作事件,然后根据需要决定是否访问数据管理模块,最后再将结果返回给合适的视图,由视图处理显示。下面将按照电影控制器的设计来说明控制器中增删查改的实现方法,演员控制器的设计与此类似,不再赘述。
3.2.1 新建控制器
接收新建电影的请求,以及输入一部电影的数据后的最后提交,由新建控制器进行处理。在控制器上将执行两个操作,第一个操作将返回一个新建电影的视图,第二个操作接收界面中的输入数据,并调用数据管理模块进行保存,如代码清单 3-4 所示。其中,create 函数将返回一个新建电影的视图,它不调用数据管理模块,save 函数将需要保存的数据通过调用数据管理模块存储至数据库中,并返回一个成功标志。注意,为了简化设计,将电影剧照的图片文件做了预定义处理。
代码清单 3-4 新建电影控制器
@RequestMapping("/new") public ModelAndView create(ModelMap model){ String[] files = {"/images/movie/西游记 .jpg","/images/movie/西游记续集 .jpg"}; model.addAttribute("files",files); return new ModelAndView("movie/new"); } @RequestMapping(value="/save", method = RequestMethod.POST) public String save(Movie movie) throws Exception{ movieRepository.save(movie); logger.info("新增 ->ID={}", movie.getId()); return "1"; }
3.2.2 查看控制器
查看一个电影的详细信息时,控制器首先使用请求的电影 ID 向数据管理模块请求数据,然后将取得的数据输出到一个显示视图上,如代码清单 3-5 所示。
代码清单 3-5 查看电影控制器
@RequestMapping(value="/{id}") public ModelAndView show(ModelMap model, @PathVariable Long id) { Movie movie = movieRepository.findOne(id); model.addAttribute("movie",movie); return new ModelAndView("movie/show"); }
3.2.3 修改控制器
若要实现对电影的修改及保存操作,需要先将电影的数据展示在视图界面上,然后接收界面的操作,调用数据管理模块将更改的数据保存至数据库中,如代码清单 3-6 所示。其中,为了简化设计,将剧照中的图片文件和电影角色名称做了预定义处理。修改数据时,由于从界面传回的电影对象中,丢失了其角色关系的数据(这是 OGM 的缺点),所以再次查询一次数据库,以取得一个电影的完整数据,然后再执行修改的操作。
代码清单 3-6 修改电影控制器
@RequestMapping(value="/edit/{id}") public ModelAndView update(ModelMap model, @PathVariable Long id){ Movie movie = movieRepository.findOne(id); String[] files = {"/images/movie/西游记 .jpg","/images/movie/西游记续集 .jpg"}; String[] rolelist = {"唐僧 ","孙悟空 ","猪八戒 ","沙僧 "}; Iterable<Actor> actors = actorRepository.findAll(); model.addAttribute("files",files); model.addAttribute("rolelist",rolelist); model.addAttribute("movie",movie); model.addAttribute("actors",actors); return new ModelAndView("movie/edit"); } @RequestMapping(method = RequestMethod.POST, value="/update") public String update(Movie movie, HttpServletRequest request) throws Exception{ String rolename = request.getParameter("rolename"); String actorid = request.getParameter("actorid"); Movie old = movieRepository.findOne(movie.getId()); old.setName(movie.getName()); old.setPhoto(movie.getPhoto()); old.setCreateDate(movie.getCreateDate()); if(!StringUtils.isEmpty(rolename) && !StringUtils.isEmpty(actorid)) { Actor actor = actorRepository.findOne(new Long(actorid)); old.addRole(actor, rolename); } movieRepository.save(old); logger.info("修改 ->ID="+old.getId()); return "1"; }
3.2.4 删除控制器
删除电影时,从界面上接收电影的 ID 参数,然后调用数据管理模块将电影删除,如代码清单 3-7 所示。
代码清单 3-7 删除电影控制器
@RequestMapping(value="/delete/{id}",method = RequestMethod.GET) public String delete(@PathVariable Long id) throws Exception{ Movie movie = movieRepository.findOne(id); movieRepository.delete(movie); logger.info("删除 ->ID="+id); return "1"; }
3.2.5 分页查询控制器
列表数据的查询使用分页的方法,按提供的查询字段参数、页码、页大小及其排序字段等参数,通过调用数据管理模块进行查询,然后返回一个分页对象 Page,如代码清单 3-8 所示。这里的分页查询调用了 3.1.3 节定义的分页查询服务类。
代码清单 3-8 电影分页查询控制器
@RequestMapping(value="/list") public Page<Movie> list(HttpServletRequest request) throws Exception{ String name = request.getParameter("name"); String page = request.getParameter("page"); String size = request.getParameter("size"); Pageable pageable = new PageRequest(page==null? 0: Integer.parseInt(page), size==null? 10:Integer.parseInt(size), new Sort(Sort.Direction.DESC, "id")); Filters filters = new Filters(); if (!StringUtils.isEmpty(name)) { Filter filter = new Filter("name", name); filters.add(filter); } return pagesService.findAll(Movie.class, pageable, filters); }
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论