SpringMVC

Spring执行流程

Spring集成web开发环境

  1. 应用上下文对象是通过new ClasspathXmlApplicationContext(spring配置文件)方式获取的,但是每次从容器中获得Bean时都要编写new ClasspathXmlApplicationContext(spring配置文件),这样的弊端是配置文件加载多次,应用上下文对象创建多次。

  2. 在Web项目中,可以使用ServletContextListener监听Web应用的启动, 我们可以在Web应用启动时,就加载Spring的配置文件,创建应用上下文对象ApplicationContext,在将其存储到最大的域servletContext域中,这样就可以在任意位置从域中获得应用上下文ApplicationContext对象了。

Spring提供获取应用上下文的工具

所以我们需要做两件事

  1. web.xml中配置ContextLoaderListener监听器(导入Spring-web坐标)
  2. 使用WebApplicationContextUtils获得应用上下文对象ApplicationContext

知识要点

  1. Spring集成web环境步骤
  2. 配置ContextLoaderListener
  3. 使用webApplicationContextUtils获取应用上下文

SpringMvc简介

SpringMvc组件解析

  1. RequestMapping
    1. 作用:用于建立请求url和处理方法之间的对应关系
    2. 位置:
      1. 类上.请求url的第一集访问目录,此处不写,就相当于应用的根目录
      2. 方法上,请求url的第二级访问目录,与类上的使用@RequestMapping标注的一级目录一起组成访问虚拟路径
    3. 属性:
      1. value:用于指定请求的url,它和path属性的作用是一样的
      2. method:用于指定请求的方式
      3. params:用于指定限制请求参数的条件,它支持简单的表达式,要求请求参数的key和value必须和配置一模一样

知识要点

SpringMVC的相关组件

  • 前端控制器:DispatchServlet
  • 处理器映射:HandlerMapping
  • 处理器适配器:HandlerAdapter
  • 处理器:Handler
  • 视图解析器:ViewResolver View Resolver 负责将处理结果生成 View 视图,将视图返回给前端控制器DispatcherServlet,再由DispatcherServlet响应浏览器。
  • 视图:View

SpringMVC的注解和配置

  • 请求映射注解:@RequestMapping
  • 视图解析器配置:

SpringMVC的数据响应

  1. 页面跳转
    • 直接返回字符串
    • 通过ModelAndView对象返回
  2. 回写数据
    • 直接返回字符串
      • 直接返回字符串需要在方法上添加注解@ResponseBody
    • 返回对象或者集合
    • 在SpringMVC的各个组件中,处理器映射器,处理器适配器,视图解析器是SpringMVC的三大组件,使用<mvc:annotation-driven>自动加载以上组件替代配置
    • 同时<mvc:annotation-driven>底层默认继承jackson进行对象或者集合的封装转换

SpringMVC的请求数据

  1. 基础数据类型
    1. Controller中的业务方法的参数的名称与请求参数的的名称一致
  2. POJO类型
    1. Controller中的业务方法的POJO参数的属性名与请求参数的的名称一致
  3. 数组类型
    1. Controller中的业务方法数组名称与请求参数的名称一致,参数值会自动跳转映射匹配
  4. 集合类型
    1. 获取参数时,需要将集合参数封装到POJO中才行(目前)
    2. 获取参数类型时,使用ajax发送请求时候,设置contextType类型为json类型就能直接获取集合类型

过滤静态资源

  1. 在请求数据中,使用
    1. <mvc:resource mapping="/js/**" location="/js/">
    2. <mvc:default-servlet-handler>
  2. 如果想在控制器直接接受集合需要在前端发送json数据,在参数列表声明@RequestBody注解

过滤全局乱码

  1. 在web.xml中配置filter CharacterEncodingFilter

  2. 配置filter-mapping

    filter-name

    <url-patter> /* </url-patter>

参数绑定注解@requestParam

参数

  1. value:与请求参数名称
  2. required:此在指定的请求参数是否必须包括,默认是true,提交时如果没有此参数报错
  3. defaultValue:当没有指定请求参数时,则使用指定的默认赋值

自定义类型转化器

步骤:

  1. 定义转换器Converter接口

    public class DateConverter implements Converter<String, Date> {
        @Override
        public Date convert(String s) {
            SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:ss");
            Date parseDate = null;
            try {
                parseDate = simpleDateFormat.parse(s);
            } catch (ParseException e) {
                e.printStackTrace();
            }
            return parseDate;
        }
    }
    
  2. 在配置文件声明转换器

    <!--转换器-->
    <bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
        <property name="converters">
            <list>
                <bean class="自定义转换器全包名"/>
            </list>
        </property>
    
  3. <annotation-driven>中引用转换器

    <!--配置mvc注解驱动-->
    <mvc:annotation-driven conversion-service="conversionService"/>
    

SpringMVC获取请求头

  1. @RequestHeader
    1. value:请求头
    2. required:是否必须携带请求头
  2. @CookieValue
    1. value:请求头
    2. required:是否携带此cookie

文件上传

  1. 表单必须是POST类型method="post",多文件表单形式enctype="multipart/form-data"

  2. 服务端配置文件解析器设置必要参数

     <!--配置文件上传解析器,指定编码和大小-->
        <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
            <property name="maxUploadSize" value="50000000"/>
            <property name="defaultEncoding" value="UTF-8"/>
        </bean>
    
  3. 业务方法形参位置接受multipart类型参数,参数名称与前端name属性一致调用文件transferTo方法输出文件地址

    //获取文件名称 
    String originalFilename = file.getOriginalFilename();     
    file.transferTo(new File("文件地址"+originalFilename));
    
    

SpringMVC拦截器

  1. 拦截器(interceptor)

    类似SpringMVC的拦截类似于Servlet开发中的Filter,用于对处理器进行预处理后处理

  2. 自定义拦截器

    1. 创建拦截器类实现HandlerInterceptor接口
      1. 拦截器实现HandlerInterceptor三个方法
        • preHandler():方法在请求处理之前进行调用,返回值是布尔类型,放返回值为false,表示请求结束,后续方法不执行,返回值为true时,执行下一个interceptor的preHandler方法或后续方法
        • postHandler():该方法是在当前请求进行处理之后被调用,前提是preHandle 方法的返回值为
          true时才能被调用,且它会在DispatcherServlet 进行视图返回渲染之前被调用,所以我们可以在这个方法中对Controller处理之后的ModelAndView对象进行操作
        • afterCompletion():该方法将在整个请求结束之后,也就是在DispatcherServlet 渲染了对应的视图
          之后执行,前提是preHandle方法的返回值为true时才能被调用
    2. spring-mvc.xml配置拦截器,拦截路径,拦截类bean
    3. 测试拦截

SpringMVC异异常处理机制

  1. 两种处理方式
  2. SimpleMappingExceptionRsesolver
  3. 实现Spring的异常处理接口HandlerExceptionResolver自定义异常处理器

SimpleMappingExceptionRsesolver

  1. 配置文件配置异常处理

  2. <!--配置异常处理器-->
        <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
            <property name="defaultErrorView" value="error"/>
            <property name="exceptionMappings">
                <map>
                    <entry key="java.lang.ClassCastException" value="ClassCastError"/>
                    <entry key="java.lang.NullPointerException" value="NullPointerError"/>
                </map>
            </property>
        </bean>
    

HandlerExceptionResolver自定义异常处理器

  1. 创建类实现HandlerExceptionResolver接口
  2. 配置异常处理器
  3. 编写异常页面
  4. 测试异常
上一篇 下一篇