SpringMVC一

SpringMVC一

SpringMVC是什么?

  • SpringMVC 是一种基于 Java 的实现 MVC 设计模型的请求驱动类型的轻量级 Web 框架,属于 Spring FrameWork 的后续产品,已经融合在 Spring Web Flow 里面。Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块。使用 Spring 可插入的 MVC 架构,从而在使用 Spring 进行 WEB 开发时,可以选择使用 Spring的 Spring MVC 框架或集成其他 MVC 开发框架。
  • SpringMVC 已经成为目前最主流的 MVC 框架之一。
  • 它通过一套注解,让一个简单的 Java 类成为处理请求的控制器,而无须实现任何接口。同时它还支持RESTful 编程风格的请求。

SpringMVC 和 Struts2 的优略分析

  • 共同点:
    1. 它们都是表现层框架,都是基于 MVC 模型编写的。
    2. 它们的底层都离不开原始 ServletAPI。
    3. 它们处理请求的机制都是一个核心控制器。
  • 区别:
    1. Spring MVC 的入口是 Servlet, 而 Struts2 是 Filter
    2. Spring MVC 是基于方法设计的,而 Struts2 是基于类,Struts2 每次执行都会创建一个动作类。所以 Spring MVC 会稍微比 Struts2 快些。
    3. Spring MVC 使用更加简洁,同时还支持 JSR303, 处理 ajax 的请求更方便

基本步骤

  1. 配置一个前端控制器

    <servlet>
        <servlet-name>SpringMVCDispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
            <!-- 配置初始化参数,用于读取 SpringMVC 的配置文件 --> 
            <init-param> 
                <param-name>contextConfigLocation</param-name> 
                <param-value>classpath:SpringMVC.xml</param-value>
            </init-param>
            <!-- 配置 servlet 的对象的创建时间点:应用加载时创建。取值只能是非 0 正整数,表示启动顺序 --> 
            <load-on-startup>1</load-on-startup>
    </servlet> 
    <servlet-mapping> 
        <servlet-name>SpringMVCDispatcherServlet</servlet-name> 
        <url-pattern>/</url-pattern>
    </servlet-mapping>
  2. 配置视图解析器

    <bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/pages/"></property>
        <property name="suffix" value=".jsp"></property>
    </bean>
  3. 配置对应的controller类

  4. 在对应的html或者jsp中进行使用


SpringMVC中的一些组件

  1. DispatcherServlet:前端控制器

    • 用户请求到达前端控制器,它就相当于 mvc 模式中的 c,dispatcherServlet 是整个流程控制的中心,由它调用其它组件处理用户的请求,dispatcherServlet 的存在降低了组件之间的耦合性。
  2. HandlerMapping:处理器映射器

    • HandlerMapping 负责根据用户请求找到 Handler 即处理器,SpringMVC 提供了不同的映射器实现不同的映射方式,例如:配置文件方式,实现接口方式,注解方式等。
  3. Handler:处理器

    • 它就是我们开发中要编写的具体业务控制器。由DispatcherServlet 把用户请求转发到 Handler。由Handler 对具体的用户请求进行处理。
  4. HandlAdapter:处理器适配器

    • 通过 HandlerAdapter 对处理器进行执行,这是适配器模式的应用,通过扩展适配器可以对更多类型的处理器进行执行。
  5. View Resolver:视图解析器

    • View Resolver 负责将处理结果生成 View 视图,ViewResolver 首先根据逻辑视图名解析成物理视图名即具体的页面地址,再生成 View 视图对象,最后对 View 进行渲染将处理结果通过页面展示给用户。

mvc:annotation-driven说明

  • 在 SpringMVC 的各个组件中,处理器映射器、处理器适配器、视图解析器称为 SpringMVC 的三大组件。
  • 使 用<mvc:annotation-driven>自动加载处理映射器和
    处理适配器,可用在SpringMVC.xml配置文件中使用<mvc:annotation-driven>替代注解处理器和适配器的配置。

RequestMapping注解

  • 作用:用于建立请求 URL 和处理请求方法之间的对应关系。
  • 出现位置:
    • 类上:
      • 请求 URL 的第一级访问目录。此处不写的话,就相当于应用的根目录。写的话需要以/开头。
      • 它出现的目的是为了使我们的 URL 可以按照模块化管理:
        • 例如:
        • 账户模块:
          • /account/add
          • /account/update
          • /account/delete
    • 方法上:
      • 请求 URL 的第二级访问目录。
  • 属性:
    • value:用于指定请求的 URL。它和 path 属性的作用是一样的。
    • method:用于指定请求的方式。POST、GET…..
    • params:用于指定限制请求参数的条件。它支持简单的表达式。要求请求参数的key和value必须和配置的一模一样。
      • 例如:
        • params = {“accountName”},表示请求参数必须有accountName
        • params = {“moeny!100”},表示请求参数中 money 不能是 100。
    • headers:用于指定限制请求消息头的条件。

请求参数的绑定

支持的数据类型

  • 基本类型参数:
    • 包括基本类型和 String 类型
  • POJO 类型参数:
    • 包括实体类,以及关联的实体类
  • 数组和集合类型参数:
    • 包括 List 结构和 Map 结构的集合(包括数组)

使用要求

  • 如果是基本类型或者 String 类型:
    • 要求我们的参数名称必须和控制器中方法的形参名称保持一致。(严格区分大小写)
  • 如果是 POJO 类型,或者它的关联对象:
    • 要求表单中参数名称和 POJO 类的属性名称保持一致。并且控制器方法的参数类型是 POJO 类型。
  • 如果是集合类型,有两种方式:
    1. 第一种:
      • 要求集合类型的请求参数必须在 POJO 中。在表单中请求参数名称要和 POJO 中集合属性名称相同。
      • 给 List 集合中的元素赋值,使用下标。
      • 给 Map 集合中的元素赋值,使用键值对。
    2. 第二种:
      • 接收的请求参数是 json 格式数据。需要借助一个注解实现。

编写过滤器解决请求参数乱码的问题

<filter>
    <filter-name>characterEncodingFilter</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>
</filter>
<filter-mapping>
    <filter-name>characterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>
  • 可以在springmvc的配置文件中可以配置,静态资源不过滤:

    <mvc:resources location="/css/" mapping="/css/**"/>
    <mvc:resources location="/images/" mapping="/images/**"/>
    <mvc:resources location="/scripts/" mapping="/javascript/**"/>

自定义类型转换器

  • 对于某些前端提交的数据SpringMVC自动转换可能会失败,比如日期类型,2020/10/10这样是可以转换的,但是2020-10-10这样就不行了,这时候就需要自定义类型转换器。

  • 步骤:

    1. 定义一个类,实现Converter接口,该接口有两个泛型S和T,S表示接受的类型,T表示目标类型。

    2. 实现类型转换的方法

    3. 在springMVC配置文件中配置类型转换器。

      <bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
          <property name="converters">
              <set>
                  <bean class="Utils.DateConvert"></bean>
              </set>
          </property>
      </bean>
    4. annotation-driven标签中引用配置的类型转换服务,<mvc:annotation-driven conversion-service="conversionService"></mvc:annotation-driven>


常用注解

  1. RequestParam

    • 作用:
      • 把请求中指定名称的参数给控制器中的形参赋值。当形参名与请求参数中的名字不一样时可以使用这个注解进行赋值。
    • 属性:
      • value:请求参数中的名称。
      • required:请求参数中是否必须提供此参数。默认值:true。表示必须提供,如果不提供将报错。
  2. RequestBody

    • 作用:
      • 用于获取请求体内容。直接使用得到是 key=value&key=value…结构的数据。
      • get 请求方式不适用。
    • 属性:
      • required:是否必须有请求体。默认值是:true。当取值为 true 时,get 请求方式会报错。如果取值为 false,get 请求得到是 null。
  3. PathVaribale

    • 作用:

      • 用于绑定 url 中的占位符。例如:请求url中 /delete/{id},这个{id}就是 url 占位符。
      • url支持占位符是springmvc支持rest风格URL的一个重要标志。
    • 属性:

      • value:用于指定 url 中占位符名称。
      • required:是否必须提供占位符。
    • 例如:

      @RequestMapping("/usePathVariable/{id}")
      public String usePathVariable(@PathVariable("id") Integer id){
          System.out.println(id);
          return "success"; 
      }
      
      当访问/usePathVariable/10时,id就是传进来的10。
  4. RequestHeader

    • 作用:
      • 用于获取请求消息头。
    • 属性:
      • value:提供消息头名称
      • required:是否必须有此消息头
    • 注:
      • 在实际开发中一般不怎么用
  5. CookieValue

    • 作用:
      • 用于把指定 cookie 名称的值传入控制器方法参数。
    • 属性:
      • value:指定 cookie 的名称。
      • required:是否必须有此 cookie。
  6. ModelAttribute

    • 作用:
      • 该注解可以用于修饰方法和参数。
        • 出现在方法上,表示当前方法会在控制器的方法执行之前,先执行。它可以修饰没有返回值的方法,也可以修饰有具体返回值的方法。
      • 出现在参数上,获取指定的数据给参数赋值。如:@ModelAttribute("abc")User user
    • 属性:
      • value:用于获取数据的 key。key 可以是 POJO 的属性名称,也可以是 map 结构的 key。
    • 应用场景:
      • 当表单提交数据不是完整的实体类数据时,保证没有提交数据的字段使用数据库对象原来的数据。
  7. SessionAttribute

    • 作用:
      • 用于多次执行控制器方法间的参数共享。如@SessionAttributes(value ={"username","password"},types={Integer.class})
    • 属性:
      • value:用于指定存入的属性名称
      • type:用于指定存入的数据类型。
打赏
  • 版权声明: 本博客所有文章除特别声明外,均采用 Apache License 2.0 许可协议。转载请注明出处!

请我喝杯咖啡吧~

支付宝
微信