MVC是一种思想,将一个应用程序分为三部分,分别代表web应用程序的三种职责,分为模型(Model)、视图(View)和控制器(Controller)的三个主要组件。
-
Model(模型): 模型代表应用程序的数据和业务逻辑。在 Spring MVC 中,模型通常是一个 JavaBean,它封装了应用程序的状态。模型对象负责处理应用程序的数据逻辑。
-
View(视图): 视图是用户界面的呈现方式。在 Spring MVC 中,视图通常是 JSP(JavaServer Pages)或 Thymeleaf 模板等。视图负责展示模型的数据给用户。
-
Controller(控制器): 控制器是处理用户请求的组件。它接收用户输入,并调用模型和视图来完成用户请求的处理。在 Spring MVC 中,控制器是由开发者编写的类,通常使用注解进行标记,如
@Controller
。
这是 Spring MVC 的基本工作原理:
Model(模型): 模型代表应用程序的数据和业务逻辑。在 Spring MVC 中,模型通常是一个 JavaBean,它封装了应用程序的状态。模型对象负责处理应用程序的数据逻辑。
View(视图): 视图是用户界面的呈现方式。在 Spring MVC 中,视图通常是 JSP(JavaServer Pages)或 Thymeleaf 模板等。视图负责展示模型的数据给用户。
Controller(控制器): 控制器是处理用户请求的组件。它接收用户输入,并调用模型和视图来完成用户请求的处理。在 Spring MVC 中,控制器是由开发者编写的类,通常使用注解进行标记,例如
@Controller
。
Spring MVC 的工作流程如下:
用户发起请求:用户通过浏览器或其他客户端发起请求。
DispatcherServlet处理请求:Spring MVC 应用程序的中央控制器是
DispatcherServlet
,它拦截所有的请求,并将它们分发给适当的控制器。控制器处理请求:控制器根据请求的 URL 和方法调度到合适的处理方法,这个方法执行业务逻辑,并返回一个包含模型数据的对象。
模型数据传递给视图:控制器返回的模型数据被传递给视图,用于呈现用户界面。
视图渲染响应:视图负责将模型数据呈现为最终的用户界面。这可能是一个 HTML 页面、JSON 数据等,具体取决于请求和配置。
响应返回给用户:最终的响应被返回给用户,显示在其浏览器或客户端上。
spinrgMVC特点:
1.spring框架的一部分,无缝集成spring框架
2. 分离了控制器,模型对象等,容易定制
3.支持注解驱动
4.高度可配置,支持多种视图技术
5.采用松耦合可插入的组件结构,具备扩展灵活性
一.接下来说一下创建和配置一个springmvc的项目,采用maven项目和纯注解配置和开发,无xml操作
1.首先导入springmvc和spring,mybatis等依赖
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.10.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.2.10.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.2.10.RELEASE</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.6</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.0</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.6</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.3</version>
</dependency>
<dependency>
<groupId>org.apache.taglibs</groupId>
<artifactId>taglibs-standard-spec</artifactId>
<version>1.2.5</version>
</dependency>
<dependency>
<groupId>org.apache.taglibs</groupId>
<artifactId>taglibs-standard-impl</artifactId>
<version>1.2.5</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<version>2.6.2</version>
<scope>runtime</scope>
</dependency>
<!-- LogBack日志框架 -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.11</version>
</dependency>
2.注解创建spring,springmvc的配置类来替代application.xml,web.xml等文件
以下为spring的配置类:
以下为springMVC的配置类:
- @Configuration 表示这是一个配置类
- @ComponentScan表示开启组件扫描,把需要扫描的包或类以数组的形式添加进去
- @EnableWebMvc开启注解驱动
- WebMvcConfiguer是一个接口,提供多个可以自定义的springMVC配置,如拦截器链,视图解析器等(也可以不实现这个接口,把相关配置单独封装成一个自定义配置类),如下;
@Configuration
public class springMvcSupport extends WebMvcConfigurationSupport {
@Autowired //这是一个拦截器,也需要配置,后面会介绍
private projectInterceptor projectInterceptor;
@Override
protected void addResourceHandlers(ResourceHandlerRegistry registry) {
//访问 /resources时。不走mvc,直接访问resources目录下 让MVC放行以下目录的资源,一般为静态资源
registry.addResourceHandler("/resources/**").addResourceLocations("/resources/");
registry.addResourceHandler("/statics/**").addResourceLocations("/statics/");
registry.addResourceHandler("/uploadfiles/**").addResourceLocations("/uploadfiles/");
}
@Override //添加拦截器并指定拦截的路径
protected void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(projectInterceptor).addPathPatterns("/users/**");
}
@Override //配置视图解析器
protected void configureViewResolvers(ViewResolverRegistry registry) {
InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
viewResolver.setPrefix("/WEB-INF/views/");
viewResolver.setSuffix(".jsp");
registry.viewResolver(viewResolver);
}
//配置文件解析器
@Bean
public MultipartResolver multipartResolver(){
CommonsMultipartResolver multipartResolver=new CommonsMultipartResolver();
multipartResolver.setMaxUploadSize(9000000);
multipartResolver.setDefaultEncoding("UTF-8");
//问题所在
multipartResolver.setResolveLazily(true);
return multipartResolver;
}
}
这里的配置类继承了WebMvcConfigurationSupport类,这里的WebMvcConfigurationSupport类和WebMvcConfigurer接口的作用都差不多,都是用来配置mvc,但也存在一些区别,这里就不详细说明,需要注意,如果使用这样的方法配置mvc,需要让配置类的@ComponentScan注解扫描到这个类或包。
3.将DispatcherServlet和Spring应用上下文配置到Servlet容器中,也是通过注解加配置类的方式。
Servlet配置类有以下几种抽象类可以继承实现,本文使用的最后一种,其他几种这里不多介绍,大家感兴趣可以看看自己查阅学习。
WebApplicationInitializer —> AbstractContextLoaderInitializer —> AbstractDispatcherServletInitializer —> AbstractAnnotationConfigDispatcherServletInitializer
4.接下来就是配置拦截器,实现一个 HandlerInterceptor
接口,可以在里面填写拦截前后和完成后逻辑。也需要通过@Component表示为配置类并且让@ComponentScan注解扫描到。
@Component
public class projectInterceptor implements HandlerInterceptor {
@Override // 在请求处理之前调用
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// 在这里执行拦截前的逻辑,返回 true 表示继续处理,返回 false 则中断处理
return true;
}
@Override // 在请求处理之后,视图渲染之前调用
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
// 在这里执行拦截后的逻辑,可以修改 ModelAndView
}
@Override // 在整个请求完成后调用,主要用于资源清理等工作
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
// 在这里执行拦截完成后的逻辑
}
}
然后就可以在继承了 WebMvcConfigurationSupport 类的配置类种注入拦截器,并通过 addInterceptors
方法注册拦截器,拦截指定路径,把匹配路径的请求交给拦截器处理,如下所示
以上就是mvc的全注解配置。
二.接下来说一下springMVC中的重要的控制器,controller。
1,springMVC中通过@Controller把一个类声明为控制类,需要让配置类中@ComponentScan注解扫描到控制类所在包,
2,使用@RequestMapper注解将不同的请求映射到控制器上,切该注解不仅可以作用到方法上,也能做用到类上,这样使得请求的路径 = 类注解上的URL + 方法注解上的URL。
但@RequestMapper也可也细分为 @PostMapping注解,@DeleteMapping注解,@PutMapping注解和@GetMapping四种注解,分别处理增删改查的请求。如下所示,
图中的@RequestBody和@PathVariable注解涉及到spring MVC的数据交互,本文不详细介绍,因为存在一篇文章太长,大家看不下去的情况,所以我决定分为两篇或三篇博客,此文为第一篇,剩余的内容,如数据交互,三层架构,文件上传,日志和统一异常处理等,下一篇博客再详细介绍。如有错误不足,感谢指正