今天在做SpringBoot的练习时,发现对SpringMVC的理解有些模糊,就又回头重新做一次总结,有用词不当或不够准确的表示虚心请教并改正。
SpringMVC在程序中的位置在哪儿?
用户端给我的TomCat发送请求,首先给servlet,然后servlet把请求参数发送给SpringMVC框架,在框架内部根据先根据
请求地址 来查找相应的代码,然后执行处理代码,得到相应参数或数据,再处理相应数据,把处理的结果返还给Servlet,最后通过视图方式返还给用户端。
SpringMVC的核心组件有哪些
DispatcherServlet:前端控制器
用户请求首先到达前端控制器,它就相当于mvc模式中的c,DispatcherServlet是整个流程控制的调度中心,由它调用其它组件处理用户的请求,DispatcherServlet的存在降低了组件之间的耦合性。
Handler:处理器
Handler是继DispatcherServlet前端控制器的后端控制器,DispatcherServlet会将请求发送至对应的Handler来进行处理。Handler是处理业务逻辑的地方,需要我们自己来编写具体代码,等同于之前的Service层
HandlerMapping:处理器映射器
HandlerMapping负责根据用户请求路径找到Handler,springmvc提供了不同的映射器实现不同的映射方式,例如:BeanName映射,配置文件映射,注解映射等。
HandlAdapter:处理器适配器
通过HandlerAdapter来执行Handler,因为Handler有不同形式,意味着调用方式是不同的,这是适配器模式的应用,我们也可以扩展适配器来实现新的Handler;
ViewResolver:视图解析器
ViewResolver负责从Handler中获取数据和视图,根据逻辑视名称查找物理视图文件,并查找View对象,再生成View对象;
View:视图
View的职责就是装配数据,SpringMVC框架提供了很多的View视图类型的支持,包括:jstlView、freemarkerView、pdfView等。常用视图就是jsp。我们需要根据业务需求,通过页面标签或页面模版技术将模型数据展示给用户
程序运行中的流程
pom依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>MVC01</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<name>MVC01 Maven Webapp</name>
<!-- FIXME change it to the project's website -->
<url>http://www.example.com</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
</properties>
<dependencies>
<!-- SpringMVC -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.2.RELEASE</version>
</dependency>
<!--JEE相关的-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>2.3.3</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
</dependencies>
</project>
web.xml配置
首先我们需要让SpringMVC随着web项目启动,那么先利用DispatcherServlet做两个事情:初始化一个spring容器;注册一个servlet。
<?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">
<servlet>
<servlet-name>DispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 初始化参数指定配置文件-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<load-on-startup></load-on-startup>
</servlet>
<!-- 要交给SpringMVC处理的请求-->
<servlet-mapping>
<servlet-name>DispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
这里需要注意的是url-pattern
/ 表示除了.jsp之外的所有请求
/* 表示所有请求
创建控制器类
@Controller
//@RequestMapping("/user")
public class UserController {
@RequestMapping("/getMsg")
public ModelAndView getMsg(){
ModelAndView modelAndView = new ModelAndView();//创建一个表示模型和视图的对象
modelAndView.setViewName("/index.jsp");//设置视图名称
modelAndView.addObject("msg","hello SpringMVC annotation!");//添加视图需要的数据
return modelAndView;//返回模型和视图给dispatcherServlet
}
}
@Controller
该注解写在类上,用于注册控制器bean到容器中。
@RequestMapping(“url”)
该注解写在方法上时,用于为方法指定要匹配的url,该url是相对根路径的。写在类上时类上的url是相对于根路径,而类中方法则相对于类的url
但是使用注解需要在applicationContext.xml添加
<context:component-scan base-package=""/>
表示自动注解扫描到的bean。
To Be Continue