Imooc 上课总结(Java)-- Spring MVC(非公开)

课程链接:https://www.imooc.com/learn/47

课程源码:lesson_imooc_springMVC

1. MVC 简介

  • Front Controller :分发调度
  • View Template:页面呈现
  • Controller:业务数据抽取
  •  MVC的核心思想:业务数据抽取同业务数据呈现相分离

1.1. MVC: Model - View - Controller

  • View :视图层,为用户提供 UI,重点关注数据的呈现
  • Model:模型层,业务数据的信息表示,关注支撑业务的信息构成,通常是过个业务实体的组合。
  • Contoller:控制层,调用业务逻辑产生合适的数据(Model);传递数据给视图层用于呈现

   MVC 是一种架构模式:程序分层,分工合作,既相互独立,又协同工作

 MVC 是一种思考方式:M:需要将什么信息展示给用户?V:如何布局?C:调用哪些业务逻辑?


 2. Spring MVC 基本概念(class003)

2.1 Spring MVC 基本概念

     --> 更详细的:                  

   1) DispatcherServlet:< == > Front Controller

      2) Controller 

         HandlerAdapter -- Controller 的一个表现形式

   3)HandlerInterceptor -- 拦截器(接口),可以在调用controller之前,调用controller之后,最终的view 呈现之后

boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception;

void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception;

void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception;

preHandle:在业务处理器处理请求之前被调用。预处理,可以进行编码、安全控制、权限校验等处理;
postHandle:在业务处理器处理请求执行完成后,生成视图之前执行。后处理(调用了Service并返回ModelAndView,但未进行页面渲染),有机会修改ModelAndView ;
afterCompletion:在DispatcherServlet完全处理完请求后被调用,可用于清理资源等。返回处理(已经渲染了页面);

 4)HandlerMapping:DispatcherServlet 与 Controller 之间映射的类

   (1) Help DispatchServlet to get the right controller;

   (2) Wrap controller with HandleInterceptor;

    5)  HandlerExecutionChain

    preHandle -> Controller method -> postHandle -> afterCompletion

    6)ModelAndView: ------- Model的一种表现形式。

          model 有三种形式:Model,map 和 ModelAndView。

          如果有人用 Model 和 Map, DispatcherServlet 会将其转换成 ModelAndView

 7)ViewResolver:视图解释器

 8)View:呈现页面 


 3. 用Spring MVC 进行开发(class004)

Spring MVC 的上下文层级

<!-- Spring 应用上下文,理解层次化的 ApplicationContext -->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>WEB-INF/configs/spring/applicationContext*.xml</param-value>
    </context-param>

    <!-- 对应于 Spring MVC 上下文层级图的 WebApplicationContext(s),提供了应用的公共组件及服务 -->
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    <!-- DispatcherServlet, Spring MVC 的核心 -->
    <servlet>
        <servlet-name>mvc-dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!-- DispatcherServlet 对应的上下文配置,默认为 /WEB-INF/$servlet-name$-servlet.xml
        -->
        <!-- 对应于 Spring MVC 上下文层级图的 WebApplicationContext,特定的某个应用 -->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/configs/spring/mvc-dispatcher-servlet.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    
    <servlet-mapping>
        <servlet-name>mvc-dispatcher</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

3.1 Controller

      1) 使用 @Controller 声明一个 controller

      2) 使用 @RequestMapping 来映射 URL 和 方法。其标记经常出现在 类级别 和 方法级别。两者共同组合完成对一个 URL 请求的拦截

      3)通过 URL Template (结合 使用 @RequestParam 和 @PathVariable 标记),可以将 URL 路径中的参数,绑定到 Controller method,入参

            即 someUrl/{paramId}, 这时的paramId可通过 @Pathvariable注解绑定它传过来的值到方法的参数上。

      4)通过 HttpServletRequest and/or HttpSession 这类的对象来获取想要的结果

/**
     * 方式一(传统样式):本方法处理 /courses/view?courseId={courseId}
     * viewCourse(@RequestParam => 设置传参
     */
    @RequestMapping(value = "/view", method = RequestMethod.GET)
    public String viewCourse(@RequestParam("courseId") Integer courseId, Model model) {
        logger.debug("In viewCourse, courseId = {}", courseId);
        Course course = courseService.getCourseById(courseId);
        model.addAttribute(course);
        return "course_overview";
    }

    /**
     * 方式二(REST风格):本方法处理REST风格的URL /courses/view2/{courseId}
     */
    @RequestMapping(value = "viewrest/{courseId}", method = RequestMethod.GET)
    public String viewCourseRest(@PathVariable("courseId") Integer courseId, Map<String, Object> model) {
        logger.debug("In viewCourseRest, courseId = {}", courseId);
        Course course = courseService.getCourseById(courseId);
        model.put("course", course);
        return "course_overview";
    }

    /**
     * 方式三(传统样式的 HttpServletRequest):本方法处理传统的 Servlet 的 URL /courses/view3?courseId={courseId}
     */
    @RequestMapping("viewservlet")
    public String viewCourseServlet(HttpServletRequest request) {
        Integer courseId = Integer.valueOf(request.getParameter("courseId"));
        Course course = courseService.getCourseById(courseId);
        request.setAttribute("course", course);
        return "course_overview";
    }

3.2 Binding

    将请求中的字段按照名字匹配的原则填入模型对象。

  1)ModelAttribute on Method 

           在 controller 的参数上,通过 ModelAttribute 实现模型对象和数据的绑定

       2)redirect/forward 重定向 和转发

      

       3.3 单文件上传


 4.  Spring MVC 全局

  • 宏观:   
  • 中观:
  • 微观:基本的 Controller 编写

      数据绑定

      文件上传

      JSON协同

 

posted on 2020-09-01 14:00  bruce_he  阅读(6)  评论(0编辑  收藏  举报