SpringMVC
一、了解什么是MVC
MVC模型:Model-View-Controller,模型-视图-控制器模式。
MVC是一种架构型的模式,本身不引入新功能,只是帮助我们将开发的代码结构组织得更加合理。
-
Model(模型)
数据模型,提供要展示的数据,因此包含数据和行为,行为是用来处理这些数据的。
不过现在一般都分离开来:Value Object(数据) 和 服务层(行为)。
也就是数据由实体类或者javabean来提供,行为由service层来提供。
-
View(视图)
负责进行模型的展示,一般就是我们见到的用户界面,客户想看到的东西。
-
Controller(控制器)
直接接收用户请求,委托给模型进行处理,处理完毕后把返回的模型数据交给给视图。
也就是说控制器在中间起到一个调度的作用。
在我们之前的学习中,其实就是把Servlet作为Controller(控制器),把jsp作为View(视图),把javabean作为Model(模型)中的数据,service层作为Model(模型)中的行为。
注意:MVC和三层架构的区别
三层架构是整体后端服务架构,而MVC只是控制了视图和模型之间的关联关系。
可以理解为MVC只工作在三层中的Web层。
二、SpringMVC概述
SpringMVC就是Spring框架提供的一个模块,通过实现MVC模式来很好地将数据、业务与展现进行分离,SpringMVC框架的主要目的是简化Web层开发。
SpringMVC中提供了一种非常好用的组件Controller,它的功能基本与之前使用过的Servlet相同,但是比Servlet更加方便易用。它们都可以用来接受请求、获取参数、操作Session和Cookie、返回响应等。除此之外,SpringMVC还以Controller为核心,提供了一系列支持组件,共同维护Controller的功能。
Controller的优势:
- 可以自定义Controller类型,无需像Servlet必须继承固定父类。
- 可以在一个Controller类中处理多个请求,而Servlet通常一个类只能处理一个请求。
- Controller中方法的参数可以根据自己的需求灵活定义,例如request、response、session等。
- 可以根据请求参数自动封装并传入pojo对象。
- 返回各类响应比Servlet方便,例如内部跳转、重定向、返回JSON格式对象等。
- ……
注意:Controller其本身是不能直接接受HTTP请求的,Controller的实现原理实际上还是依赖于Servlet。可以理解为Controller就是对Servlet进行的封装。
SpringMVC框架跟其他的WebMVC框架一样,都是【请求驱动】,并且设计围绕一个能够分发请求到控制器以及提供其他加快web应用开发功能的核心Servlet(叫做DispatcherServlet,即前端控制器)。
Spring的DispatcherServlet实现比其他框架中还要多的功能。它和spring的ioc容器完全整合,并且允许使用Spring中其他的所有功能。
三、第一个Controller案例
1、搭建工程环境
创建一个新的Maven Web项目,名为springmvc。
2、导入依赖
需要导入的依赖如下:
<!-- Servlet核心依赖 -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<!-- JSTL标签库 -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<!-- Spring依赖 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>4.3.29.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.3.29.RELEASE</version>
</dependency>
3、配置前端控制器
SpringMVC中Controller的核心原理其实很简单,用一个核心Servlet拦截所有请求,再根据请求的URL转发至不同的Controller中进行处理。这个Servlet被称为【前端控制器】。接下来我们需要在web.xml中配置它:
<servlet>
<!-- servlet-name可以自己随便起,和下面servlet-mapping中的name对应即可-->
<servlet-name>SpringMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>SpringMVC</servlet-name>
<!-- 前端控制器拦截所有请求 -->
<url-pattern>/</url-pattern>
</servlet-mapping>
4、定义一个Controller
在com.briup.spring.web.controller包下创建一个类名为HelloController:
public class HelloController implements Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest httpServletRequest,
HttpServletResponse httpServletResponse) throws Exception {
ModelAndView mav = new ModelAndView();
// 设置视图名,也就是要跳转的页面
mav.setViewName("/hello.jsp");
// 向作用域中添加一组参数,用于页面显示
mav.addObject("username", "tom");
return mav;
}
}
Controller是一个用来定义所有Controller控制器规范的接口,其中只有一个方法:handleRequest()
。
该方法类似我们之前在Servlet中service()或doGet()/doPost(),都是请求到来时调用的处理方法。
了解ModelAndView
ModelAndView是一种同时代表模型和视图的对象。我们通常都需要在控制器中指定将哪个模型渲染到哪些视图中,并且决定跳转到哪个视图。SpringMVC对这两项操作进行了封装,以一个ModelAndView对象同时表示两项操作。我们只需要通过设置属性的方式,将需要跳转的视图名称,以及需要展示到前端页面的数据设置到一个ModelAndView对象中即可。
5、将Controller配置到Bean容器中
Controller的作用是代替原先的Servlet接受Http请求,接下来我们需要为这个Controller定义URL映射规则。
我们需要将这个Controller定义到一个Bean容器配置文件中,类似之前Spring部分用到的xml配置文件。
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mv