栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

一万字完整总结 SpringMVC,确定不进来了解一下吗?

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

一万字完整总结 SpringMVC,确定不进来了解一下吗?

图片来源网络,如有侵权请联系删除


文章目录
    • Spring MVC 框架介绍
      • 什么是 MVC
      • SpringMVC 的特点
      • SpringMVC 架构原理解析
    • SpringMVC 配置
      • pom.xml 文件引入依赖
      • web.xml 文件头部信息格式
      • 配置 DispatcherServlet 中央调度器
      • 中央调度器 ``
      • 创建请求控制器
      • 创建 springmvc 的配置文件
      • 如何解决访问静态资源
    • 注解
      • @Controller 注解
      • @RequestMapping 注解
      • @RequestMapping 派生注解
      • SpringMVC 支持 ANT 风格的路径。
      • SpringMVC 支持路径中的占位符。
    • 控制器方法请求参数获取
      • 逐个参数接收
      • 形参注解 @RequestParam
      • 形参注解 @RequestHeader
      • 形参注解 @CookieValue
      • POJO 获取请求参数
      • CharacterEncodingFilter 解决中文乱码
    • 域对象共享数据
      • 使用 ServletApi 向域对象共享数据
      • 使用 ModelAndView 向 Request 域对象共享数据
      • 使用 Model 向 Request 域对象共享数据
      • 使用 Map 向 Request 域对象共享数据
      • 使用 ModelMap 向 Request 域对象共享数据
      • Model、ModelMap、Map的关系
      • Session 域共享数据
      • application 域共享数据
    • 控制器方法返回值
      • String 返回值
      • void 返回值:Ajax 响应
      • Object 返回值:`@ResponseBody`注解 Ajax 响应
      • 注解 Ajax 响应文本
    • SpringMVC 视图
      • 转发视图
      • 重定向视图
    • RESTful API
      • 什么是 API
      • 什么是 RESTful
      • RESTful 的实现
      • HiddenHttpMethodFilter
      • CharacterEncodingFilter
    • RESTful 案例
      • 功能清单
      • 访问首页
      • 查询所有员工数据
      • 删除功能
      • 跳转到添加数据页面
      • 执行保存
      • 跳转到更新数据页面
      • 执行更新
    • HttpMessageConverter 文本转换器
      • @RequestBody
      • @ResponseBody
      • RequestEntity
      • 请求响应处理 JSON
      • 请求响应处理 Ajax
      • @RestController 注解
      • ResponseEntity
    • 文件上传和下载
      • 文件下载
      • 文件上传
    • 异常处理器
    • 拦截器
      • 什么是拦截器
      • 拦截器的执行
      • 拦截器的使用
      • 多个拦截器的执行
      • 拦截器与过滤去的区别
    • 注解配置 SpringMVC
      • 创建初始化类来代替 web.xml
      • 创建 SpringConfig 配置类,代替 Spring 的配置文件
      • 创建 WebConfig 配置类,代替 SpringMVC 的配置文件

Spring MVC 框架介绍 什么是 MVC

MVC 是一种软件架构的思想,将软件按照模型、视图、控制器来划分,主要的作用是降低了视图与业务逻辑的双向耦合。

  • Model(模型层):指工程中的JavaBean,作用是处理数据。
    JavaBean分为两类:
    1)实体类 Bean:专门存储业务数据的,如 Student、User 等。
    2)业务处理 Bean:指 Service 或 Dao 对象,专门用于处理业务逻辑和数据访问。
  • View(视图层):指工程中的html或jsp等页面,作用是与用户进行交互,展示数据。
  • Controller(控制器层):指工程中的servlet,作用是接收请求和响应浏览器。
SpringMVC 的特点

三层架构分为表述层(或表示层)、业务逻辑层、数据访问层,表述层表示前台页面和后台 Servlet。

  • Spring 家族原生产品,与 IOC 容器等基础设施无缝对接。
  • 基于原生的 Servlet,通过了功能强大的前端控制器 DispatcherServlet,对请求和响应进行统一处理。
  • 表述层各细分领域需要解决的问题全方位覆盖,提供全面解决方案。
  • 代码清新简洁,大幅度提升开发效率。
  • 内部组件化程度高,可插拔式组件即插即用,想要什么功能配置相应组件即可。
  • 性能卓著,尤其适合现代大型、超大型互联网项目要求。

SpringMVC 架构原理解析

  1. 发起请求到中央调度器 DispatcherServlet。
  2. 中央调度器接收到请求后,调用 HandlerMapping 映射器查找 Handler。
  3. HandlerMapping 映射器根据xml配置、注解进行查找具体的处理器 Handler,生成处理器对象及连接器一并向中央调度器返回 Handler。
  4. 中央调度器调用 HandlerAdapter 设配器执行Handler。
  5. HandlerAdapter 适配器经过适配调用具体的处理器(Controller 也称:控制器)进行业务逻辑操作。
  6. Handler执行完成给适配器返回ModelAndView。
  7. HandlerAdapter 将 Handler 执行结果 ModelAndView 返回给中央调度器(ModelAndView是springmvc框架的一个底层对象,包括 Model和view)。
  8. 中央调度器将 ModelAndView 传给 ViewResolver 视图解析器进行视图解析,根据逻辑视图名解析成真正的视图(jsp)。
  9. ViewResolver 视图解析器向中央调度器返回View。
  10. 中央调度器进行视图渲染,视图渲染将模型数据(在ModelAndView对象中)填充到request域。
  11. 前端控制器向用户响应结果。
  • 前端控制器 DispatcherServlet(不需要程序员开发)
    作用:接收请求,响应结果,相当于转发器,中央处理器。有了DispatcherServlet减少了其它组件之间的耦合度。
  • 处理器映射器 HandlerMapping(不需要程序员开发)
    作用:根据请求的url查找Handler。
  • 处理器适配器 HandlerAdapter
    作用:按照特定规则(HandlerAdapter要求的规则)去执行Handler。
  • 处理器 Handler(需要程序员开发)
    注意:编写Handler时按照HandlerAdapter的要求去做,这样适配器才可以去正确执行Handler。
  • 视图解析器 ViewResolver(不需要程序员开发)
    作用:进行视图解析,根据逻辑视图名解析成真正的视图(view)
  • 视图View(需要程序员开发jsp) View是一个接口,实现类支持不同的View类型(jsp、freemarker、pdf…)

SpringMVC 配置 pom.xml 文件引入依赖


    org.springframework
    spring-webmvc
    5.2.5.RELEASE



    javax.servlet
    javax.servlet-api
    3.1.0
    provided



    org.thymeleaf
    thymeleaf-spring5
    3.0.12.RELEASE

web.xml 文件头部信息格式

注意此处的web-app版本是4.0。



配置 DispatcherServlet 中央调度器

1)在web.xml配置文件中注册 Spring MVC 框架的核心对象 DispatcherServlet。



    springmvc
    org.springframework.web.servlet.DispatcherServlet


    springmvc
    
    /

标签中使用/和list这种方式使用。

SpringMVC 支持路径中的占位符。

SpringMVC 路径中的占位符常用于 RESTful 风格中,当请求路径中将某些数据通过路径的方式传输到服务器中,就可以在相应的@RequestMapping注解的 value 属性中通过占位符{xxx}表示传输的数据,在通过@PathVariable注解,将占位符所表示的数据赋值给控制器方法的形参。

// 请求:http://192.168.1.111/doSome/12/admin
@RequestMapping(value = "/doSome/{id}/{name}")
public String doSome(@PathVariable("id") Integer id, @PathVariable("name") String name) {
    return "success";
}

控制器方法请求参数获取

被@RequestMapping注解所表示的方法有三种参数:请求、响应、会话。这些参数在系统被调用时由系统自动赋值。

@RequestMapping(value = "/doSome",method = RequestMethod.GET)
public ModelAndView doSome(HttpServletRequest request, HttpServletResponse response, HttpSession session) {
    
}
逐个参数接收

在控制器方法的形参位置,设置和请求参数同名的形参,当浏览器发送请求,匹配到请求映射时,在DispatcherServlet中就会将请求参数赋值给相应的形参。

@RequestMapping(value = "/login",method = RequestMethod.POST)
public ModelAndView otherSome(String username, String password) {
    
}
形参注解 @RequestParam

@RequestParam是将请求的参数与控制器方法的形参创建映射关系。
@RequestParam注解一共有三个参数:

  • value:指定为形参负责的请求参数名称。
  • required:设置是否必传参数。默认:true
  • defaultValue:不管required属性值是true或false,当value所指定的请求参数没有传输或者为空时,则使用默认为形参赋予。
// 请求:http://192.168.1.111/doSome/12/admin?id=1&name=admin
@RequestMapping(value = "/index",method = RequestMethod.GET)
public ModelAndView otherSome(@RequestParam("id") Integer id, @RequestParam("name") String name) {
    
}
形参注解 @RequestHeader

@RequestHeader是将请求头信息和控制器方法的形参创建映射关系。
@RequestHeader属性与@RequestParam相同。

@RequestMapping(value = "/index",method = RequestMethod.GET)
public ModelAndView otherSome(@RequestHeader("token") String token) {
    
}
形参注解 @CookieValue

@CookieValue是将cookie数据和控制器方法的形参创建映射关系。
@CookieValue属性与@RequestParam相同。

@RequestMapping(value = "/index",method = RequestMethod.GET)
public ModelAndView otherSome(@CookieValue("token") String token) {
    
}
POJO 获取请求参数
@RequestMapping(value = "/index",method = RequestMethod.POST)
public ModelAndView otherSome(User user) {
    
}
CharacterEncodingFilter 解决中文乱码
  • 在web.xml配置文件中注册过滤器,过滤所有接口解决中文乱码。

    
        characterEncodingFilter
        org.springframework.web.filter.CharacterEncodingFilter
        
        
            encoding
            UTF-8
        
        
        
            forceRequestEncoding
            true
        
        
        
            forceResponseEncoding
            true
        
    
    
        characterEncodingFilter
        
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
            System.out.println("拦截器MyInterceptor的preHandle方法");
            return true;
        }
        
        public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
            System.out.println("拦截器MyInterceptor的postHandle方法");
        }
        
        public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
            System.out.println("拦截器MyInterceptor的afterCompletion方法");
        }
    }
    
  • 在 SpringMVC 配置文件中声明拦截器,在框架中多个拦截器是按照顺序存放到 ArrayList 中的。

    
        
        
            
            return new Class[]{SpringConfig.class};
        }
        
        @Override
        protected Class[] getServletConfigClasses() {
            return new Class[]{WebConfig.class};
        }
        
        @Override
        protected String[] getServletMappings() {
            return new String[]{"/"};
        }
        
        @Override
        protected Filter[] getServletFilters() {
            CharacterEncodingFilter encodingFilter = new CharacterEncodingFilter();
            encodingFilter.setEncoding("UTF-8");
            encodingFilter.setForceRequestEncoding(true);
            HiddenHttpMethodFilter hiddenHttpMethodFilter = new HiddenHttpMethodFilter();
            return new Filter[]{encodingFilter, hiddenHttpMethodFilter};
        }
    }
    
    创建 SpringConfig 配置类,代替 Spring 的配置文件
    @Configuration
    public class SpringConfig {
    	//ssm整合之后,spring的配置信息写在此类中
    }
    
    创建 WebConfig 配置类,代替 SpringMVC 的配置文件
    @Configuration
    //扫描组件
    @ComponentScan("com.atguigu.mvc.controller")
    //开启MVC注解驱动
    @EnableWebMvc
    public class WebConfig implements WebMvcConfigurer {
        //使用默认的servlet处理静态资源
        @Override
        public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
            configurer.enable();
        }
        //配置文件上传解析器
        @Bean
        public CommonsMultipartResolver multipartResolver(){
            return new CommonsMultipartResolver();
        }
        //配置拦截器
        @Override
        public void addInterceptors(InterceptorRegistry registry) {
            FirstInterceptor firstInterceptor = new FirstInterceptor();
            registry.addInterceptor(firstInterceptor).addPathPatterns("
        
        //配置生成模板解析器
        @Bean
        public ITemplateResolver templateResolver() {
            WebApplicationContext webApplicationContext = ContextLoader.getCurrentWebApplicationContext();
            // ServletContextTemplateResolver需要一个ServletContext作为构造参数,可通过WebApplicationContext 的方法获得
            ServletContextTemplateResolver templateResolver = new ServletContextTemplateResolver(
                    webApplicationContext.getServletContext());
            templateResolver.setPrefix("/WEB-INF/templates/");
            templateResolver.setSuffix(".html");
            templateResolver.setCharacterEncoding("UTF-8");
            templateResolver.setTemplateMode(TemplateMode.HTML);
            return templateResolver;
        }
        //生成模板引擎并为模板引擎注入模板解析器
        @Bean
        public SpringTemplateEngine templateEngine(ITemplateResolver templateResolver) {
            SpringTemplateEngine templateEngine = new SpringTemplateEngine();
            templateEngine.setTemplateResolver(templateResolver);
            return templateEngine;
        }
        //生成视图解析器并未解析器注入模板引擎
        @Bean
        public ViewResolver viewResolver(SpringTemplateEngine templateEngine) {
            ThymeleafViewResolver viewResolver = new ThymeleafViewResolver();
            viewResolver.setCharacterEncoding("UTF-8");
            viewResolver.setTemplateEngine(templateEngine);
            return viewResolver;
        }
    }
    
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/930449.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号