目录
1. 什么是SpringMVC
SpringMVC是 Spring中的一个模块 , 是对 Servlet 进行了封装
那这样就明白了, SpringMVC 原来是web框架啊 , 就跟 servlet 那些一样, 只不过更为简洁了, 下面就来介绍SpringMVC到底是怎样去做的
2. SpringMVC运行流程
先来看一幅图
这就是 SpringMVC的运行流程, 刚看可能有些疑惑, 接着来一一解释
首先我们可以注意到, 上图中的DispatcherServlet , 几乎所有流程都和它紧密相连
我们的所有请求都会先到达DispatcherServlet , 最终也由它来把数据响应回去。
接着我们来模拟上面的流程
1. 用户发送请求, 请求先到达DispatcherServlet
2. 请求从DispatcherServlet 出来后进入映射处理器
此步骤主要检查请求有没有配置拦截器, 如果有拦截器就执行拦截器(拦截器后面会说到)
3 ,4. 请求这时会到达处理适配器(负责数据类型转换等),然后到达我们的控制层
此步骤会根据我们 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
另外, 如果我们提交的数据里出现中文 , 那么也会出现乱码,所以这里需要在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;
}
}
@Controller 用于标记在一个类上,使用它标记的类就是一个 SpringMVC Controller 对象
这里使用的是 @RestController , 它是一个组合注解,包括以下注解
@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
使用此注解标签 , 我们不用再手动转 json ,直接 return 我们要返回的数据即可, 如上述控制层例子
因为我们之前使用的是@RestController , 它里面就包含了@responseBody, 所以这里也可以省略, 只需要一个@RestController 即可完成所有功能