• 深入学习SpringMVC以及学习总结


    一、优点:

      1.SpringMVC简化web程序开发;

      2.SpringMVC效率很好(单例模式);

      3.SpringMVC提供了大量扩展点,方便程序员自定义功能;

        ①.DispatcherServlet:核心控制器(springMVC的心脏)中转作用;

        ②.HandlerMapping:映射处理器(处理请求,找到对应的Handler);

        ③.HandlerAdapter:处理器适配,(Handler实现有两种方法,所以必须适配时候才能运行);

        ④.Handler:(Controller层):处理器

        ⑤.ViewResolver:视图解析器    通过视图的名称,解析具体的视图对象(jsp文件);

        ⑥.View:具体的视图技术进行渲染;

    二、使用SpringMVC

    添加依赖
        IOC+AOP
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>${spring.version}</version>此处版本可以根据需要选择
    </dependency>
    
    配置
        1.配置核心控制器  (web.xml)
    <!--1.核心控制器-->
    <servlet>
      <servlet-name>springMVC</servlet-name>
      <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
      <load-on-startup>1</load-on-startup>
    </servlet>
    
    <servlet-mapping>
      <servlet-name>springMVC</servlet-name>
      <!--包含静态资源,也需要拦截  *.do、*.action拦截不到静态资源-->
      <url-pattern>/</url-pattern>
    </servlet-mapping>
        2. springMVC的配置文件
                默认在WEB-INF/servlet名称-servlet.xml     springMVC-servlet.xml
    
    <!--2.配置HandlerMapping-->
    <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
    
    
    <!--3.配置HandlerAdapter-->
    <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
    
    <!--4.配置Handler-->
    <bean name="/hello" class="org.itany.controller.HelloController"/>
    
    
    <!--5.视图解析器-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
      <property name="prefix" value="/WEB-INF/view/"/>
      <property name="suffix" value=".jsp"/>
      <!--6.使用具体的视图技术渲染-->
      <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
    </bean>

    三、基于注解方式使用SpringMVC

    1.添加依赖
        IOC+AOP
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>${spring.version}</version>此处版本可以根据需要选择
    </dependency>
    
    2.配置DispatcherServlet
        1.配置核心控制器  (web.xml)
    <!--1.核心控制器-->
    <servlet>
      <servlet-name>springMVC</servlet-name>
      <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
      <load-on-startup>1</load-on-startup>
    </servlet>
    
    <servlet-mapping>
      <servlet-name>springMVC</servlet-name>
      <!--包含静态资源,也需要拦截  *.do、*.action拦截不到静态资源-->
      <url-pattern>/</url-pattern>
    </servlet-mapping>
    3.SpringMVC的配置文件(自定义配置文件)
        需要在servlet中添加一个参数
        <!--自定义springMVC的配置文件-->
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:spring-mvc.xml</param-value>
    </init-param>
    
       <!--2 配置HandlerMapping-->
        <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>
    
        <!--3 配置HandlerAdapter-->
        <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/>
    
        <!--4 配置Handler-->
        <context:component-scan base-package="org.itany.controller"/>
    
    
        <!--5 配置视图解析器-->
        <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <property name="prefix" value="/WEB-INF/view/"></property>
            <property name="suffix" value=".jsp"/>
    
            <!--6 视图渲染技术-->
            <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
        </bean>
    
    
    以上配置中:可以采用
        <mvc:annotation-driver/>替代我们的第2、3步配置

    四、静态资源配置

      1.如果DispatcherServlet配置了url-pattern '/' ,那么静态资源放在webapp下也访问不到,DispatcherServlet覆盖了Tomcat提供的用于访问静态资源的servlet(DefaultServlet);

      可以用<mvc:default-servlet-handler/>去打开静态资源访问方式;

        ①.只能访问webapp下的静态资源;

        ②.和tomcat耦合(和服务器耦合);

      2.springMVC提供静态资源访问:

      <mvc:resources mapping="页面静态资源的映射"  location="静态资源的目录路径"/>

    五、直接跳转页面

      <mvc:view-controller path="/showRegister" view-name="register"/>

      等同于:

    @RequestMapping("/showRegister")
        public String showRegister(){
            return "register";
        }

     六、常用注解

    @Controller       //将一个类映射为Controller层
    @RestController   //将一个类映射为Controller层(方法返回的都是数据模型)
    @RequestMapping   //将一个方法映射到URL上
          @GetMapping   //将一个方法映射到URL上(只能为Get请求)
          @PostMapping  //将一个方法映射到URL上(只能为Post请求)
    @RequestParam     //将请求参数封装到方法参数上
    @RequestHeader    //将请求头部封装到方法参数上
    @CookieValue      //将Cookie封装到方法参数上
    @PathVariable     //将URL中的值封装到方法参数上
    @RequestBody      //将请求体(POST请求)中的值封装到方法参数上
    @ModelAttrubite   //将请求参数封装为对象(在请求作用域中,参数和方法级别)
    @SessionAttributes//将请求参数封装为对象(在Session作用域中,类级别)
    @Valid            //后台校验
    @InitBinder       //(Spring2.5及之前版本会使用)
    @ResponseBody     //将方法返回值写入到ResponseBody中
    @ExceptionHandler //同一异常处理  
    @ControllerAdvice //Controller的通知

    七、Controller层方法的写法

    1.方法的返回值
        ModelAndView       模型和视图
        String             视图
            字符串        -->视图名
            forward:url  -->转发
            redirect:url -->重定向
        void               视图(用于请求url为视图名称)
        Object             模型
    
    2.URL的写法
        @RequestMapping()
            可以添加在类上-->表示包的概念,访问这个类下的所有的方法都需要添加一个前缀
        1.直接写URL  如@RequestMapping("/m1")
        2.ant风格
            *        单层路径
            **       多层路径
            ?        单个字符
        3.rest风格
            {name}
            {name:正则表达式}    
            
       @RequestMapping(path={"/url1","/url2"}) 
       
       @RequestMapping(path="/url",method=RequestMethod.POST) //method指定请求方式
       
      @RequestMapping(path="/url",params={"name"})  //表示该请求必须带一个name的参数 
      
      @RequestMapping(path="/url",headers={"User-Agent"})  //表示该请求必须带一个头部信息User-Agent(浏览器信息)

     八、Controller层方法参数

    * 1.JAVA EE主键
            HttpServletRequest/HttpServletResponse
            HttpSession
    
    2. IO流
            InputStream
            OutputStream
            Reader
            Writer
                
    3.  Spring组件
        SessionStatus
        WebRequest
        NativeWebRequest
    
    *4.自定义类型   如User   (请求参数中的key需要和对象中的setter方法一致)
    
    *5.获取错误信息   Errors/BindingResult
    
    *6.用于传递数据   Model  Map  ModelMap
    
    *7.基本类型和字符串类型
                默认来源请求参数 (@RequestParam)
                如果想要参数来源于请求头部   可以使用@RequestHeader
                如果想要参数来源于cookie     可以使用@CookieValue
                如果想要参数来源于URL        可以使用注解@PathVariable
                如果想要参数来源于请求体      可以使用注解@RequestBody

    九、数据转换

    方案一:spring2.5及之前版本使用
        1.需要在Controller添加一个方法,方法采用@InitBinder
        2.这个方法需要一个参数DataBinder
        3.DataBinder.registerCustomEditor(Class<?> clazz,PropertyEditor propEditor>)
        
    方案二:(只能做字符串到其他类型的转换)
            Formatter
            1.实现接口Formtter
            2.注册到IOC容器中
    - 管理系统中formatter
       <!--用来管理自定义的formatter和converter-->
    <bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
            <property name="formatters">
                <set>
                    <bean class="org.itany.formatter.String2DateFormatter">
                        <constructor-arg value="yyyy-mm-dd"></constructor-arg>
                    </bean>
                </set>
            </property>
     </bean>
    - 将该coversion交个springMVC使用
    <mvc:annotation-driven conversion-service="conversionService"/>
            
    
    方法三:(能做任意类型到其他类型的转换)
            Converter
            1.实现接口Converter
            2.注册到IOC容器中

    十、统一异常处理

    1.编写一个类
            编写方法
            @ExceptionHandler(Exception.class)
            public String exception(Exception ex){
              return "500";
            }
     2.这个类上添加一个@ControllerAdvice

    十一、方法返回json以及xml数据格式

    1.方法的返回值为Object,方法需要注解@ResponseBody
    2.需要添加一个方法返回值的转换器(使用的是jackson)
    <mvc:annotation-driven conversion-service="conversionService">
      <!--消息转换器 告诉springMVC我们方法返回值返回什么格式-->
      <mvc:message-converters>
        <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"/>
      </mvc:message-converters>
    </mvc:annotation-driven>
    3.提供json处理包
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-core</artifactId>
    </dependency>
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
    </dependency>
    
    
    
    使用gson
        1.将消息转换器换为
        <bean class="org.springframework.http.converter.json.GsonHttpMessageConverter"/>
        2.将json处理的依赖修改为
    <dependency>
      <groupId>com.google.code.gson</groupId>
      <artifactId>gson</artifactId>
    </dependency>
    
    使用fastjson
        1.将消息转换器换为
     <bean class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter4"/>
        2.将json处理的依赖包
    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>fastjson</artifactId>
    </dependency>
    
    
    
    
    
    
    如果想要返回为xml
    1.方法返回Object,需要注解@ResponseBody
     还需要在@RequestMapping(produces="application/xml")
    
    2.需要添加消息转换器(这个转换需要在json转换器的前面)
    <class="org.springframework.http.converter.xml.Jaxb2RootElementHttpMessageConverter"/>
    
    3.需要添加一个依赖
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-oxm</artifactId>
    </dependency>
    
    
    
    注意:如果配置了json转换器,这个时候以前返回为String的方法,返回的时候会默认添加一对引号。
        可以在消息转换器中添加一个字符串的转换器(这个转换需要在json转换器的前面)
    <bean class="org.springframework.http.converter.StringHttpMessageConverter"/>

    十二、自定义消息转换器

    1.继承抽象类AbstractHttpMessageConverter
        2.将消息转换器配置到SpringMVC中
        <mvc:annotation-driver>
              <mvc:message-converters>
                  <bean class="自定义的消息转换器"/>
              </mvc:message-converters>
        </mvc:annotation-driver>

    十三、拦截器

    1.实现接口  HandlerInterceptor/WebRequestInterceptor
        preHandler         在handler方法之前调用
                返回值表示true,不拦截
                         false, 拦截(不进入handler方法)  
        postHandler        在handler方法之后调用
        afterCompleition   在handler方法完成之后
        
    2.配置
        在mvc的配置文件中
        1.表示拦截系统中所有的请求
    <mvc:interceptors>
        <bean class="拦截器"/>
    </mvc:interceptors>
        2.只需要拦截某些URL
    <mvc:interceptors>
      <mvc:interceptor>
        <mvc:mapping path="/url/**"/>
        <bean class="org.itany.interceptors.ControllerInterceptor"/>
      </mvc:interceptor>
    </mvc:interceptors>
        3.排除一些url
    <mvc:interceptors>
      <mvc:interceptor>
        <mvc:mapping path="/**"/>
        <mvc:exclude-mapping path="/url/**"/>
        <bean class="org.itany.interceptors.ControllerInterceptor"/>
      </mvc:interceptor>
    </mvc:interceptors>

    十四、文件上传下载

    1.jsp需要二进制提交
            enctype="multipart/form-data"
    2.Controller方法需要参数接收,参数的类型CommonsMultipartFile
    3.需要文件上传的解析器
    <!--文件上传-->
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
      <property name="maxUploadSize" value="10000000000"/>
      <property name="defaultEncoding" value="UTF-8"/>
    </bean>
    4.需要添加依赖commons-fileupload
    <dependency>
      <groupId>commons-fileupload</groupId>
      <artifactId>commons-fileupload</artifactId>
    </dependency>
    
    
    
    文件下载
        PS:只要mvc最后url是带后缀的,SpringMVC会将其截取掉。
      //告诉浏览器拿到资源不要打开,下载
            response.addHeader("Content-Disposition","attachment;filename="+fileName);
  • 相关阅读:
    java传递String参数
    C++ string与int的互相转换
    java插入排序
    凸包Graham Scan算法实现
    求平面上N点最远两点和最近两点距离
    求最大公约数
    n个数连接得到最小或最大的多位整数(携程)
    Java快排
    背包问题
    二分查找离左边元素最近的(可以等于)
  • 原文地址:https://www.cnblogs.com/MrXiaoAndDong/p/SpringMVC.html
Copyright © 2020-2023  润新知