一.SpringMVC
Spring MVC 是 Spring 提供的一个基于 MVC 设计模式的轻量级 Web 开发框架,本质上相当于 Servlet,负责表述层(控制层)实现简化。 由于 Spring MVC 本身就是 Spring 框架的一部分,和 Spring 框架是无缝集成。 |
二.SSM框架主要作用
三.SpringMVC 原理架构图
四.SpringMVC 5大组件
1.DispatcherServlet 前端控制器 [ CEO ] web.xml/配置类配置生效 整个流程处理的核心,接收所有请求,协同其它组件。 2.HandlerMapping 处理器映射器 [秘书] 需要加入到IoC容器 存储url-->Controller映射关系.根据请求路径,找到处理请求的Controller 3. HandlerAdapter 处理器适配器 [经理] 需要加入到IoC容器 简化处理请求参数和处理响应数据数据,调用控制器Controller 4. Controller 控制器 [打工人] 需要加入到IoC容器 程序员自己定义,处理业务请求,调用service层,最终返回响应结果. 5. ViewResolver 视图解析器 [财务] 简化模版视图页面查找,将ModelView对象中view逻辑视图生成真实的物理视图 如:index---->/index.jsp |
五.SpringMVC构建web项目步骤,注解+配置类的方式实现 (推荐)
1. maven创建web项目
2. 导入相关jar包坐标,以及引入tomcat插件
<dependencies> <!--spring-mvc--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>6.0.6</version> </dependency> <!-- web相关依赖 servlet --> <dependency> <groupId>jakarta.platform</groupId> <artifactId>jakarta.jakartaee-web-api</artifactId> <version>9.1.0</version> <scope>provided</scope> </dependency> <!--jsp需要依赖! jstl--> <dependency> <groupId>jakarta.servlet.jsp.jstl</groupId> <artifactId>jakarta.servlet.jsp.jstl-api</artifactId> <version>3.0.0</version> </dependency> <!-- jstl核心坐标--> <dependency> <groupId>org.glassfish.web</groupId> <artifactId>jakarta.servlet.jsp.jstl</artifactId> <version>2.0.0</version> </dependency> <!--jackson--> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.15.0</version> </dependency> <!--logback: 会自动传递slf4j门面--> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.2.3</version> </dependency> <!--lombok--> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.26</version> </dependency> </dependencies> <plugins> <plugin> <!--web打包插件--> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <version>3.2.2</version> </plugin> </plugins> |
注意:引入logback.xml日志文件
3. 创建web容器的初始化配置类, 替代web.xml
/** * 创建SpringIOC容器初始化类,作用替代web.xml配置文件 * SpringMVC程序的初始化入口,可以被web项目加载, * 加载Spring/SpringMVC配置类创建IOC容器,设置dispatcherServlet的访问地址 */ public class MyWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer { /** * 指定root容器对应的配置类:service / mapper层的配置类 */ @Override protected Class<?>[] getRootConfigClasses() { return new Class[0]; } /** *指定web容器对应的配置类:指定springmvc的配置类 */ @Override protected Class<?>[] getServletConfigClasses() { return new Class[]{SpringMvcConfig.class}; } /** *设置dispatcherServlet的处理路径!一般情况下为 / 代表处理除jsp以外的所有请求! */ @Override protected String[] getServletMappings() { return new String[]{"/"}; } } |
4. 创建springmvc配置类
/** * SpringMVC的配置类 * 实现Springmvc组件声明标准化接口WebMvcConfigurer 提供了各种组件对应的方法 * 添加配置类注解@Configuration * 添加controller层扫描注解 * @EnableWebMvc:启用Spring MVC配置,它提供了处理HTTP请求、管理控制器、处理视图以及管理其他与Web相关组件的功能 * 导入handlerMapping和handlerAdapter的三种方式 * 1.使用@Bean方式配置handlerMapper和handlerAdapter * 2.可以不添加,springmvc会检查是否配置handlerMapping和handlerAdapter,没有配置默认加载 * 3.自动导入handlerMapping和handlerAdapter [推荐] */ @EnableWebMvc @Configuration @ComponentScan("com.bdqn.controller") public class SpringMvcConfig implements WebMvcConfigurer { /** * 配置处理器映射器 */ @Bean public HandlerMapping handlerMapping(){ return new RequestMappingHandlerMapping(); } /** * 配置处理器适配器 */ @Bean public HandlerAdapter handlerAdapter(){ return new RequestMappingHandlerAdapter(); } /** * 配置视图解析器,配置前缀+后缀 */ @Override public void configureViewResolvers(ViewResolverRegistry registry) { registry.jsp("/",".jsp"); } } |
5. 采用注解实现控制器处理请求
处理请求,只需要在Controller类中编写处理请求的方法
/** * 控制器的类 */ @Controller public class GoodsController { /** * 获取所有商品信息的控制方法 * RequestMapping:指定控制器方法的映射路径,注册到HandlerMapping */ @RequestMapping("/getGoods") public ModelAndView getGoods() { ModelAndView mv=new ModelAndView(); List<String> list=new ArrayList<>(); list.add("奥迪"); list.add("迪奥"); list.add("奥利奥"); //往数据视图模型中添加数据 mv.addObject("list", list); //往数据视图模型中指定跳转地址 mv.setViewName("index"); return mv; } } |
6. index.jsp页面展示商品信息
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <html> <body> <c:forEach items="${list}" var="name"> <h2>${name}</h2> </c:forEach> </body> </html> |
注意:el表达式无法正常显示,需要修改web.xml配置文件的版本为4.0
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0"> </web-app> |
六.执行流程的底层实现
每当Web项目启动时,会自动调用WebApplicationInitializer接口的onStartup()方法。 在接口的AbstractDispatcherServletInitializer实现类的onStartup()方法中调用this.registerDispatcherServlet(servletContext)方法 在该方法中WebApplicationContext servletAppContext = this.createServletApplicationContext(); 调用createServletApplicationContext()方法,创建SpringIOC Web容器。 在该方法中AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();创建SpringIOC Web容器。 Class<?>[] configClasses = this.getServletConfigClasses();加载SpringMVC的配置类。 同时在接口的AbstractDispatcherServletInitializer实现类的onStartup()方法中调用this.registerDispatcherServlet(servletContext)方法 在该方法中FrameworkServlet dispatcherServlet = this.createDispatcherServlet(servletAppContext);创建DispatcherServlet对象。 registration.setLoadOnStartup(1); 设置DispatcherServlet自启动。 registration.addMapping(this.getServletMappings());设置DispatcherServlet访问地址。 |
七.SpringMVC相关注解
注解 | 描述 |
@Controller | 创建控制器类的对象 |
@RequestMapping("url") | 指定处理请求的控制器的请求路径 |
@GetMapping("url") | 指定处理get请求的控制器的请求路径 |
@PostMapping("url") | 指定处理Post请求的控制器的请求路径 |
@EnableWebMvc | 启用Spring MVC配置,它提供了处理HTTP请求、管理控制器、处理视图以及管理其他与Web相关组件的功能 |
八.导入handlerMapping和handlerAdapter的三种方式
1.使用@Bean方式配置handlerMapper和handlerAdapter 2.可以不添加,springmvc会检查是否配置handlerMapping和handlerAdapter,没有配置默认加载 3.自动导入handlerMapping和handlerAdapter [推荐] |