一、什么是MVC --一种软件设计规范
MVC:将业务逻辑、数据、显示分离的方式进行组织代码
模型(model)--包括数据和行为 (dao和service)
视图(View)--负责模型图形界面的显示、用户见到的图形界面
控制器(Controller)---接收用户请求 将数据传递给模型进行处理 处理后的模型数据再返回给
视图,由视图负责展示
主要作用:降低视图与业务逻辑之间的双向耦合
经典MVC: JSP + servlet + javabean 的模式
二、职责分析
control:控制器
1.获取表单数据
2.调用业务逻辑
3.转向指定的页面
model:模型
1.业务逻辑
2.保存数据的状态
View:视图
显示 页面效果
SpringMVC容器 和 Spring容器架构图
三、SpringMVC执行流程图|执行原理图
整体流程:
- 用户向前端控制器发送请求
- 前端控制器接收到请求后调用处理映射器
- 处理器映射器找到具体的处理器,生成处理器对象以及处理器拦截器,再一起返回给前端控制器
- 然后前端控制器调用处理器适配器
- 处理器适配器调用具体的处理器
- 处理器适配器将处理器执行结果ModelAndView返回给前端控制器
- 然后前端控制器将ModelAndView传给视图解析器解析View
- 前端控制器将视图解析器返回的View进行渲染,然后响应给用户
四、入门程序
基础版--无注解
1.导入jar包
2.web.xml配置
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 配置servlet初始化参数 加载springmvc.xml文件 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
</servlet>
<!-- 设置请求拦截 /* 表示拦截所有请求 / 表示拦截除了JSP文件以外的请求 -->
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
3.编写后端控制器
package com.gec.controller;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
// 后端控制器
public class HomeController implements Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
// 视图模型 模型model 负责存储数据 view 视图
ModelAndView mdv = new ModelAndView();
// 逻辑视图 该模式下的 MVC配置文件中的视图解析器必须进行前缀和后缀配置 否则存在找不到路径
mdv.setViewName("index"); // 推荐使用方式
// 物理路径 视图
// mdv.setViewName("/WEB-INF/jsp/index.jsp"); // 全路径 真实的JSP路径 该方式 在核心配置文件中可以不用进行 视图解析器配置 否则路径进行拼接后路径不存在
return mdv;
}
}
4.springmvc.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"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- SpringMVC 核心配置文件 原始配置方式-->
<!-- 配置 后端控制器 -->
<bean name="/home" class="com.gec.controller.HomeController"/>
<!-- 配置处理器映射 负责寻找后端控制器 -->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
<!-- 配置适配处理器 负责执行找到的后端控制器 -->
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
<!-- 配置视图解析器 解析 modeladnView
/ WEB-INF/JSP/index.html 解析网页路径
-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 前缀 -->
<property name="prefix" value="/WEB-INF/JSP/"/>
<!-- 后缀 -->
<property name="suffix" value=".jsp"/>
</bean>
</beans>
5.显示页面JSP显示
<%--
Created by IntelliJ IDEA.
User: Administrator
Date: 2024/9/3
Time: 17:14
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>SpringMVC</title>
</head>
<body>
<h3>SpringMVC........</h3>
</body>
</html>
6.项目结构
简化版-使用注解方式
基于基础版的改进
springmvc.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:p="http://www.springframework.org/schema/p"
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">
<!--简化模式 直接开启注解扫描 在后端控制器使用注解进行配置 省去最初的自己进行配置不用的模块以及 不用实现或者继承后端控制器接口或抽象类 -->
<context:component-scan base-package="com.gec"/>
<!-- 开启注解驱动 -->
<mvc:annotation-driven/>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 前缀 -->
<property name="prefix" value="/WEB-INF/JSP/"/>
<!-- 后缀 -->
<property name="suffix" value=".jsp"/>
</bean>
<!-- SpringMVC 精简配置方案 直接开启注解扫描 在后端控制器部分加上注解-->
</beans>
配置文件中,直接使用注解扫描方式,减少了后端控制器、处理映射器、适配处理器的手动配置
后端控制器代码的改进:
package com.gec.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
// 后端控制器
@Controller // 标记该类是一个后端控制器 使用注解方式
public class HomeController {
@RequestMapping("/home") // 请求映射
public ModelAndView modelAndView(){
ModelAndView mdv = new ModelAndView();
mdv.setViewName("index");
return mdv;
}
}
运行效果: