目录
1. 什么是SpringMVC
SpringMVC是 Spring中的一个模块 , 是对 Servlet 进行了封装
springmvc 是一个基于 mvc 的 web 框架,方便前后端数据的传输.
Spring MVC 拥有控制器,接收外部请求,解析参数传给服务层
那这样就明白了, SpringMVC 原来是web框架啊 , 就跟 servlet 那些一样, 只不过更为简洁了, 下面就来介绍SpringMVC到底是怎样去做的
2. SpringMVC运行流程
先来看一幅图
这就是 SpringMVC的运行流程, 刚看可能有些疑惑, 接着来一一解释
首先我们可以注意到, 上图中的DispatcherServlet , 几乎所有流程都和它紧密相连
我们的所有请求都会先到达DispatcherServlet , 最终也由它来把数据响应回去。
Spring 中提供了org.springframework.web.servlet.DispatcherServlet 类,它从HttpServlet 继承而来,它就是 Spring MVC 中的前端控制器(Frontcontroller)
接着我们来模拟上面的流程
1. 用户发送请求, 请求先到达DispatcherServlet
2. 请求从DispatcherServlet 出来后进入映射处理器
HandlerMapping: DispatcherServlet 自己并不处理请求,而是将请求交给 页面控制器。那么在 DispatcherServlet 中如何选择正确的页面控制器呢? 这件事情就交给HandlerMapping 来做了,经过了 HandlerMapping 处理 之后,DispatcherServlet 就知道要将请求交给哪个页面控制器来处理了。
此步骤主要检查请求有没有配置拦截器, 如果有拦截器就执行拦截器(拦截器后面会说到)
3 ,4. 请求这时会到达处理适配器(负责数据类型转换等),然后到达我们的控制层
HandlerAdapter:经过了 HandlerMapping 处理之后,DispatcherServlet 就获取到了处理器,但是处理器有多种,为了方便调用,DispatcherServlet将这些处理器包装成处理器适配器 HandlerAdapter,HandlerAdapter 调用真正的处理器的功能处理方法,完成功能处理;并返回一个 ModelAndView 对象(包含模型数据、逻辑视图名)
此步骤会根据我们 java 中的类或者其他类型来自动把数据给我们组装好
5. 控制层将处理后的数据返回
现阶段我们可以直接通过控制层将数据返回 , 就不需要图中的5 ,6 步骤了
3. SpringMVC的搭建
maven 先导入SpringMVC的核心依赖
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.2.RELEASE</version>
</dependency>
在 web.xml 配置 DispatcherServlet
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<!--启动时读取spring.xml配置文件-->
<param-value>classpath:spring.xml</param-value>
</init-param>
<!--在服务器启动时创建Servlet-->
<load-on-startup>0</load-on-startup>
</servlet>
<servlet-mapping>
<!--/表示所有请求都进入dispatcherServlet-->
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
创建SpringMVC 开启 SpringMVC注解
<mvc:annotation-driven></mvc:annotation-driven>
这里我们需要设置不能让静态资源进入DispatcherServlet , 例如 . html , . css等文件 , 因为如果让这些文件进入DispatcherServlet的话 , 它们在DispatcherServlet并没有相应的执行流程 , 所以这些资源文件会被直接过滤掉 , 导致我们访问不到 , 所以这里我们需要设置
<mvc:default-servlet-handler/>
设置之后 , 静态资源文件就不会进入DispatcherServlet
在 springMVC-servlet.xml 中配置<mvc:default-servlet-handler />后,会在 Spring MVC 上下文中定义一个 org.springframework.web.servlet.resource.DefaultServletHttpRequest Handler,它会像一个检查员,对进入 DispatcherServlet 的 URL 进行筛查, 如果发现是静态资源的请求,就将该请求转由 Web 应用服务器默认的 Servlet 处理,如果不是静态资源的请求,才由 DispatcherServlet 继续处理。
另外, 如果我们提交的数据里出现中文 , 那么也会出现乱码,所以这里需要在web.xml设置中文乱码处理
<filter>
<filter-name>characterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
4. 控制层注解
以下是一个 控制层 的代码示例
@RestController
@RequestMapping(value = "/login")
public class LoginController {
@Autowired
LoginService loginService;
@PostMapping(value = "/login")
public CommonResult adminLogin(Admin admin, HttpSession session){
CommonResult commonResult;
try {
Admin admin1 = loginService.login(admin);
if(admin1==null){
commonResult=new CommonResult(201,"账号或密码错误",admin1);
}else {
session.setAttribute("admin",admin1);
commonResult=new CommonResult(200,"登录成功",admin1);
}
}catch (Exception e){
commonResult=new CommonResult(500,"登录失败","");
}
return commonResult;
}
}
![](https://i-blog.csdnimg.cn/blog_migrate/c01d4e712f2b57737b47cdce26ff36dd.png)
@RequestMapping 注解是一个用来处理请求地址映射的注解,可用于类或方法上
也可以根据Get方式或者Post方式选择 @GetMapping 或者 @PostMapping
5. Ajax 转 Json
首先需要在 maven 导入 转json需要的 jar
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.1</version>
</dependency>
这里我们需要这样一个注解标签 , @responseBody
@responseBody 注解的作用是将 controller 的方法返回的对象通过适当的转换器转换为指定的格式之后,写入到 response 对象的 body 区,通常用来向异步请求返回 JSON 数据。
使用此注解标签 , 我们不用再手动转 json ,直接 return 我们要返回的数据即可, 如上述控制层例子
因为我们之前使用的是@RestController , 它里面就包含了@responseBody, 所以这里也可以省略, 只需要一个@RestController 即可完成所有功能