mvc设计模式 MVC 设计不仅限于 Java Web 应用,还包括许多应用,比如前端、PHP、.NET 等语言。之所以那么做的 根本原因在于各个模块的解耦。 MVC 是 Model、View 和 Controller 的缩写,分别代表 Web 应用程序中的 3 种职责。 模型:用于存储数据以及处理用户请求的业务逻辑。 视图:向控制器提交数据,显示模型中的数据。 控制器:根据视图提出的请求判断将请求和数据交给哪个模型处理,将处理后的有关结果交给哪个 视图更新显示。 Spring MVC Spring MVC 实现了即用的 MVC 的核心概念。它为控制器和处理程序提供了大量与此模式相关的功能。 并且当向 MVC 添加反转控制(Inversion of Control,IoC)时,它使应用程序高度解耦,提供了通过简 单的配置更改即可动态更改组件的灵活性。 Spring MVC 框架是高度可配置的,包含多种视图技术,例如 JSP 、Velocity、themlefy等。Spring MVC 框架并不关心使用的视图技术,也不会强迫开发者只使用 JSP 技术,但教程中使用的视图是 JSP。 本节主要介绍 Spring MVC 框架处理用户请求的完整流程和处理中包含的 4 个接口。 Spring MVC初学重点掌握的4个接口
- DispatcherServlet
Spring MVC 所有的请求都经过 DispatcherServlet 来统一分发,在 DispatcherServlet 将请求分发 给Controller之前需要借助 Spring MVC 提供的 HandlerMapping 定位到具体的 Controller。 - HandlerMapping
HandlerMapping 接口负责完成客户请求到 Controller 映射。 - Controller
Controller接口将处理用户请求,这和 Java Servlet 扮演的角色是一致的。一旦 Controller 处理完 用户请求,将返ModelAndView 对象给 DispatcherServlet 前端控制器,ModelAndView 中包含了 模型(Model)和视图(View)。从宏观角度看DispatcherServlet是整个 Web 应用的控制器;从 微观考虑,Controller 是单个 Http 请求处理过程中的控制器,而 ModelAndView 是 Http 请求过 程中返回的模型(Model)和视图(View)。 - ViewResolver
ViewResolver 接口(视图解析器)在 Web 应用中负责查找 View 对象,从而将相应结果渲染给用 户。 Spring MVC 的工作流程如下: - 用户发送请求至前端控制器DispatcherServlet。
- DispatcherServlet收到请求,调用HandlerMapping处理器映射器。
- 处理器映射器找到具体的处理器,生成处理器对象及处理器拦截器一并返回给DispatcherServlet。
- DispatcherServlet调用HandlerAdapter适配器。
- HandlerAdapter经过适配调用具体的处理器(一般是开发人员编写的Controller)。
- Controller执行完成返回ModelAndView。
- HandlerAdapter将Controller执行结果ModelAndView返回给DispatcherServlet。
- DispatcherServlet将ModelAndView传给ViewReslover视图解析器。
- ViewReslover解析后返回具体View。
- DispatcherServlet根据View进行渲染视图。
- DispatcherServlet响应用户。
DispatcherServlet也是整个Spring MVC的核心,它负责接收HTTP请求组织协调Spring MVC的各个组成 部分。 Spring MVC环境搭建: 1、 创建JavaWeb应用 2、 引入Jar包 在web/WEB-INF 目录下新建 lib 目录,导入Spring的Jar包(建议先排除 spring-webflux_5.2.9.RELEASE.jar):然后把lib目录通过右键菜单的 ”Add as Library“添加为项目的Library 3、 创建Spring MVC的配置文件springMVC-servlet.xml 在src目录下创建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:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.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 ">
<!--添加了MVC命名空间后 必须!!!!!添加mvc:annotation-driven-->
<mvc:annotation-driven/>
<!--配置扫描路径-->
<context:component-scan base-package="com.wjg.controller,com.wjg.exception"/>
<!--配置视图解析器 jsp-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--配置视图路径的前缀 WEB-INF下的一切都是受保护的,浏览器无法访问-->
<property name="prefix" value="/WEB-INF/jsp/"/>
<!--后缀 -->
<property name="suffix" value=".jsp"/>
</bean>
</beans>
4、 在web.xml中配置Spring MVC
<?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>SpringMvc</servlet-name>
<!--核心--> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--Servlet的初始参数 SpringMVC中用于指定要加载的配置文件如果不知道,默认加载/WEB-INF/springMVC-servlet.xml-->
<init-param>
<param-name>contextConfigLocation</param-name>
<!-- classpath默认指向src目录 指定目录文件-->
<param-value>classpath:springmvc-servlet.xml</param-value>
</init-param>
<!--在JavaWeb项目启动时加载-->
<!-- 加载顺序为第一位-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>SpringMvc</servlet-name>
<!--匹配所有路径请求-->
<url-pattern>/</url-pattern>
</servlet-mapping>
5、 编写Controller
@Controller //向Spring容器注册控制器
@RequestMapping("/indexController")
public class indexcontroller {
//处理请求路径地址映射的注解
@RequestMapping("/login")
public String login(Model model){
model.addAttribute("msg","登录");
//根据配置的视图解析器 prefix+返回值+suffix
// 指向 /WEB-INF/jsp/login.jsp
return "login";
}
}
6、 在web/WEB-INF/jsp 目录下添加login.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>login</title>
</head>
<body>
login msg:${msg}
</body>
</head>
往index.jap添加请求路径
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<c:set var="ctx" value="${pageContext.request.contextPath}" scope="page" />
<html>
<head>
<title>Title</title>
</head>
<body>
<%-- ${ctx}为jstl标签代表localhost:8080/springMVC项目根目录路径
indexController对应的控制器,login对应的方法--%>
<a href="${ctx}/indexController/login">login(跳转)</a>
</html>
</body>
7、 点击跳转a标签后 测试结果
|