一、回顾MVC
1. 简介
是模型、视图、控制器的简写,是一种软件设计规范
是用将显示、业务逻辑、数据分离的方法来组织代码
主要作用是降低了视图与业务逻辑间的双向耦合
最典型的MVC:JSP+Servlet+JavaBean
2. 包括
2.1 Model
模型,包括数据DAO和业务逻辑Service,
提供要展示的数据,因此包括数据和行为
2.2 View
视图JSP
2.3 Controller
控制器Servlet,接收用户请求,委托给模型进行处理,处理完毕后把模型返回的数据返回给视图,由视图负责展示
3. Model2时代
3.1 流程
- 用户发请求
- Servlet接收请求数据,并调用对应的业务逻辑方法
- 业务处理完毕,返回更新后的数据给Servlet
- Servlet跳转到jsp,由jsp来渲染页面
- 响应更新后的页面给前端
3.2 职责
Controller
- 取得表单数据
- 调用业务逻辑
- 转向指定的页面
Model
- 业务逻辑
- 保存数据的状态
View
- 显示页面
4. MVC框架要做的事情
- 将url映射到java类或java的方法
- 封装用户提交的数据
- 处理请求–调用相关的业务处理–封装响应数据
- 将响应的数据进行渲染
二、回顾Servlet
三、SpringMVC简介
SpringMVC是Spring Framework的一部分,是基于Java实现MVC的轻量级Web框架
SpringMVC的web框架围绕DispatcherServlet设计
Dispatcher的作用是将请求分发到不同的处理器,其本质也是一个Servlet,因为其顶层实现了HttpServlet
SpringMVC以请求为驱动,围绕着一个中心Servlet分派请求及提供其他功能
四、HelloSpringMVC
步骤
1. 导入相关Jar包
- junit
- springmvc
- jsp
- servlet
- jstl
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.9</version>
</dependency>
<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
</dependency>
<!-- https://mvnrepository.com/artifact/javax.servlet/jsp-api -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jsp-api</artifactId>
<version>2.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/javax.servlet/jstl -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
</dependencies>
2. 配置web.xml
注册DispatcherServlet
在DispatcherServlet里绑定springmvc.xml、设置启动级别
<!--配置DispatcherServlet请求分发器 前端控制器-->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--要绑定Spring配置文件-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mvc.xml</param-value>
</init-param>
<!--启动级别-->
<load-on-startup>1</load-on-startup>
</servlet>
<!--
在SpringMVC中
/:只匹配所有请求,不会去匹配jsp页面
/*:匹配所有的请求,包括jsp页面
如果我们在浏览器端要访问一个jsp页面,应该直接跳转到jsp页面,而不是走Servlet,因此用/
-->
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
3. 配置springmvc.xml
- 配置处理器映射器
- 配置处理器适配器
- 配置视图解析器
<!--处理器映射器-->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
<!--处理器适配器-->
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
<!--视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
4. 写Controller类
public class HelloController implements Controller
{
@Override
public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
ModelAndView modelAndView = new ModelAndView();
//业务
String hello="helloSpringmvc";
modelAndView.addObject("msg",hello);
//跳转
modelAndView.setViewName("hello");
return modelAndView;
}
}
5. 在springmvc.xml中配置controller的bean
<!--BeanNameUrlHandlerMapping 要求配置该bean,要来这里找-->
<bean id="/hello" class="com.xk.controller.HelloController"></bean>
6. 写JSP
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
${msg}
</body>
</html>
五、SpringMVC原理
1. 原理简述
-
用户发起请求,请求被前置的控制器(DispatcherServlet)拦截,根据请求参数生成代理请求
-
找到请求对应的实际控制器(Controller),控制器处理请求,创建数据库模型,访问数据库,将响应相应给中心控制器
-
控制器使用 模型 与 视图渲染 视图结果
-
将结果返回给中心控制器
-
中心控制器将结果返回给请求者
2. 执行原理
-
用户发出请求,DispatcherServlet接受请求,并拦截请求
我们假设请求的url为 : http://localhost:8080/SpringMVC/hello 该url将被拆分成三部分: 服务器域名:http://localhost:8080 部署在服务器上的web站点:SpringMVC 控制器:hello 通过分析,如上url表示为:请求位于服务器localhost:8080上的SpringMVC站点的hello控制器。
-
DispatcherServlet调用处理器映射器HandlerMapping,HandlerMapping根据url查找Handler
根据: http://localhost:8080/SpringMVC/hello
-
HandlerExecution表示具体的Handler,去查找控制器
查找到的控制器为hello
-
HandlerExecution将解析后的信息传递给DispatcherServlet
解析控制器的映射,即 <bean id="/hello" class="com.xk.controller.HelloController"></bean>
-
处理器适配器HandlerAdapter根据特定的规则去执行Handler
-
Handler让具体的Controller执行
让实现了Controller接口的HelloController类中,实现Controller接口方法的方法执行
-
Controller将具体的执行信息返回给HandlerAdapter,如ModelAndView
modelAndView.addObject("msg",hello); //跳转 modelAndView.setViewName("hello");
-
HandlerAdapter将视图逻辑名或模型传给DispatcherServlet
-
DispatcherServlet用视图解析器ViewResolver来解析HandlerAdapter传给DispatcherServlet的视图逻辑名
解析结果=prefix+视图逻辑名+suffix 即视图逻辑名:hello,解析结果:/WEB-INF/jsp/hello.jsp
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/jsp/"></property> <property name="suffix" value=".jsp"></property> </bean>
-
ViewResolver将解析结果传回给DispatcherServlet
-
DispatcherServlet根据视图解析器解析的视图结果,调用具体的视图
-
最终视图呈现给用户