一、Spring MVC介绍
a. Spring MVC是一个Web框架
b. Spring MVC是基于Servlet API构成的
MVC 是 Model View Controller 的缩写。
MVC 是⼀种思想,⽽ Spring MVC 是对 MVC 思想的具体实现。
学习Spring MVC目标:
a.连接功能:将用户(浏览器)和JAVA程序连接起来,也就是访问一个地址能调用到Spring程序。
b.获取参数的功能:用户访问的时候会带一些参数,在程序中想办法获得这些参数。
c.输出数据的功能:执行了业务逻辑之后,要把程序执行结果返回给用户。
二、连接功能实现
2.1 @RequestMapping 注解介绍
用来注册接口的路由映射
即可修饰类,也可以修饰⽅法
package com.example.demo.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
@RequestMapping("/user")
public class UserController {
@RequestMapping("/sayhi")//路由映射(用户和程序的连接)
@ResponseBody//当前方法返回的是一个非静态页面的数据
public String sayHi(){
return "Hello,Spring MVC";
}
}
@RequestMapping默认支持GET请求,但也支持Post请求
2.2 只支持GET请求
三种写法:
2.3只支持Post请求
二、获取参数实现
2.1 获取单个参数
2.2 获取多个参数(或者表单参数)
2.3 获取对象
定义UserInfo对象:
2.4获取JSON对象
利用postman结果显示如下:
2.5 后端参数重命名(扩展知识)
当前端传递的参数和后端的参数不一致,就可以用这种方式。
使用注解@RequestParam
2.6获取URL中的参数
利用注解@PathVariable
2.7 上传文件(图片)
关键步骤:
a.接受前端传递的文件:
@RequestPart(“file”)MultipartFile file
b.将前端传递过来的文件保存到本地:
file.transferTo(new File(filePath + filename));
第一步:
具体实现:
@Controller
@Slf4j
@ResponseBody//当前方法返回的是一个非静态页面的数据
@RequestMapping("/user")
public class UserController {
@Value("${myfile.path}")
private String filePath;//从配置文件中获取图片的上传路径
@RequestMapping("/upfile")
public boolean upFile(String username, @RequestPart("file")MultipartFile file){
boolean result = false;
try {
//获取原文件的名称
String fileType = file.getOriginalFilename();
//获取文件名称后缀
fileType= fileType.substring(fileType.lastIndexOf("."));
//文件名称
String filename = UUID.randomUUID().toString() + fileType;
file.transferTo(new File(filePath + filename));
result = true;
log.info(username+"上传图片成功!");
} catch (IOException e) {
System.out.println("图片上传失败");
}
return result;
}
用postman模拟:
2.8获取cookie
2.8.1传统方式获取
2.8.2简洁方式获取
使用注解**@CookieValue**
2.9获取请求头header中的信息
使用注解@RequestHeader
2.10 获取Session
使用注解@SessionAttribute
//定义全局的session key
private final String SESSION_KEY = "SESSION_KEY";
/**
* 设置 session
*
* @param request
* @return
*/
@RequestMapping("/setsess")
public boolean setsess(HttpServletRequest request){
boolean result =false;
//1.得到session对象
try {
HttpSession session = request.getSession(true);
session.setAttribute(SESSION_KEY, "java");
result = true;
}catch (Exception e){
log.info("出现了异常:" + e.getMessage());
}
return result;
}
/**
* 获取session
* @param data
* @return
*/
@RequestMapping("/getsess")
public String getSess(@SessionAttribute(name = "SESSION_KEY",required = false) String data){
return data;
}
三、返回数据
默认情况下返回的是一个页面,而不是页面中的数据。
现在因为前后端分离,所以可以只返回数据就可以了。
例如:
综上可以看到,当不加注解时,返回的是一个页面,而不是页面中的数据。
3.1使用注解@ResponseBody
当@ResponseBody加在类上,说明这个类中的所有方法,返回的都是一个非静态页面的数据。
3.2注解@RestController
@RestController = @Controller + @ResponseBody
源码:
使用@RestController一个注解可以代替之前的两个注解
四、请求转发和请求重定向
4.1具体实现
1.forward:请求转发
2.redirect:请求重定向
请求转发的结果:
请求重定向的结果:
4.2 forward和redirect的具体区别
1.请求重定向(redirect)将请求重新定位到资源;请求转发(forward)服务器端转发。
2.请求重定向地址发⽣变化,请求转发地址不发⽣变化。