目录
ssm:MyBatis + Spring + SpringMVC
1.什么是MVC?
- MVC:是模型(Model),视图(View),控制器(Controller)的简写,是一种软件设计规范
- 是将数据逻辑显示分离的方法来组织代码
MVC:模型(Dao,Service),视图(jsp),控制器(Servlet)
- Model(模型):数据模型提供要展示的数据,因此包含数据和行为。
- View(视图):负责进行模型的展示,一般是我们见到的用户界面,客户想看到的东西.
- Controller(控制器):接收用户的请求委托给模型进行处理,将处理完的数据返回给用户
导入Jar包:
<dependencies>
<!-- 测试 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
<!-- spring-webmvc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.19</version>
</dependency>
<!-- servlet-api -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
</dependency>
<!-- jsp -->
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.2</version>
</dependency>
<!-- jstl-api -->
<dependency>
<groupId>javax.servlet.jsp.jstl</groupId>
<artifactId>jstl-api</artifactId>
<version>1.2-rev-1</version>
</dependency>
</dependencies>
2.第一个MVC程序
- 创建一个web程序配置好Tomcat容器
- 在web.xml进行Servlet配置,并绑定一个SpringMVC的配置程序
<?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> <!-- 关联一个SpringMVC配置文件 --> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:springmvc-servlet.xml</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>springmvc</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> </web-app>
- 在进行编写Controller类
package com.xiao.controller; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.mvc.Controller; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; //注意这里我们需要先导入Controller的接口! public class HelloController implements Controller { @Override public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception { //ModelAndView代表了视图于模型的结合既可以专挑视图也可以携带信息! ModelAndView modelAndView = new ModelAndView(); modelAndView.addObject("msg","HelloSpringMVC"); modelAndView.setViewName("hello");//跳转页面名 return modelAndView; } }
- 进行配置MVC配置文件
<?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"> <!-- 处理映射器 --> <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/> <!-- 处理器适配器 --> <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/> <!--视图解析器:DispatcherServlet给他的ModelAndView 1.信息返回会经过这里进行拼接前缀和后缀以此来找到对应的页面! --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="InternalResourceViewResolver"> <!--前缀--> <property name="prefix" value="/WEB-INF/jsp/"/> <!--后缀--> <property name="suffix" value=".jsp"/> </bean> <bean id="/hello" class="com.xiao.controller.HelloController"/> </beans>
3.SpringMVC原理:
这是当我们进行访问MVC三层架构程序时的基本响应:
- 发送请求,等待服务器响应
- 前端控制器接收到请求委托给处理器处理
- 处理器调用业务对象进行获取处理数据
- 模型返回处理后的数据给处理器
- 处理器返回给前端控制器ModelAndView对象中包含了请求的数据与页面
- 前端控制器把ModelAndView给到视图渲染页面
- 视图返回渲染后的成品页面给前端控制器
- 前端控制器响应用户返回页面
图为SpringMVC较为完整的图,虚线表示我们需要实现的,而实线表示SpringMVC帮我们执行的流程.
- DispatcherServlet表示前置控制器,是整个SpringMVC最核心的控制部分,控制并拦截用户的请求!
- HandlerMapping为处理映射器,DispatcherServlet(调度程序)调用,根据请求url查找Handler(处理程序)
- HandlerExecutionChain表示更加具体的Handler(处理程序)根据url查找控制器
- HandlerExecutionChain找到控制器返回给DispatcherServlet(调度程序)
- HandlerAdapter表示处理器适配器按照特定的规则去运行Handler
- Handler让更加具体的Controller去执行
- Controller将具体信息返回给HandlerAdapter,如:ModelAndView
- HandlerAdapter将具体模型视图传递给DispatcherServlet
- DispatcherServlet调用视图解析(ViewResolver)来解析HandlerAdapter传来的逻辑视图名
- 视图解析(ViewResolver)将解析名传给DispatcherServlet
- DispatcherServlet根据解析结果调用具体视图(View)
- 最终具体视图(View)响应给用户