返回介绍

3.2 控制器设计

发布于 2025-04-26 13:26:32 字数 4298 浏览 0 评论 0 收藏

怎样将视图上的操作与模型——数据管理模块联系起来,这中间始终是控制器在起着通信桥梁的作用,它响应视图上的操作事件,然后根据需要决定是否访问数据管理模块,最后再将结果返回给合适的视图,由视图处理显示。下面将按照电影控制器的设计来说明控制器中增删查改的实现方法,演员控制器的设计与此类似,不再赘述。

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。