今日内容
- 理解SpringMVC相关概念
- 完成SpringMVC的入门案例
- 学会使用PostMan工具发送请求和数据
- 掌握SpringMVC如何接收请求、数据和响应结果
- 掌握RESTful风格及其使用
- 完成基于RESTful的案例编写
SpringMVC是隶属于Spring框架的一部分,主要是用来进行Web开发,是对Servlet进行了封装。
对于SpringMVC我们主要学习如下内容:
SpringMVC是处于Web层的框架,所以其主要的作用就是用来接收前端发过来的请求和数据然后经过处理并将处理的结果响应给前端,所以如何处理请求和响应是SpringMVC中非常重要的一块内容。
REST是一种软件架构风格,可以降低开发的复杂性,提高系统的可伸缩性,后期的应用也是非常广泛。
SSM整合是把咱们所学习的SpringMVC+Spring+Mybatis整合在一起来完成业务开发,是对我们所学习这三个框架的一个综合应用。
对于SpringMVC的学习,最终要达成的目标:
学习SpringMVC我们先来回顾下现在web程序是如何做的,咱们现在web程序大都基于三层架构来实现。
三层架构
浏览器发送一个请求给后端服务器,后端服务器现在是使用Servlet来接收请求和数据
如果所有的处理都交给Servlet来处理的话,所有的东西都耦合在一起,对后期的维护和扩展极为不利
将后端服务器Servlet拆分成三层,分别是web
、service
和dao
servlet处理请求和数据的时候,存在的问题是一个servlet只能处理一个请求
针对web层进行了优化,采用了MVC设计模式,将其设计为controller
、view
和Model
controller负责请求和数据的接收,接收后将其转发给service进行业务处理 这里也就是我们SpringMVC要干的活
随着互联网的发展,上面的模式因为是同步调用,性能慢慢的跟不是需求,所以异步调用慢慢的走到了前台,是现在比较流行的一种处理方式。
介绍了这么多,对SpringMVC进行一个定义
SpringMVC是一种基于Java实现MVC模型的轻量级Web框架
优点
这里所说的优点,就需要我们在使用的过程中慢慢体会。
因为SpringMVC是一个Web框架,将来是要替换Servlet,所以先来回顾下以前Servlet是如何进行开发的?
1.创建web工程(Maven结构)
2.设置tomcat服务器,加载web工程(tomcat插件)
3.导入坐标(Servlet)
4.定义处理请求的功能类(UserServlet)
5.设置请求映射(配置映射关系)
SpringMVC的制作过程和上述流程几乎是一致的,具体的实现流程是什么?
1.创建web工程(Maven结构)
2.设置tomcat服务器,加载web工程(tomcat插件)
3.导入坐标(SpringMVC+Servlet)
4.定义处理请求的功能类(UserController)
5.设置请求映射(配置映射关系)
6.将SpringMVC设定加载到Tomcat容器中
//2.定controller
//2.1使用@Controller定义bean
@Controller
public class UserController {//我们提供给外部一个方法,它就可以用来处理我们的请求了//这里我们完成了处理请求的方法 但是用户发哪个请求可以调用到该方法呢?//2.2设置当前操作的访问路径@RequestMapping("/save")//2.3设置当前操作的返回值类型@ResponseBody //就是你呀把你返回的东西整体作为响应的内容给到外边public String save(){System.out.println("user save ...");return "{'info':'springmvc'}";}@RequestMapping("/delete")@ResponseBodypublic String delete(){System.out.println("user delete ...");return "{'info':'springmvc'}";}
}
//3.创建springmvc的配置文件,加截controller对应的bean
@Configuration
@ComponentScan("com.itheima.controller")
public class SpringMvcConfig {
}
//tomcat容器启动配置 用来加载spring
//4.定义一个servlet容器启动的配置类,在里面加载spring的配置
public class ServletContainersInitConfig extends AbstractDispatcherServletInitializer {//加载springmvc配置类protected WebApplicationContext createServletApplicationContext() {//初始化WebApplicationContext对象AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();/*AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();这段代码初始化的是Spring容器,具体来说是一个基于注解配置的Web应用程序上下文容器。在这里,AnnotationConfigWebApplicationContext类是Spring Framework提供的一种基于Java配置的容器实现,它可以用来加载基于注解的Spring配置类,从而实现Spring IOC容器的初始化和管理。它是Spring容器的一种实现方式,用于构建和管理Spring应用程序的Bean以及提供其他Spring功能,例如事务管理、AOP等。相比之下,Tomcat容器是一个Web服务器容器,它用于部署和运行Web应用程序,而不是创建和管理Spring应用程序的Bean。Tomcat容器使用的是Servlet规范,它提供了一种Servlet容器,用于部署和运行基于Servlet规范的Web应用程序。*///加载指定配置类ctx.register(SpringMvcConfig.class);/*ctx.register(SpringMvcConfig.class); 也就是把springMVC注册进spring容器中这段代码是在将一个Spring MVC配置类(SpringMvcConfig)注册到上下文容器(ctx)中。具体来说,register()方法是AnnotationConfigWebApplicationContext类提供的一种注册方法,它可以将一个或多个基于Java配置的Spring配置类注册到容器中,以供容器初始化和管理。在这里,SpringMvcConfig类是一个基于注解配置的Spring MVC配置类,它包含了Spring MVC框架所需的相关配置,例如视图解析器、拦截器、处理器映射等等。通过将SpringMvcConfig类注册到容器中,可以使得Spring MVC框架能够正确地初始化和配置,从而实现Web应用程序的处理和响应。*/return ctx;}//设置由springmvc控制器处理的请求映射路径protected String[] getServletMappings() {return new String[]{"/"};}//加载spring配置类protected WebApplicationContext createRootApplicationContext() {return null;}/*核心思想:问:tomcat如何读取这个servlet容器初始化类的。是因为它继承了AbstractDispatcherServletInitializer ??chatgpt:是的,Tomcat可以读取Servlet容器初始化类是因为该类继承了Spring Framework提供的AbstractDispatcherServletInitializer抽象类。在Web应用程序启动时,Servlet容器会扫描web.xml文件,加载并初始化所有配置的Servlet和Filter,同时会调用onStartup()方法来启动Spring应用程序上下文。在这个过程中,如果发现有继承了AbstractDispatcherServletInitializer抽象类的Servlet容器初始化类,就会自动调用其中的方法,进行自定义的Servlet容器初始化和配置,包括创建Spring应用程序上下文容器、注册Servlet和Filter、设置请求映射路径等等。最终,Servlet容器会将这些配置应用到Web应用程序中,使得Web应用程序能够正确地处理和响应请求。因此,继承AbstractDispatcherServletInitializer抽象类是实现SpringMVC集成的一种常用方式,它可以自动化配置Servlet和Filter,并使用Spring应用程序上下文容器来管理和加载SpringMVC的配置类和组件。同时,它也支持自定义配置,例如设置请求映射路径、添加拦截器、注册其他Servlet和Filter等等。*/
}
浏览器输入http://localhost/save
进行访问
同时控制台输出
至此SpringMVC的入门案例就已经完成。
注意事项
spring-webmvc
jar包的原因是它会自动依赖spring相关坐标名称 | @Controller |
---|---|
类型 | 类注解 |
位置 | SpringMVC控制器类定义上方 |
作用 | 设定SpringMVC的核心控制器bean |
名称 | @RequestMapping |
---|---|
类型 | 类注解或方法注解 |
位置 | SpringMVC控制器类或方法定义上方 |
作用 | 设置当前控制器方法请求访问路径 |
相关属性 | value(默认),请求访问路径 |
名称 | @ResponseBody |
---|---|
类型 | 类注解或方法注解 |
位置 | SpringMVC控制器类或方法定义上方 |
作用 | 设置当前控制器方法响应内容为当前返回值,无需解析 |
为了更好的使用SpringMVC,我们将SpringMVC的使用过程总共分两个阶段来分析,分别是启动服务器初始化过程
和单次请求过程
public class ServletContainersInitConfig extends AbstractDispatcherServletInitializer {//加载springmvc配置类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;}
}
chatgpt : 您提供的代码是一个Java类,它扩展了AbstractDispatcherServletInitializer类,该类是Spring MVC框架的一部分。该类负责配置和初始化运行Spring MVC应用程序的servlet容器。 当servlet容器启动时,它会扫描应用程序中的所有ServletContainersInitConfig子类,并调用其createServletApplicationContext()和getServletMappings()方法来初始化Spring MVC应用程序的WebApplicationContext对象和处理请求的映射路径。 createServletApplicationContext()方法创建一个新的AnnotationConfigWebApplicationContext对象,并将SpringMvcConfig类注册为配置类。SpringMvcConfig类包含了应用程序的Spring MVC配置,例如视图解析器、拦截器、处理器映射等等。当该方法被调用时,Spring会扫描SpringMvcConfig类并将其注册为应用程序的Bean,以便在处理请求时使用。 getServletMappings()方法返回一个字符串数组,其中包含应用程序的根路径映射。在此例中,该数组只包含一个字符串"/",这表示所有的请求都将由Spring MVC的控制器来处理。 createRootApplicationContext()方法返回一个WebApplicationContext对象,但在此例中返回null,表示该应用程序没有任何根配置。这种情况通常在单个Spring应用程序中使用,而不是在使用Spring MVC框架的应用程序中使用。 总之,当servlet容器启动时,它将扫描并初始化所有ServletContainersInitConfig子类,并使用这些类中的方法配置和初始化Spring MVC应用程序。这些配置包括创建WebApplicationContext对象、注册应用程序的Bean和处理请求的映射路径。
服务器启动,执行ServletContainersInitConfig类,初始化web容器
执行createServletApplicationContext方法,创建了WebApplicationContext对象
创建Spring容器
加载SpringMvcConfig配置类 Spring MVC是为了给Spring容器进行一些特定的配置而存在的,以便实现Web应用程序的开发和管理 理解为ctx.register(SpringMvcConfig.class) springMVC是为了给spring容器进行一些配置
4. 执行@ComponentScan加载对应的bean
加载UserController,每个@RequestMapping的名称对应一个具体的方法
此时就建立了 /save
和 save方法的对应关系 这一组信息并不是放在UserController这个类定义的 所有springmvc是放在一起统一管理的 并不是放在每一个bean下
当浏览器访问对应的url中也就是对应的javewebservelet路径执行getServletMappings方法,设定SpringMVC拦截请求的路径规则
/
代表所拦截请求的路径规则,只有被拦截后才能交给SpringMVC来处理请求总结 (个人总结)
首先 ServletContainersInitConfig类由tomcat创建对象然后调用其中的方法。。方法中 AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();创建spring容器。ctx.register(SpringMvcConfig.class);spring容器加载springMVC配置类,所以spring执行SpringMvcConfig.java文件的内容,然后读取到SpringMvcConfig.java中的注解@ComponentScan(“com.itheima.controller”)然后去controller目录下的类进行对象实例化
http://localhost/save