一、Spring MVC简介
什么是MVC
将应用程序分为Model,View,Controller三层,是一种具有松耦合,高重用性,高可适用性的设计模式
Model(模型)----对应组件:JavaBean
View(视图)-----对应组件:JSP或者HTML文件
Controller(控制器)----对应组件:Servlet
MVC优缺点
MVC优点
- MVC三个模块相互独立,松耦合架构
- 多视图共享一个模型,大大提高代码的可重用性
- 控制器提高了应用程序的灵活性和可配置性
- 有利于软件工程化管理
MVC缺点
- 增加了系统结构和实现的复杂性,不适合小型规模的项目
- 视图层与模型之间需要控制器做中间的连接控制,所以效率较低
流程
- 用Controller替换JSP Model2模型中的Servlet
- Controller收到请求后,完成业务处理并用Model模型对象存储处理结果
- Controller调用相应的视图解析器View对处理结果进行视图渲染,最终客户端得到响应信息
二、Spring MVC实现原理
2.1核心组件
DispatcherServlet(前端控制器)
- Spring MVC最核心的类
- web.xml中配置
Handler(处理器)
- 对应MVC中的C(Controller层)
- 作用:实际处理请求
- 标注了@RequestMapping的所有方法都可以看做是一个Handler
ModelAndView
- 模型对象信息
- 逻辑视图名
HandlerMapping(处理器映射器)
- BeanNameUrlHandlerMapping(默认)
- 将请求URL映射到同名的控制器Bean上
- DefaultAnnotationHandlerMapping/RequestMappingHandlerMapping
- 将请求映射到标注@RequestMapping注解的控制器和处理方法上
HandlerAdapter(适配器)
- AnnotationMethodHandlerAdapter
- RequestMappingHandlerAdapter
ViewResolver(视图解析器)
- InternalResourceViewResolver
2.2工作流程
1.用户发送请求至前端控制器DispatcherServlet
2.DispatcherServlet收到请求调用HandlerMapping处理器映射器
3.处理器映射器找到具体的处理器(可以根据xml配置、注解进行查找),生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet
4.DispatcherServlet调用HandlerAdapter处理器适配器
5.HandlerAdapter经过适配调用具体的处理器(Controller,也叫后端控制器)
6.Controller执行完成返回ModelAndView
7.HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet
8.DispatcherServlet将ModelAndView传给ViewReslover视图解析器
9.ViewReslover解析后返回具体View
10.DispatcherServlet根据View进行渲染视图(即将模型数据填充至视图中)
11.DispatcherServlet响应用户
三、第一个Spring MVC程序
我这里是使用注解写的
3.1先导入jar包
<!--SpringMVC-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>5.2.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.2.RELEASE</version>
</dependency>
3.2编写配置文件
在resources目录下创建Spring MVC的配置文件,将文件命名为springmvc-servlet.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!--定义控制器,访问路径为/hello-->
<!--<bean name="/hello" class="controller.HelloController"></bean>-->
<!--开启注解驱动-->
<mvc:annotation-driven></mvc:annotation-driven>
<!--注解扫描的包-->
<context:component-scan base-package="controller"></context:component-scan>
<!--完成视图的对应-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
</beans>
Spring MVC框架底层是基于Servlet实现的,和所有Servlet一样,需要在web.xml文件中配置定义之后才会生效
<!--Spring MVC的核心是一个Servlet,称为前端控制器-->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<!--加载Spring MVC配置文件-->
<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>
3.3编写代码
注意:包名要保持一致。该类通过继承AbstractController标识自己是一个控制器类
@Controller
public class HelloController {
@RequestMapping(value = "/hello")
public String hello() throws Exception{
System.out.println("Spring MVC框架搭建成功。");
//跳转到hello页面
return "hello";
}
}
3.4定义JSP页面用于跳转
文件放置于WEB-INF/jsp目录下
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>我的第一个SpringMVC程序,运行成功啦!</h1>
</body>
</html>
运行项目,在浏览器中输入访问地址http://localhost:8080/springMVC_war_exploded/http://localhost:8080/springMVC_war_exploded/hello,进行测试,若控制台打印出“Spring MVC框架搭建成功”,则表示测试通过,框架搭建完成。然后页面上出现“我的第一个SpringMVC程序,运行成功啦!”
四、前后端数据交互
4.1入参处理
@RequestParam
- name
- value
- required
- defaultValue
@RequestMapping(value = "/toAdd")
public ModelAndView toAdd(@RequestParam(value = "name")String name, ModelAndView modelAndView){
System.out.println("name......."+name);
System.out.println("新增页面搭建成功");
modelAndView.setViewName("add");
return modelAndView;
}
控制台打印出:name.......0 新增页面搭建成功,则表示通过。这里注意的是,未传参数时,会报400,拼接参数时用?进行拼接
4.2出参处理
Model
- 处理方法的入参为Model类型
- 数据结构:Map类型
- 常用方法:添加模型数据
@RequestMapping(value = "/toAdd")
public ModelAndView toAdd(@RequestParam(value = "name")String name, ModelAndView modelAndView){
System.out.println("你好["+name+"]欢迎来到springMVC课堂");
modelAndView.addObject("name",name);
modelAndView.setViewName("add");
return modelAndView;
}
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>新增页面</h1>
<h2>姓名--->${name}</h2>
</body>
</html>
控制台打印出:“你好["星星"]欢迎来到springMVC课堂”。则通过。
常用的注解
@RequestMapping:用于处理请求url映射的注解,可用于类或方法上。用于类上,则表示类中的所有响应请求的方法都是以该地址作为父路径。
@RequestBody:注解实现接收http请求的json数据,将json转换为java对象。
@ResponseBody:注解实现将conreoller方法返回对象转化为json对象响应给客户
@PathVariable:标识接收单个参数
@RequestParams:参数名和请求参数名称不同时使用,可以设置默认值