1.概念
- SpringMVC是一种软件架构思想,把软件按照模型(Model)、视图(View)、控制器(Controller)这三层来划分。
- Model:指的是工程中JavaBean,用来处理数据
- View:指的是工程中的html、jsp等页面,用来展示给用户数据
- Controller:指的是工程中的Servlet,用来接收请求和响应
2.入门程序
导入依赖:
注意:这有一个比较不容易发现的坑,当引入Spring的依赖的时候,如果引入的是Spring6,那么Tomcat的版本必须得是10以上的,否则服务器识别不到咱们自己创的网页
<dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>6.0.10</version></dependency>
2.1.配置文件方式
项目文件路径:
- SpringMVC的出现,优化了以前每写一个页面,都要注册一个servlet的情况,现在只需要注册一个DispatcherServlet
第一步:注册DispatchServlet
<?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/javaeehttp://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0"metadata-complete="true"><!--创建DispatchServlet--><servlet><servlet-name>springmvc</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><!--关联一个spring配置文件--><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:springmvc-servlet2.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>
第二步:spring配置文件
<?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/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"><!--添加处理器映射--><bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/><!--添加处理器适配器--><bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/><!--视图解析器:DispatcherServlet给他的ModelAndView--><bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="InternalResourceViewResolver"><!--前缀--><!--<property name="prefix" value="/WEB-INF/jsp/"/>--><property name="prefix" value="/WEB-INF/jsp/"/><!--后缀--><!--<property name="suffix" value=".jsp"/>--><property name="suffix" value=".jsp"/></bean>
</beans>
第三步:编写Controller类
public class HelloController implements Controller {@Overridepublic ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {ModelAndView mv = new ModelAndView();mv.addObject("msg","Hello SpringMVC");//视图转跳mv.setViewName("hello");return mv;}
}
第四步:把Controller交给spring托管
<bean id="/hello" class="com.sun.controller.HelloController"/>
第五步:创建hello.jsp
结果:
2.2.执行原理
上面的域名localhost:8081/hello被拆分成了两部分
- localhost:8081是服务器名
- /hello是控制器的名字(在spring的配置文件里注册了的)
- springMVC的核心就是DispatchServlet
- 首先请求进入DispatcherServlet(前端控制器),由DispatcherServlet通过HandlerMapping(处理器映射器)来获取Handler(处理器),然后用获取的Handler去寻找对应的适配器,即HandlerAdapter(处理器适配器),拿到适配器之后,来寻找到对应的Controller(这个是我们自己编写的),执行了Controller之后,返回一个ModelAndView,然后DispatchServlet拿着ModelAndView里面封装的数据和路径去找ViewResolver(视图解析器),在ViewResolver中拼接具体的路径(在上面的例子里就是/WEB-INF/jsp/hello.jsp),然后DispatchServlet再拿着这个路径去找前端页面并回显给用户
这里就不详细介绍springMVC的底层了,如有需要可以看看这个大佬的文章
https://blog.csdn.net/zxd1435513775/article/details/103000992
2.3.使用注解的方式
这个是我们普遍使用的方式,上面的方式是为了理解springMVC的底层
第一步:由于Maven可能存在资源过滤的问题,我们将其配置完善
<resources><resource><directory>src/main/java</directory><includes><include>**/*.properties</include><include>**/*.xml</include></includes><filtering>false</filtering></resource><resource><directory>src/main/resources</directory><includes><include>**/*.properties</include><include>**/*.xml</include></includes><filtering>false</filtering></resource></resources>
第二步:创建DispatchServlet
<?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/javaeehttp://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0"metadata-complete="true"><!--创建DispatchServlet--><servlet><servlet-name>SpringMVC</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><!--关联一个spring配置文件--><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:springmvc.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>
第三步:spring配置文件
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xmlns:mvc="http://www.springframework.org/schema/mvc"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttps://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/mvchttps://www.springframework.org/schema/mvc/spring-mvc.xsd"><!-- 自动扫描包,让指定包下的注解生效,由IOC容器统一管理 --><context:component-scan base-package="com.sun.controller"/><!-- 让Spring MVC不处理静态资源 --><mvc:default-servlet-handler /><!--代替处理器映射器和处理器适配器--><mvc:annotation-driven /><!--视图解析器:DispatcherServlet给他的ModelAndView--><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类
@Controller
public class HelloController {@RequestMapping("/hello")public static String hello(Model model){//封装数据model.addAttribute("msg","Hello SpringMVC");System.out.println("接收请求");//被视图解析器接收,来拼装路径//hello.jspreturn "hello";}