1. 什么是Spring MVC?
spring mvc是spring framework后续的开发产品,已经很好地融入进入spring web flow生态之中,用来方便开发以mvc为架构的产品
2.为什么使用Spring MVC?
- Spring MVC 轻量易学
- Spring MVC与Spring framework紧密结合,具有良好的生态
- Spring MVC优良的设计使得其具有很好的性能
3. Spring MVC 原理
- 请求发送给前端控制器,也就是DispatcherServlet
- 前端控制器调用HandlerMapping的接口解析请求之中的URL
- HandlerMapping调用HandlerExecution之中的接口根据解析URL查找请求的Controller
- HandlerExecution将查到的结果返回给HandlerMapping
- HandlerMapping将结果返回给DispatcherServlet
- DispatcherServlet将这一个查询结果以及请求给HandlerAdapter
- HandlerAdapter根据内容适配一个Controller
- Controller根据请求之中的内容调用Service层或者其他业务层方法,将业务处理结果以及要响应的视图名称封装进入ModelAndView对象之中,然后返回这个对象
- HandlerAdapter将这个对象返回给DispatcherServlet
- DispatcherServlet将ModelAndView对象发给Resolver解析
- Resolver解析视图,加上前缀和后缀,将处理结果返回给DispatcherServlet
- DispatcherServlet根据解析结果将Model以及View返回给前端
4. 搭建一个简单的Spring MVC项目
- 在web.xml之中配置DispatcherServlet的信息,绑定好SpringMVC的配置文件。
url-pattern不能为/*,因为/*会响应/xxx.jsp请求,之后会导致Resolver不断添加.jsp后缀
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="https://jakarta.ee/xml/ns/jakartaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_6_1.xsd"
version="6.1">
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc-servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
- 设置SpringMVC的配置文件,将HandlerMapping,HandlerAdapter,以及Resolver接口对应的实现类注入到IOC容器之中。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd">
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
</beans>
- 创建Controller类 ,实现hanlerRequest这个方法,这个方法返回ModelAndView对象,其中包含Model信息以及View信息
package com.zalon.controller;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.jspecify.annotations.Nullable;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
public class HelloController implements Controller {
@Override
public @Nullable ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
ModelAndView mv = new ModelAndView();
mv.addObject("msg", "Hello SpringMVC");
mv.setViewName("spring");
return mv;
}
}
- 在SpringMVC配置文件之中配置好Controller类的bean对象。由于之前选择的HandlerMapping是BeanNameUrlHandlerMapping,这个HandlerMapping会根据bean的id匹配url,所以Controller的bean对象的id要设置为请求的url
<bean id="/hello" class="com.zalon.controller.HelloController"/>
- 启动web容器,运行测试。