SpringMVC-1-解密Spring MVC:构建优雅、灵活的Web应用的秘诀

这篇具有很好参考价值的文章主要介绍了SpringMVC-1-解密Spring MVC:构建优雅、灵活的Web应用的秘诀。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

今日目标

能够编写SpringMVC入门案例

了解SpringMVC原理

1. SpringMVC介绍

1.1 SpringMVC概述

思考:SpringMVC框架有什么优点?

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

  2. 优点

使用简单,开发便捷(相比于Servlet)

天然的与Spring框架集成(如IOC容器、AOP等)

请求处理简化:支持用户请求数据自动映射封装

响应处理简化:自动转换为json数据输出

SpringMVC-1-解密Spring MVC:构建优雅、灵活的Web应用的秘诀,JavaWeb,spring,mvc

2 入门案例【重点】

思考:在Controller中如何定义访问路径,如何响应数据?

2.1 实现步骤

1 创建web工程(Maven结构)
2 导入坐标(SpringMVC+Servlet)
3 SpringMVCConfig 配置类 配置前缀”/pages/”和后缀”.jsp”
4 ServletConfig 配置类创建IOC容器和拦截请求路径”/”
5 自定义控制器类(StudentController)
6 开发视图页面/pages/success.jsp

SpringMVC-1-解密Spring MVC:构建优雅、灵活的Web应用的秘诀,JavaWeb,spring,mvc

2.2 代码实现

【第一步】创建web工程(Maven结构)

SpringMVC-1-解密Spring MVC:构建优雅、灵活的Web应用的秘诀,JavaWeb,spring,mvc

【第二步】导入坐标(SpringMVC+Servlet)

<dependencies> 
  <!--spring-webmvc-->  
  <dependency> 
    <groupId>org.springframework</groupId>  
    <artifactId>spring-webmvc</artifactId>  
    <version>5.3.15</version> 
  </dependency>  
  <!--servlet-->  
  <dependency> 
    <groupId>javax.servlet</groupId>  
    <artifactId>javax.servlet-api</artifactId>  
    <version>4.0.1</version>  
    <scope>provided</scope> 
  </dependency> 
</dependencies> 

注意事项:

  1. 课程版本基于Spring主版本5.3.15制作

  2. 导入spring-webmvc坐标自动依赖spring相关坐标

【第三步】SpringMVCConfig 配置类 配置前缀”/pages/”和后缀”.jsp”

完整的配置代码

package com.zbbmeta.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.view.InternalResourceViewResolver;

/**
 * SpringMVC配置类
 */
@Configuration //1.标识当前是配置类 指定这个类为配置类,替代application.xml
@ComponentScan("com.zbbmeta")//2.配置扫描web层包 代替<context:component-scan base-package="com.zbbmeta" />
public class SpringMvcConfig {
    //3.配置视图解析器,配置视图前缀与后缀
    @Bean
    public InternalResourceViewResolver internalResourceViewResolver(){
        InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
        viewResolver.setPrefix("/pages/");//配置前缀
        viewResolver.setSuffix(".jsp");//配置后缀
        return viewResolver;
    }
}

【第四步】创建ServletConfig 配置类创建IOC容器和拦截请求路径”/”

package com.zbbmeta.config;

import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
import org.springframework.web.servlet.support.AbstractDispatcherServletInitializer;

/**
 * tomcat启动时调用会调用当前类AbstractDispatcherServletInitializer实现的方法
 */
public class ServletConfig extends AbstractDispatcherServletInitializer {

    //在tomcat启动时调用,用于创建springmvc框架的IOC容器对象
    //加载springmvc配置类,产生springmvc容器(本质还是spring容器)
    @Override
    protected WebApplicationContext createServletApplicationContext() {
        //初始化WebApplicationContext对象
        AnnotationConfigWebApplicationContext ac = new AnnotationConfigWebApplicationContext();
        //加载指定配置类
        ac.register(SpringMvcConfig.class);
        return ac;
    }
    // 指定SpringMVC要处理哪些请求, /表示SpringMVC处理项目中的所有请求, 静态资源不要让SpringMVC处理,要放行
    //设置DispatcherServlet绑定处理请求的路径"/",处理除了jsp的所有资源请求
    @Override
    protected String[] getServletMappings() {
        return new String[]{"/"};
    }
    //加载spring的配置类
    @Override
    protected WebApplicationContext createRootApplicationContext() {
        return null;
    }
}

【第五步】自定义控制器类(StudentController)

@Controller
public class StudentController {
    @RequestMapping("/save")
    public String save(Model model){
        model.addAttribute("info","欢迎学习SpringMVC");
        return "success";
    }
}

注意事项

对于SpringMVC而言,Controller方法返回值默认表示要跳转的页面,没有对应的页面就会报错。如果不想跳转页面而是响应数据,那么就需要在方法上使用@ResponseBody注解。

【第六步】开发视图页面/pages/success.jsp

<%--
  Created by IntelliJ IDEA.
  User: zbb
  Date: 0011
  Time: 23:56
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>hello</title>
</head>
<body>
    ${info}
</body>
</html>

运行结果

启动项目需要在Idea中集成项目,不清楚怎么集成的可以去查看之前的文章

SpringMVC-1-解密Spring MVC:构建优雅、灵活的Web应用的秘诀,JavaWeb,spring,mvc

web-4-理解Tomcat中的HTTP请求和Servlet响应处理机制

SpringMVC-1-解密Spring MVC:构建优雅、灵活的Web应用的秘诀,JavaWeb,spring,mvc

2.3 案例注解和类解析

2.3.1 @Controller注解

  • 名称:@Controller

  • 类型:类注解

  • 位置:SpringMVC控制器类定义上方

  • 作用:设定SpringMVC的核心控制器bean

  • 范例

@Controller
public class StudentController {
}

2.3.2 @RequestMapping注解

  • 名称:@RequestMapping

  • 类型:方法注解

  • 位置:SpringMVC控制器方法定义上方

  • 作用:设置当前控制器方法请求访问路径

  • 范例

@RequestMapping("/save")
public String save(Model model){
    model.addAttribute("info","欢迎学习SpringMVC");
    return "success";
}

注意:其实@RequestMapping注解还可以写到类上面,表示类下面的所有方法前面都会有该地址

2.3.3 @ResponseBody注解

  • 名称:@ResponseBody

  • 类型:方法注解

  • 位置:SpringMVC控制器方法定义上方

  • 作用:设置当前控制器方法响应内容为当前返回值,无需解析

  • 范例

@RequestMapping("/save")
@ResponseBody
public String save(){
    System.out.println("user save ...");
    return "success";
}

思考:如果在方法上添加了该注解,会和例子结果有什么区别?

2.4.4 AbstractDispatcherServletInitializer类

  • AbstractDispatcherServletInitializer类是SpringMVC提供的快速初始化Web3.0容器的抽象类

  • AbstractDispatcherServletInitializer提供三个接口方法供用户实现

    • createServletApplicationContext()方法,创建Servlet容器时,加载SpringMVC对应的bean并放入WebApplicationContext对象范围中,而WebApplicationContext的作用范围为ServletContext范围,即整个web容器范围。

//加载springmvc配置类,产生springmvc容器(本质还是spring容器)
protected WebApplicationContext createServletApplicationContext() {
    AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
    ctx.register(SpringMvcConfig.class);
    return ctx;
}
  • getServletMappings()方法,设定SpringMVC对应的请求映射路径,设置为/表示拦截所有请求,任意请求都将转入到SpringMVC进行处理。

//设置由springmvc控制器处理的请求映射路径
protected String[] getServletMappings() {
    return new String[]{"/"};
}
  • createRootApplicationContext()方法,如果创建Servlet容器时需要加载非SpringMVC对应的bean,即加载Spring容器中业务bean,使用这个方法进行,使用方式同createServletApplicationContext()

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

3 入门案例工作流程分析【理解】

思考:在上面的时候我们配置类ServletConfig,没有做任何注解,那么为什么,SpringMVC项目启动的时候就能识别他? 这个类又是谁调用的?

3.1 Tomcat启动调用ServletConfig流程

在SpringMVC中,有两个应用上下文:RootApplicationContext、WebApplicationContext。

  • WebApplicationContext是DispatcherServlet专属的上下文(可以理解为是SpringMVC容器),用来加载Controller、ViewResolver、HandlerMapping等web相关的Bean。

  • RootApplicationContext(可以理解为是Spring容器)则是加载数据库、Service业务层等中间件中的Bean。其中,WebApplicationContext继承了RootApplicationContext中的所有Bean,以便在@Controller中注入@Service等依赖。WebApplicationContext是子容器可以使用父容器中的对象

SpringMVC-1-解密Spring MVC:构建优雅、灵活的Web应用的秘诀,JavaWeb,spring,mvc

  • 在 Servlet 3.0 环境下,Servlet 容器会在 classpath 下搜索实现了 javax.servlet.ServletContainerInitializer 接口的任何类,找到之后用它来初始化 Servlet 容器。

  • Spring 实现了以上接口,实现类叫做 SpringServletContainerInitializer, 它会依次搜寻实现了 WebApplicationInitializer接口的任何类,并委派这个类实现配置。

  • 而AbstractDispatcherServletInitializer的父类则实现了WebApplicationInitializer接口。

  • AbstractDispatcherServletInitializer提供三个接口方法供用户实现

    1.createServletApplicationContext()方法,创建Servlet容器时,加载SpringMVC对应的bean并放入WebApplicationContext对象范围中

    2.而WebApplicationContext的作用范围为ServletContext范围,即整个web容器范围

3.2 Tomcat启动配置创建Servlet和IOC容器流程

代码逻辑分析

SpringMVC-1-解密Spring MVC:构建优雅、灵活的Web应用的秘诀,JavaWeb,spring,mvc

  • 1.【源代码分析】服务器启动运行,创建IOC容器

SpringMVC-1-解密Spring MVC:构建优雅、灵活的Web应用的秘诀,JavaWeb,spring,mvc

  • 2.【源代码分析】创建DispatcherServlet运行构造函数

SpringMVC-1-解密Spring MVC:构建优雅、灵活的Web应用的秘诀,JavaWeb,spring,mvc

  • 3.【源代码分析】将IOC容器存储到ServletContext中

SpringMVC-1-解密Spring MVC:构建优雅、灵活的Web应用的秘诀,JavaWeb,spring,mvc

3.3 启动服务器初始化过程

SpringMVC-1-解密Spring MVC:构建优雅、灵活的Web应用的秘诀,JavaWeb,spring,mvc

  1. 服务器启动,执行ServletConfigInitializer类,初始化web容器

  2. 执行createServletApplicationContext方法,创建了WebApplicationContext对象

  3. 加载SpringMvcConfig配置类

  4. 执行@ComponentScan加载对应的bean

  5. 加载UserController,每个@RequestMapping的名称对应一个具体的方法

  6. 执行getServletMappings方法,定义所有的请求都通过SpringMVC

3.4 springmvc执行流程(面试题)

SpringMVC执行流程:一个核心控制器和三大组件

  • DispatcherServlet:前端控制器,是整体流程控制的中心,由其调用其它组件处理用户的请求,有效的降低了组件间的耦合性

  • RequestMappingHandlerMapping :处理器映射器,负责根据用户请求路径找到对应Controller控制器方法

  • RequestMappingHandlerAdapter :处理器适配器,执行Controller控制器的方法

  • InternalResourceViewResolver :视图解析器,根据Controller控制器方法返回值解析找到展现数据的jsp页面输出数据展现

SpringMVC-1-解密Spring MVC:构建优雅、灵活的Web应用的秘诀,JavaWeb,spring,mvc

3.5 Servlet容器初始化的简化格式

Spring 3.2 开始引入一个简易的 WebApplicationInitializer 实现类,这就是 AbstractAnnotationConfigDispatcherServletInitializer。

SpringMVC-1-解密Spring MVC:构建优雅、灵活的Web应用的秘诀,JavaWeb,spring,mvc

package com.zbbmeta.config;

import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;

/**
 * Servlet容器初始化的配置类
 * AbstractAnnotationConfigDispatcherServletInitializer 专门针对注解的配置编写的抽象类
 */
public class ServletAnnotationConfig  extends AbstractAnnotationConfigDispatcherServletInitializer {
    // 暂时不管,整合Spring才需要
    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class[0];
    }
    //在tomcat启动时调用,用于创建springmvc框架的IOC容器对象
    //加载springmvc配置类, Tomcat会拿这个配置类去创建IoC容器,产生springmvc容器(本质还是spring容器)
    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class[] {SpringMvcConfig.class};
    }
    // 指定SpringMVC要处理哪些请求, /表示SpringMVC处理项目中的所有请求, 静态资源不要让SpringMVC处理,要放行
    //设置DispatcherServlet绑定处理请求的路径"/",处理除了jsp的所有资源请求
    @Override
    protected String[] getServletMappings() {
        return new String[] {"/"};
    }
}

注意:ServletAnnotationConfig和ServletConfig二者留其一文章来源地址https://www.toymoban.com/news/detail-659025.html

到了这里,关于SpringMVC-1-解密Spring MVC:构建优雅、灵活的Web应用的秘诀的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Nuxt.js--》解密Nuxt.js:构建优雅、高效的现代化Vue.js应用

            博主今天开设Nuxt.js专栏,带您深入探索 Nuxt.js 的精髓,学习如何利用其强大功能构建出色的前端应用程序。我们将探讨其核心特点、灵活的路由系统、优化技巧以及常见问题的解决方案。无论您是想了解 Nuxt.js 的基础知识,还是希望掌握进阶技巧,本专栏都将满

    2024年02月16日
    浏览(44)
  • (第十一天)初识SpringMVC SSM框架的学习与应用(Spring + Spring MVC + MyBatis)-Java EE企业级应用开发学习记录

    今天我们要来学习一下SSM框架的最后一个框架SpringMVC 一、初认SpringMVC 基本概念: ​ Spring MVC(Model-View-Controller)是一个用于构建Java Web应用程序的开源框架,它提供了一种基于MVC架构的方式来开发Web应用 。 ​ SpringMVC是Spring Framework的一部分,它是一种基于模型-视图-控制器(

    2024年02月07日
    浏览(55)
  • Spring基础(Web-MVC)——在idea中新建springWeb项目 & 浏览器请求 和 服务器响应 & SpringMvc文件相关

    mvc是啥,springMvc是啥,如何搭建springWeb项目, 在springMvc下的request和response怎么发请求,怎么进行响应? springMvc处理文件相关:上传文件,uuid改名,静态资源映射,yaml配置路径,spring配置文件初步; 表现(视图)层:WEB层,用来和客户端进行数据交互的。 servlet-controller 业务层

    2024年02月03日
    浏览(33)
  • 快速上手Spring Boot整合,开发出优雅可靠的Web应用!

    SpringBoot 是由 Pivotal 团队提供的全新框架,其设计目的是用来 简化 Spring 应用的 初始搭建 以及 开发过程 。 使用了 Spring 框架后已经简化了我们的开发。而 SpringBoot 又是对 Spring 开发进行简化的,可想而知 SpringBoot 使用的简单及广泛性。既然 SpringBoot 是用来简化 Spring 开发的,

    2024年02月21日
    浏览(31)
  • Web 应用开发——基于 Spring MVC + MyBits + Maven

    Web 应用开发——基于 Spring MVC + MyBits + Maven ​       Spring MVC是一个基于动作的MVC框架。该框架突出了HTTP中的请求/响应特性,在该框架中,用户的每一个请求都声明了一个需要执行的动作。而这主要是通过将每个请求URI映射到一个可执行的方法来实现的。同时,其也将请求

    2024年02月02日
    浏览(33)
  • Spring Mvc:初识SpringMvc

    编译软件:IntelliJ IDEA 2019.2.4 x64 操作系统:win10 x64 位 家庭版 Maven版本:apache-maven-3.6.3 Mybatis版本:3.5.6 SpringMvc版本:5.3.1 ①SpringMVC是Spring的一种 子框架 ,它是Spring为【 展现层 | 表示层 | 表述层 | 控制层 】提供的 基于MVC设计理念 的优秀的Web框架,是目前最主流的MVC框架。

    2024年02月13日
    浏览(43)
  • 如何优雅地在Spring Boot项目启动时初始化数据,让你的Web应用快人一步

    🏅 欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! 大多数Java Web应用程序中,项目在启动时都需要加载一些初始化数据,例如配置文件、数据库连接信息等。在Spring Boot中,我们可以通过将数据缓存到内存中来提高Web应用程序的性能。本篇博客旨在通过一个实例来介绍如

    2024年02月02日
    浏览(41)
  • 掌握Spring MVC拦截器整合技巧,实现灵活的请求处理与权限控制!

    (1)浏览器发送一个请求会先到Tomcat的web服务器。 (2)Tomcat服务器接收到请求以后,会去判断请求的是静态资源还是动态资源。 (3)如果是静态资源,会直接到Tomcat的项目部署目录下去直接访问。 (4)如果是动态资源,就需要交给项目的后台代码进行处理。 (5)在找到具体的方法之前

    2024年01月22日
    浏览(36)
  • Spring MVC 之MVC 体系结构、什么是SpringMVC

    三层架构 我们的开发架构⼀般都是基于两种形式,⼀种是 C/S 架构,也就是客户端/服务器;另⼀种是 B/S 架构,也就是浏览器服务器。在 JavaEE 开发中,⼏乎全都是基于 B/S 架构的开发。那么在 B/S 架构中,系统标准的三层架构包括:表现层、业务层、持久层。 三层架构中,每

    2024年02月09日
    浏览(35)
  • Spring Boot快速入门:构建简单的Web应用

      Spring Boot是一个用于简化Spring应用程序开发的框架,它通过提供开箱即用的配置和一组常用的功能,使得构建高效、可维护的应用变得非常容易。在本篇博客中,我们将一步步地介绍如何快速入门Spring Boot,并构建一个简单的Web应用。 步骤1:准备开发环境 Java Development

    2024年02月07日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包