一、SpringMvc的概述
Spring MVC 是一种基于 Java 的实现 MVC 设计模型的请求驱动类型的轻量级 Web 框架,本质上还是相当于 Servlet。
SpringMVC是Spring基础之上的一个MVC框架,主要处理web开发的路径映射和视图渲染,属于Spring框架中WEB层开发的一部分;
Spring MVC 是结构最清晰的 Servlet+JSP+JavaBean 的实现:
二、MVC的模式
MVC 全名是 Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写, 是一种用于设计创建 Web 应用程序表现层的模式。MVC 中每个部分各司其职:
Model(模型):数据模型,提供要展示的数据,因此包含数据和行为,可以认为是领域模型或 JavaBean组件,不过现在一般都分离开来:Value Object(数据Dao) 和 服务层(行为Service)。也就是模型提供了模型数据查询和模型数据的状态更新等功能,包括数据和业务。
View(视图):负责进行模型的展示,将逻辑视图解析成物理视图并渲染,一般用于展示数据,通常视图是依据模型数据创建的。
Controller(控制器):接收用户请求,委托给模型进行处理,处理完毕后把返回的模型数据返回给视图,由视图负责展示,一般是应用程序中处理用户交互的部分,用于处理程序逻辑的。
三、Spring MVC的特点:
- 轻量级,简单易学
- 高效 , 基于请求响应的MVC框架
- 与Spring兼容性好,无缝结合
- 功能强大:restful、数据验证、格式化、本地化、主题等
- 简洁灵活
Spring MVC框架像许多其他MVC框架一样, 以请求为驱动 , 围绕一个中心Servlet分派请求及提供其他功能,DispatcherServlet是一个实际的Servlet (它继承自HttpServlet 基类)。
DispatcherServlet的作用是将请求分发到不同的处理器。
四、Spring MVC的核心和流程
Spring MVC主要由DispatcherServlet、处理器映射、处理器(控制器)、视图解析器、视图组成。他的两个核心是两个核心:
- 处理器映射:选择使用哪个控制器来处理请求
- 视图解析器:选择结果应该如何渲染
Spring MVC的流程
在web.xml中进行配置springmvc的前端控制器
<? xml version="1.0" encoding="UTF-8"? >
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id="WebApp_ID" version="3.0">
<servlet>
<!--springmvc的前端控制器-->
<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.xml</param-value>
</init-param>
<! -- 表示容器在启动时立即加载Servlet 启动顺序,数字越小,启动越早-->
<load-on-startup>1</load-on-startup>
</servlet>
<! -- 表示 / 会将所有的 URL 请求进行拦截-->
<!--/ 匹配所有的请求;(不包括.jsp)-->
<!--/* 匹配所有的请求;(包括.jsp)-->
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
SpingMvc.xml的配置
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
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/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
<!--
开启springmvc的注解驱动、支持mvc注解驱动
在spring中一般采用@RequestMapping注解来完成映射关系
要想使@RequestMapping注解生效
必须向上下文中注册DefaultAnnotationHandlerMapping
和一个AnnotationMethodHandlerAdapter实例
这两个实例分别在类级别和方法级别处理。
而annotation-driven配置帮助我们自动完成上述两个实例的注入
-->
<mvc:annotation-driven/>
<!--静态处理器、让Spring MVC不处理静态资源-->
<mvc:default-servlet-handler/>
<!--扫描controller层、
配置spring创建容器时要扫描的包,让指定包下的注解生效,由IOC容器统一管理 -->
<context:component-scan base-package="com.htc.controller"></context:component-scan>
<!--springmvc的视图解析器-->
<bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 前缀 -->
<property name="prefix" value="/static/"></property>
<!-- 后缀 -->
<property name="suffix" value=".jsp"></property>
</bean>
<!--文件上传-->
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="5242880"></property>
</bean>
</beans>
编写一个Controller层测试类
package com.htc.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class HelloController {
//真实访问地址 : 项目名/haha
@RequestMapping("/haha")
public String sayHello(Model model){
//向模型中添加属性msg与值,可以在JSP页面中取出并渲染
model.addAttribute("msg","hello,SpringMVC");
//web-inf/jsp/hello.jsp
return "hello";
}
}
- @Controller是为了让Spring IOC容器初始化时自动扫描到;
- @RequestMapping是为了映射请求路径,这里方法上有映射所以访问时应该是/hello;
- 方法中声明Model类型的参数是为了把Action中的数据带到视图中;
- 方法返回的结果是视图的名称hello,加上配置文件中的前后缀变成WEB-INF/static/haha.jsp。
- 前后缀是在web.xml中进行设置的
核心组件:
- 前端控制器(DispatcherServlet)
- 说明:Spring MVC 的入口函数,接收请求,响应结果,相当于转发器,中央处理器,它就相当于mvc模式中DispatcherServlet的存在降低了组件之间的耦合性。
- 处理器映射器(HandlerMapping)
- 说明:根据请求的url查找Handler(即处理器Controller),映射方式有配置文件方式,实现接口方式,注解方式等。
- 请求处理器映射器(HandlerMapping)
- 说明:HandlerAdapter是适配器模式的应用,按照HandlerAdapter要求的规则去执行Handler。
- 处理器适配器(HandlerAdapter)
- 说明:Handler需要开发工程师按照HandlerAdapter的要求去做,是后端控制器,处理具体的业务逻辑。
- 视图解析器(ViewResolver)
- 说明:进行视图解析,首先根据逻辑视图名解析成物理视图名即具体的页面地址,再生成View视图对象,最后对View进行渲染将处理结果通过页面展示给用户。
- 控制器(Controller)
- 负责监听并处理View 的事件,更新和调用 Model;也负责监听 Model的变化(Model从服务器获得数据,并更新 View。
- 视图(View)
- 说明:View是一个接口,实现类支持不同的View类型(jsp、freemarker、pdf等)。
五、SpringMVC中常用注解
- @Controller
- 注解一个类表示控制器,Spring MVC 会自动扫描标注了这个注解的类。
-
@RestController
- 这个是@Controller和@ResponseBody的注解组合,是在
@Controller
基础上,增加了@ResponseBody
注解,更加适合目前前后端分离的架构,提供 restful API ,返回 JSON 数据格式。
- 这个是@Controller和@ResponseBody的注解组合,是在
- @RequestMapping
- 请求路径映射,可以标注类,也可以标注方法,可以指定请求类型(post、get、put、delete、patch...)默认不指定为全部接收。
- @RequestParam
- 用于数据绑定,接收url中的参数(即 Content-Type : application/x-www-form-urlencoded类型的内容),并且前后端参数名称必须相同。
- @RequestBody
- 用于数据绑定,接收body体中的参数,而不是url。所以请求一定是post(即不是 Content-Type : application/x-www-form-urlencoded 类型的内容)
- @ResponseBody
- 放在方法上,表示此方法返回的数据放在body体中,而不是跳转页面。一般用于ajax请求,返回json数据。
- @PathVariable
- 路径绑定变量,用于绑定路径中 “{a}”的变量。
- @RequestHeader
- 放在参数前,用来获取request header中的参数。
- @CoookieValue
- 放在方法参数前,用来获取request header cookie中的参数值。
- @ComponentScan(包名)
- 这个注解是扫描包下的文件