SpringMVC开发 知识点速查

SpringMVC入门

什么是SpringMVC

  • 实现MVC设计模式的框架

SpringMVC核心组件

  • DispatcherServlet 前置控制器,调度
  • Handler 处理器,完成具体业务逻辑
  • HandlerMapping 将请求映射到Handler,映射
  • HandlerInterceptor 处理器拦截器
  • HandlerExcutionChain 处理器执行链,拦截器
  • HandlerAdapter 处理器适配器,转换
  • ModelAndView 装载模型数据和视图信息
  • ViewResolver 视图解析器,渲染给客户端
SpringMVC实现流程
  1. 客户端请求被DispatcherServlet接收
  2. DispatcherServlet将请求映射到Handler
  3. 生成Handler和HandlerInterceptor
  4. 返回HandlerExecutionChain(Handler+HandlerInterceptor)
  5. DispatcherServlet通过HandlerAdapter执行Handler
  6. 返回一个ModelAndView
  7. DispatcherServlet通过ViewResolver进行解析
  8. 返回填充了模型数据的View,响应给客户端
image

SpringMVC深入使用

  • 只需手动编写handler,view
  • 基于XML配置的使用
    • SpringMVC基础配置
    • XML配置controller,HandlerMapping组件映射
    • XML配置VIewResolver组件映射
  • 基于注解
    • <component-scan>

开发步骤:

  • 配置web.xml
<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
  <display-name>Archetype Created Web Application</display-name>
<!-- 中文乱码 -->
  <filter>
    <filter-name>encodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
      <param-name>encoding</param-name>
      <param-value>UTF-8</param-value>
    </init-param>
    <init-param>
      <param-name>forceEncoding</param-name>
      <param-value>true</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>encodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
<!-- 防止静态资源被拦截 -->
  <servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>*.css</url-pattern>
  </servlet-mapping>
<!-- 加载springmvc配置,根据url分发请求 -->
  <servlet>
    <servlet-name>springmvc</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:springmvc.xml</param-value>
    </init-param>
  </servlet>
  <servlet-mapping>
    <servlet-name>springmvc</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>
  
</web-app>
  • 配置扫描注解
 <context:component-scan base-package="com.imooc.controller"></context:component-scan>
 
 <!-- jsp的view解析,返回的view名称不用再写.jsp -->
 <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/"></property>
        <property name="suffix" value=".jsp"></property>
    </bean>
  • 开始用注解@controller等等开发,返回值是ModelAndView

RESTful风格

  • REST:Representational State Transfer(表述性状态转移)
  • REST是一组架构约束和原则,符合这组约束和原则的架构就是REST架构
  • RESTful核心内容:
    • 资源URI
    • 资源表述:资源在客户端和服务器之间传输
    • 状态转移:资源在服务端变化
  • RESTful架构特点:
    • 统一了客户端访问资源的接口
    • url简介易懂易扩展
    • 有利于不同系统之间的资源共享
  • RESTful是HTTP的四种操作
    • GET获取
    • POST新建
    • PUT修改
    • DELETE删除
  • RESTful开发风格举例
  • 使用SpringMVC开发注意在web.xml配置支持PUT和DELETE
  <filter>
    <filter-name>hiddenHttpMethodFilter</filter-name>
    <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
  </filter>

  <filter-mapping>
    <filter-name>hiddenHttpMethodFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

SpringMVC数据绑定

  • 数据绑定:将HTTP请求中的参数绑定到Handler业务方法的形参
  • 原理:HandlerAdapter->HttpMessageConverter->Handler
  • 常用的数据绑定类型:
    • 基本数据类型 @RequestParam(value='form表单里的键名') int form表单里的键名
    • 包装类(可为null) @RequestParam(value='form表单里的键名') Integer form表单里的键名
    • 数组 String[] name
    • 对象 Course name
    • 集合(List, Set, Map)
      • List CourseList class CourseList{List<Course> courseList;}
      • Map CourseList class CourseMap{Map<String,Course> courses;}
      • Set CourseSet class CourseSet{Set<Course> courses;}
    • JSON @RequestBody支持JSON格式
  • @ResponseBody是字符串返回

SpringMVC拦截器和过滤器

SpringMVC拦截器和过滤器的区别

  • 拦截器是使用JDK动态代理实现的,拦截的是对应调用方法的拦截,属于Spring,可以用Spring特性。是面向切面编程(AOP)的一种运用。只能对controller请求进行拦截。多个拦截器执行顺序也是xml中顺序,preHandle顺序,postHandle和afterCompletion反序。
  • 过滤器是使用Filter实现的,拦截的是Request对象,依赖于servlet容器。多个过滤器的执行顺序跟xml文件中定义的先后关系有关
    执行顺序

拦截器

<!-- 拦截器的注册 -->
    <mvc:interceptors>

        <mvc:interceptor>
            <mvc:mapping path="/user/**"/>
            <bean class="com.imooc.core.LogInterceptor"></bean>
        </mvc:interceptor>

        <mvc:interceptor>
            <!--<mvc:mapping path="/user/search"/>
            <mvc:mapping path="/user/updatepwd"/>
            <mvc:mapping path="/user/updateheaderPic"/>-->
            <!--<mvc:mapping path="/user/*"></mvc:mapping>-->
            <!--包含子结构用**通配符-->
            <mvc:mapping path="/user/**"></mvc:mapping> 
            <!--exclude-mapping在所有拦截中进行排除,一般在通配符会有意义。-->
            <mvc:exclude-mapping path="/user/updatepwd"></mvc:exclude-mapping>
            <mvc:exclude-mapping path="/user/updatebackground/*"></mvc:exclude-mapping>
            <bean class="com.imooc.core.LoginInterceptor"></bean>
        </mvc:interceptor>
    </mvc:interceptors>

关于我:

linxinzhe,全栈工程师,目前供职于某世界500强银行的金融科技部门(人工智能,区块链)。

GitHub:https://github.com/linxinzhe

欢迎留言讨论,也欢迎关注我~
我也会关注你的哦!

推荐阅读更多精彩内容