传统的MVC即Model模型/View视图/Controller控制器,且分别对应JavaBean/JSP/Servlet。(关于更多MVC的知识和图解可以戳这里)
在传统的MVC开发模式中,关键是Controller的编写,即一个个Servlet的编写。这些Servlet都要直接或间接地实现Servlet接口,重写doGet/doPost方法…试想一下,当业务逻辑愈加复杂,Servlet会越来越多,编写和维护都会变得麻烦。
而在SpringMVC框架中,设计者巧妙地将众多Servlet的公共行为抽取出来,成为一个封装好的DispatcherServlet;而对于每个Servlet的特有行为,都写在一个无需实现任何接口的类中即可。
下面的图解或许有助于理解:
首先明确,SpringMVC实现的需求是:接收客户端的请求,业务逻辑的处理,页面视图的跳转
长话短说:
① 导入SpringMVC相关坐标
② 配置SpringMVC核心控制器DispathcerServlet(在web.xml中)
③ 创建Controller类和JSP视图页面,并使用注解配置地址映射
④ 配置SpringMVC核心配置文件spring-mvc.xml(就是为了组件扫描)
⑤ 客户端发起请求(测试)
代码实现:
① 导入SpringMVC相关坐标
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-contextartifactId>
<version>5.0.5.RELEASEversion>
dependency>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-webmvcartifactId>
<version>5.0.5.RELEASEversion>
dependency>
<dependency>
<groupId>javax.servletgroupId>
<artifactId>javax.servlet-apiartifactId>
<version>3.0.1version>
dependency>
<dependency>
<groupId>javax.servlet.jspgroupId>
<artifactId>javax.servlet.jsp-apiartifactId>
<version>2.2.1version>
dependency>
② 配置SpringMVC核心控制器DispathcerServlet(在web.xml中)
<servlet>
<servlet-name>DispatcherServletservlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class>
<init-param>
<param-name>contextConfigLocationparam-name>
<param-value>classpath:spring-mvc.xmlparam-value>
init-param>
<load-on-startup>1load-on-startup>
servlet>
<servlet-mapping>
<servlet-name>DispatcherServletservlet-name>
<url-pattern>/url-pattern>
servlet-mapping>
③ 创建Controller类和JSP视图页面,并使用注解配置地址映射
@Controller
public class UserController {
@RequestMapping("/hello")
public String sayHi() {
System.out.println("Hello >_<");
return "index.jsp";
}
}
④ 配置SpringMVC核心配置文件spring-mvc.xml(目前只为了组件扫描)
<context:component-scan base-package="com.samarua.controller" />
⑤ 客户端发起请求(测试)
>>> 浏览器URL输入:http://localhost:8080/hello
作用:
建立资源路径到某个类的某个方法的映射(代替了之前学的每个Servlet上的url注解)
位置:
- 类上。
- 方法上。
- 即"多级目录"的思想,类上的一级目录与方法上的二级目录进行"拼接",组成完整的资源路径
参数:
- value: 资源路径,这是一个字符串
- method: 请求的方式,常见的有RequestMethod.GET/POST/PUT/DELETE
- param: 用于指定参数需要满足的条件,这是一个表达式数组
举例:
@RequestMapping(value = "/hello", method = RequestMethod.GET, params = {"username", "!sex", "isLoli=true", "age!=12"})
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views" />
<property name="suffix" value=".jsp" />
bean>
服务器端引擎的主要作用:解析请求资源路径;进行Http协议的请求/响应信息与request/response对象的转换。
▶ 流程
① 用户发送请求至前端控制器DispatcherServlet(调度核心)
② DispatcherServlet收到请求调用HandlerMapping处理器映射器
③ 处理器映射器找到具体的处理器,生成到达该处理器执行链并返回给DispatcherServlet
④ DispatcherServlet调用HandlerAdapter处理器适配器
⑤ HandlerAdapter经按照执行链找到具体的处理器
⑥ 处理器执行完成返回ModelAndView(模型和视图)
⑦ HandlerAdapter将处理器执行结果ModelAndView返回给DispatcherServlet
⑧ DispatcherServlet将ModelAndView传给ViewReslover视图解析器
⑨ ViewReslover解析后返回具体View
⑩ DispatcherServlet根据View进行渲染视图(即将模型数据填充至视图中)
⑪ 最终的响应
▶ 组件
前端控制器:DispatcherServlet
用户请求到达了前端控制器,就相当于到达了MVC 模式中的 C。DispatcherServlet是整个流程控制的中心,由它调用其它组件处理用户的请求,DispatcherServlet的存在降低了组件之间的耦合性。
处理器映射器:HandlerMapping
HandlerMapping可以根据用户请求提供的资源路径,映射到真正的处理器,并返回这个执行链
处理器适配器:HandlerAdapter
通过HandlerAdapter对处理器进行实际的执行
处理器:Handler
即Controller,即控制器,即具体的处理逻辑。
视图解析器:View Resolver
View Resolver首先根据逻辑视图名解析成物理视图名,即具体的页面地址,再生成View视图对象,最后对View进行渲染将结果通过页面展示给用户。
视图:View
包括jstlView、freemarkerView、pdfView等,最常用的视图就是 jsp。
More >_<