SpringMVC--自定义类纯注解开发详解--知识总结

目录

1.SpringMVC简介 

        1.1 入门案例

        1.2.bean的加载控制

2.请求与响应

        2.1请求映射路径

        2.2 接收数据

                2.2.1 get 和 post请求发送普通参数

                2.2.2 实体类接收参数

                2.2.3 数组和集合接收

                2.2.4 接收前端的json的数据(集合,pojo) 

                2.2.5 处理日期

         2.3 响应

                2.3.1 响应页面

                2.3.2 响应JSON

3.REST风格

        3.1REST简介

        3.2 放行静态资源

4.拦截器

        4.1 拦截器概念

        4.2 创建拦截器类


1.SpringMVC简介 

  • SpringMVC技术与servlet技术功能相同。均属于web层开发技术
  • SpringMVC是一种基于Java实现MVC模型的轻量级Web框架,实现表现层(controller)的开发
  • 优点:简单便捷,灵活性强

        1.1 入门案例

创建maven web项目,并建立自己所需要的包(图中三个类下面讲解)

SpringMVC--自定义类纯注解开发详解--知识总结_第1张图片

 导入依赖,删掉项目自带的web.xml

  
      javax.servlet
      javax.servlet-api
      3.1.0
      provided
    
    
      org.springframework
      spring-webmvc
      5.2.10.RELEASE
    


  
    
      
        org.apache.tomcat.maven
        tomcat7-maven-plugin
        2.1
        
          80
          /
        
      
    
  

创建SpringMVC控制器类

//定义表现层控制器bean
@Controller
public class UserController {

    //设置映射路径为/save,即外部访问路径
    @RequestMapping("/save")
    //设置当前操作返回结果为指定json数据(本质上是一个字符串信息)
    @ResponseBody
    public String save(){
        System.out.println("user save ...");
        return "{'info':'springmvc'}";
    }

初始化SpringMVC环境(同Spring环境),设定SpringMVC加载对应的bean(创建配置文件)

//springmvc配置类,本质上还是一个spring配置类
@Configuration
//开启包扫描
@ComponentScan("com.dai.controller")
public class SpringMvcConfig {
}

 初始化Servlet容器,加载SpringMVC环境,并设置SpringMVC技术处理请求

//web容器配置类
public class ServletContainersInitConfig extends AbstractDispatcherServletInitializer {
    //加载springmvc配置类,产生springmvc容器(本质还是spring容器)
    protected WebApplicationContext createServletApplicationContext() {
        //初始化WebApplicationContext对象
        AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
        //加载指定配置类
        ctx.register(SpringMvcConfig.class);
        return ctx;
    }

    //设置由springmvc控制器处理的请求映射路径
    protected String[] getServletMappings() {
        return new String[]{"/"};
    }

    //加载spring配置类
    protected WebApplicationContext createRootApplicationContext() {
        return null;
    }
}

 起服务器

SpringMVC--自定义类纯注解开发详解--知识总结_第2张图片

运行,在浏览器上请求

SpringMVC--自定义类纯注解开发详解--知识总结_第3张图片

        1.2.bean的加载控制

为了防止Spring 把属于SpringMVC管理的控制类 纳入到自己内部管理,有以下方法:

  • SpringMVC相关的bean加载控制:对应加载bean的包均在controller包内
  • Spring相关的bean加载控制:
  •         Spring加载的bean设定扫描范围为com.xxx,排除掉controller
  •         Spring加载的bean设定扫描范围为精准范围,如service包,dao包等
  •         不区分

 @ComponentScan({"com.dai.service","com.dai.dao"})

//设置spring配置类加载bean时的过滤规则,当前要求排除掉表现层对应的bean //excludeFilters属性:设置扫描加载bean时,排除的过滤规则 //type属性:设置排除规则,当前使用按照bean定义时的注解类型进行排除 //classes属性:设置排除的具体注解类,当前设置排除@Controller定义的bean

@ComponentScan(value="com.dai",

        excludeFilters = @ComponentScan.Filter(

        type = FilterType.ANNOTATION,

        classes = Controller.class ) )

若使用排除,需要把SpringMvcConfig类上的@Configuration注解去掉,否则又被Spring管理

 在初始化web容器的代码里加载Spring容器(两种方式,建议用注释掉的方法)

public class ServletContainersInitConfig extends AbstractDispatcherServletInitializer {
    protected WebApplicationContext createServletApplicationContext() {
        AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
        ctx.register(SpringMvcConfig.class);
        return ctx;
    }
    protected WebApplicationContext createRootApplicationContext() {
        AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
        ctx.register(SpringConfig.class);
        return ctx;
    }
    protected String[] getServletMappings() {
        return new String[]{"/"};
    }

}


//可以简化成以下代码

//web配置类简化开发,仅设置配置类类名即可
//public class ServletContainersInitConfig extends //AbstractAnnotationConfigDispatcherServletInitializer {

//    protected Class[] getRootConfigClasses() {
  //      return new Class[]{SpringConfig.class};
    //}

   // protected Class[] getServletConfigClasses() {
     //   return new Class[]{SpringMvcConfig.class};
    //}

    //protected String[] getServletMappings() {
      //  return new String[]{"/"};
    //}
//}

2.请求与响应

        2.1请求映射路径

        当不同类中有相同的请求路径时,会产生冲突。这时需要请求路径切分

        写在类上则每个方法都会加上一级请求路径

SpringMVC--自定义类纯注解开发详解--知识总结_第4张图片

        2.2 接收数据

                2.2.1 get 和 post请求发送普通参数

SpringMVC--自定义类纯注解开发详解--知识总结_第5张图片

         若post请求传中文会有乱码问题,在ServletContainersInitConfig中,重写getServletFilters方法;get传中文乱码解决方法稍微复杂,不做讲解

 //乱码处理
    @Override
    protected Filter[] getServletFilters() {
        CharacterEncodingFilter filter = new CharacterEncodingFilter();
        filter.setEncoding("UTF-8");
        return new Filter[]{filter};
    }

                2.2.2 实体类接收参数

SpringMVC--自定义类纯注解开发详解--知识总结_第6张图片

                 2.2.3 数组和集合接收

SpringMVC--自定义类纯注解开发详解--知识总结_第7张图片

                2.2.4 接收前端的json的数据(集合,pojo) 

        加坐标


  com.fasterxml.jackson.core
  jackson-databind
   2.9.0

        在配置类上加 @EnableWebMvc

SpringMVC--自定义类纯注解开发详解--知识总结_第8张图片

         控制器类(前端如何组织JOSN数据格式不是本章内容,不做讲解)SpringMVC--自定义类纯注解开发详解--知识总结_第9张图片

                 2.2.5 处理日期

        注解里写的格式是前端传来的格式,对应才能接收

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

SpringMVC--自定义类纯注解开发详解--知识总结_第10张图片

         2.3 响应

                2.3.1 响应页面

SpringMVC--自定义类纯注解开发详解--知识总结_第11张图片

                 2.3.2 响应JSON

SpringMVC--自定义类纯注解开发详解--知识总结_第12张图片

SpringMVC--自定义类纯注解开发详解--知识总结_第13张图片

3.REST风格

        3.1REST简介

        REST:表现形式转换

        REST风格默认规范:get请求--查询,put请求--修改/更新,post--新增/保存,delete--删除

        通过请求方式来分别行为,从而隐藏了接口名以及参数名

SpringMVC--自定义类纯注解开发详解--知识总结_第14张图片

         3.2 放行静态资源

        新建一个SpringMvcSupport 类,继承WebMvcConfigurationSupport 


@Configuration
public class SpringMvcSupport extends WebMvcConfigurationSupport {
    //设置静态资源访问过滤,当前类需要设置为配置类,并被扫描加载
    @Override
    protected void addResourceHandlers(ResourceHandlerRegistry registry) {
        //当访问/pages/????时候,从/pages目录下查找内容
        registry.addResourceHandler("/pages/**").addResourceLocations("/pages/");
        registry.addResourceHandler("/js/**").addResourceLocations("/js/");
        registry.addResourceHandler("/css/**").addResourceLocations("/css/");
        registry.addResourceHandler("/plugins/**").addResourceLocations("/plugins/");
    }
}

4.拦截器

        4.1 拦截器概念

拦截器是一种动态拦截方法调用的机制,在SringMVC中动态拦截控制器方法的执行

作用

  •         在指定的方法调用前后执行预先设定的代码
  •         阻止原始方法的执行

拦截器和过滤器的不同 :

  •                 归属不同:Filter属于Servlet技术,Interceptor属于SpringMVC技术
  •                 拦截内容不同:Filter对所有访问进行增强,Interceptor仅对SpringMVC的访问进行增强

         4.2 创建拦截器类

实现HandlerInterceptor 接口,手动重写以下三个方法

@Component
//定义拦截器类,实现HandlerInterceptor接口
//注意当前类必须受Spring容器控制
public class ProjectInterceptor implements HandlerInterceptor {
    @Override
    //原始方法调用前执行的内容
    //返回值类型可以拦截控制的执行,true放行,false终止
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    
        return true;
    }

    @Override
    //原始方法调用后执行的内容
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        
    }

    @Override
    //原始方法调用完成后执行的内容
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        
    }
}

加入到SpringMVC对应的配置类中,注意要被SpringMVC总配置类扫描到

SpringMVC--自定义类纯注解开发详解--知识总结_第15张图片

你可能感兴趣的:(servlet,java,前端,spring)