SpringMVC学习

SpringMVC简介

SpringMVC技术与Servlet技术功能等同,均属于web层开发技术

概述:

SpringMVC是一种基于Java实现的MVC模型的轻量级框架

是一种表现层框架技术

用于进行表现层功能开发

SpringMVC入门

  1. 导入相关jar包

  2. 创建SpringMVC控制器类(等同于Servlet功能)

    @Controller  //将这个类定义成一个bean
    public class UserController{
        //设置当前操作的访问路径
        @RequestMapping("/save")
        //设置当前操作的返回值类型
        @ResponseBody
        public String save(){
            sout("user save...");
            //返回一个json数据
            return "{'info':'springmvc'}";
        }
    }
    
  3. 初始化SpringMVC环境,设定SpringMVC加载对应的bean(创建SpringMVC的配置类)

  4. 再定义一个servlet容器(tomcat)启动的配置类,在里面加载spring的配置,初始化Servlet容器,加载SpringMVC环境,并设置SpringMVC技术处理的请求(让tomcat能够加载SpringMVC配置)

    这个配置类需要继承AbstractDispatcherServletInitializer

AbstractDispatcherServletInitializer

这是一个SpringMVC提供的快速初始化web容器的抽象类

里面提供了三个接口方法供用户实现

  • createServletApplicationContext()方法:加载springmvc容器配置

    protected WebApplicationContext createServletApplicationContext() {
         //初始化springmvc容器
         AnnotationConfigWebApplicationContext app=new AnnotationConfigWebApplicationContext();
         //注册加载SpringMvcConfig类
         app.register(SpringMvcConfig.class);
         return app;
      }
    
  • getServletMappings():设置哪些请求归属springmvc处理

    protected String[] getServletMappings() {
            return new String[]{"/"};  //表示所有请求都归属springmvc处理
        }
    
  • createRootApplicationContext():加载Spring容器配置

    protected WebApplicationContext createRootApplicationContext() {
         AnnotationConfigWebApplicationContext app=new AnnotationConfigWebApplicationContext();
         //注册加载SpringConfig类
         app.register(SpringConfig.class);
       return app;
        }
    
  • 补充

    还可以继承于AbstractAnnotationConfigDispatcherServletInitializer类,这样就只用传递配置类类型就行,不用自己初始化容器

    public class ServletInitConfig extends AbstractAnnotationConfigDispatcherServletInitializer{
        protected Class<?>[] getRootConfigClasses(){
            return new Class[]{SpringConfig.class};
        }
        
        protected Class<?>[] getServletConfigClasses(){
            return new Class[]{SpringMvcConfig.class};
        }
        
        protect Class<?>[] getServletMappings(){
            return new String[]{"/"};
        }
    }
    

bean的加载控制

思考:

因为功能不同,如何避免Spring错误的加载到SpringMVC的bean?

加载Spring的bean时排除掉SpringMVC控制的bean

  • SpringMVC相关的bean(表现层bean)

  • Spring控制的bean

    • 业务bean(Service)
    • 功能bean(DataSource等)
  • Spring相关bean加载控制

    • 方式1:Spring加载的bean设定扫描范围为精准范围,从而防止扫到SpringMVC控制的bean

    • 方式2:设定扫描范围依然较大,排除掉SpringMVC控制的bean的包即可(用@Component注解的excludeFilters属性设置要过滤的bean)前提:将要排除的bean的@Configuration注解去掉,才能生效

      @Component(value="com.itheima",
                 excludeFilters=@Component.Filter(
                     //指定要根据什么来过滤bean(这里指定的是注解类型)
                     type=FilterType.Annotation,
                     //这里表示要过滤的注解类型
                     //即只要是带有@Controller注解的bean都会被过滤掉
                     classes=Controller.class
      ))
      
  • SpringMVC相关bean控制

    • 将SpringMVC控制的bean均放在一个包里

设置请求映射路径

使用@RequestMapping注解来设置

  • 位置在方法上:表示这个方法的详细访问路径
  • 位置在类上:表示这个类中所有方法的访问路径前缀

get请求和post请求发送参数

普通参数

对于普通参数,不管是get请求还是post都通过在当前操作的方法中设置参数来接收请求参数,相同名称的能够自动映射进去

如果请求参数名和形参名不同

可在形参前加@RequestParam(“请求参数名”)注解,来绑定请求参数与形参之间的关系

post请求中文乱码处理

  • 为web容器添加过滤器并指定字符集,Spring-web包中提供了专用的字符过滤器(CharacterEncodingFilter)

    //AbstractDispatcherServletInitializer类中提供的加载过滤器的方法
    protected Filter[] getServletFilters(){
        CharacterEncodingFilter filter=new CharacterEncodingFilter();
        filter.setEncoding("utf-8");
        return new Filter[]{filter};
    }
    

pojo参数

只要请求参数的属性名与参数中实体类的属性名一样,SpringMVC会自动将请求参数装入对象中

数组参数传递

只要保证请求参数属性名与形参数组名相同即可

集合参数传递

保证请求参数名与形参集合名相同,且在形参集合之前加@RequestParam注解,防止认为集合形参是pojo类,走pojo类型参数的传递流程

JSON数据的传递与接收

  1. 导jar包
  2. 在SpringMvcConfig类中,加入@EnableWebMvc注解(开启将json数据转成对象的功能)
  3. 在参数前加入@RequestBody注解

日期类型参数传递

接收形参时,根据不同的日期格式设置不同的接收方式

默认格式为yyyy/MM/dd 当这个格式不适用时,需要自己去指定

在参数前加 @DateTimeFormat(pattern=“日期格式 如yyyy-MM-dd HH:mm:ss”)

  • Converter接口:实现类型转换功能,保证外面接收的参数能够转成正确类型

    public interface Converter<S,T> {
        @Nullable
        T convert (S var1);
    }
    

    该接口作用是转换类型 如

    • 请求参数年龄数据 (String->Integer)
    • 日期格式转换(String–>Date)
  • 这个接口进行类型转换时有默认的转换规则,但有一些转换不能默认开启,这时就需要开启@EnableWebMvc

  • @EnableWebMvc功能之一:根据类型匹配对应的类型转换器

请求与响应

  • 响应页面:
    在方法前不要加@ResponseBody注解,设置方法返回值为String
  • 响应字符串:
    方法前加@ResponseBody注解,设置方法返回值为String
  • 响应JSON数据:
    方法前加@ResponseBody注解,设置方法返回值为对象,jackson会自动将其转成json数据返回给页面

@ResponseBody注解

作用:设置当前控制器返回值,作为响应体

只有有这个注解,才能开激活类型转换

  • 如果返回值是String类型,直接将其作为响应体
  • 如果是其他类型,将其转成能够识别的数据,在作为响应体(如对象转json 集合转json)

这里的类型转换用的不是Converter接口

  • HttpMessageConverter接口,web专用的类型转换接口

Rest快速开发

可将@ResponseBody提到类前面

在类前面加@ResponseMapping设置访问路径前缀

将@Controller与@ResponseBody合并为@RestController

将方法上的@ResponseMapping中设置http请求动作的method属性简化为@PutMapping @PostMapping 等类似的注解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值