1.什么是 Spring MVC
- Spring MVC 是一个 Web 框架
- Spring MVC 是基于 Servlet API 构建的
1.MCV 定义
MVC: Model View Controller 翻译中文就是"模型 ,视图, 控制器",它是一种设计模式,这种设计模式将软件(项目) 分为三部分: 模型,视图和控制器
2. MVC 和 Spring MVC 的关系
MVC 是一种设计思想,而 Spring MVC 是一个具体的实现框架
Spring MVC 是一个基于 MVC 设计模式和 Servlet API 实现的 Web 项目, 同时 Spring MVC 又是 Spring 框架中的一个 Web 模块, 它是随着 Spring 的诞生而存在的一个框架
Spring 和 Spring MVC 诞生的历史是比较久远,在他们之后才有了 Spring Boot
2. 为什么要学 Spring MVC
现在绝大部分的 Java 项目都是基于 Spring(或者 Spring Boot)的,而Spring 的核心就是 Spring MVC,也就是说 Spring MVC 是 Spring 框架的核心模块,而Spring Boot 是 Spring 的脚手架,因此可以推断出,现在市面上绝大部分的Java 项目约等于 Spring MVC 项目,这是我们要学 Spring MVC的原因
3.怎么学 Spring MVC
- 实现用户和程序的映射(在浏览器输入 URL 地址之后,能够在程序中匹配到相应方法)
- 服务器端要得到用户的请求参数
- 服务器端要将结果返回给用户(前端)
1. Spring MVC 创建和连接
① 创建 Spring MVC 项目
基于 Spring Boot 框架添加一个 Spring Web(它使用的就是 Spring MVC)依赖,此时项目就变成了 Spring MVC项目
②@RequsetMapping 注解介绍
@RequsetMapping 是 Spring Web 应用程序中最常被用到的注解之一,它是用来注册接口的路由映射的
@Controller
@ResponseBody
public class UserController {
@RequestMapping("sayhi")
public String syahi(){
return "hello Spring MVC";
}
}
结果
@RequsetMapping 即可修饰类, 也可以修饰方法,当修饰类和方法时,访问方式是 类 + 方法
@RequsetMapping 也可以直接修饰方法
③RequsetMapping 是 post 还是 get 请求
@RequsetMapping 特征:
- @RequsetMapping 既能修饰类(可选)也能修饰方法
- 默认情况下 @RequsetMapping 即支持 POST 请求方式, 也支持 GET 请求方式
@RequsetMapping 参数扩展(只支持某种类型的请求方式, 比如 POST 类型的请求方式)
@RequestMapping(value = "/sayhi2",method = RequestMethod.POST)
public String syahi2(){
return "method : Post";
}
结果
④@GetMapping 和PostMapping
get 请求的 3 种 写法:
//写法1
@RequestMapping("sayhi")
//写法2
@RequestMapping(value = "/sayhi2",method = RequestMethod.GET)
//写法3
@GetMapping("sayhi3")
结果
Post 请求的2中写法
//方法1
@RequestMapping(value = "/sayhi2",method = RequestMethod.POST)
//方法2
@PostMapping("sayhi4")
结果
2.获取参数
①传递单个参数/多个对象
@RequestMapping("/getuserbyid")
public UserInfo getUserById(Integer id){
UserInfo userInfo = new UserInfo();
userInfo.setId(id == null? 0 : id);
userInfo.setName("张三");
userInfo.setAge(18);
return userInfo;
}
结果
获取多个参数
@RequestMapping("/login")
public String login(String username, String password){
return "用户名: " + username + "| 密码: " + password;
}
结果
②传递对象
@RequestMapping("/reg")
public String reg(UserInfo userInfo){
return "用户信息: " + userInfo;
}
结果
⑤设置参数必传@RequsetParam
使用 @RequestParam 注解
@RequestMapping("/login")
public String login(@RequestParam("name") String username, String password){
return "用户名: " + username + "| 密码: " + password;
}
结果
@RequsetParam 注意事项:
如果在参数中添加 @RequsetParam 注解,那么前端一定要传递此参数,否则就会报错,如果想要解决此问题,可以给 @RequestParam 里面添加 required = false
@RequestMapping("/login")
public String login(@RequestParam(value = "name",required = false) String username, String password){
return "用户名: " + username + "| 密码: " + password;
}
⑥@RequestBody 接收JSON对象
使用 Postman 模拟发送 JSON 数据给服务器
服务器端实现 JSON数据的接收需要使用 @RequsetBody 注解
@RequestMapping("/reg")
public String reg(@RequestBody UserInfo userInfo){
return "用户信息: " + userInfo;
}
结果
⑦获取URL中参数@Pathvariable
从 URL 地址找中获取参数(不是从 URL 地址中的参数部分获取参数)
@RequestMapping("/hero/{id}/{name}")
public String getHeroInfo(@PathVariable Integer id, @PathVariable String name){
return "ID : " + id + " | name: " + name;
}
结果
⑧上传文件@RequsetPart
@RequestMapping("/uping")
public boolean upImg(Integer uid, @RequestParam("img")MultipartFile file){
boolean result = false;
//得到图片的名字
String fileName = file.getOriginalFilename();
//得到图片的后缀名
fileName = fileName.substring(fileName.lastIndexOf("."));
fileName = UUID.randomUUID().toString() +fileName;
//保存到本地
try {
file.transferTo(new File(imgPath + fileName));
} catch (IOException e) {
log.error("上传图片失败" + e.getMessage());
}
return true;
}
结果
⑨获取Cookie/Session/header
Cookie获取
//方法1
@RequestMapping("/cookie")
public void getCookie(HttpServletRequest req){
Cookie[] cookies = req.getCookies();
for(Cookie cookie : cookies){
log.info("cookie : name" + cookie.getName() + " value : "+ cookie.getValue());
}
}
//方法2
@RequestMapping("/cookie2")
public String getCookie(@CookieValue("wei")String cookie){
return "Cookie : " + cookie;
}
结果
方法1:
方法2:
header获取
//方法1
@RequestMapping("/getua")
public String getHead(HttpServletRequest req){
return "header : " + req.getHeader("User-Agent");
}
//方法2
@RequestMapping("/getua1")
public String getHead1(@RequestHeader("User-Agent")String userAgent){
return "header: " + userAgent;
}
结果
Session存储\获取
存储 Seesion代码实现:
@RequestMapping("/setsess")
public boolean setSession(HttpServletRequest req){
boolean result = false;
HttpSession session = req.getSession(true);
session.setAttribute("userInfo","张三");
result = true;
return result;
}
获取 Session 方法1(Servlet 模式)
@RequestMapping("/getsess")
public String getSeesion(HttpServletRequest req){
String result = null;
HttpSession session = req.getSession(false);
if(session != null && session.getAttribute("userInfo") != null){
result = (String) session.getAttribute("userInfo");
}
return result;
}
获取 seesion 方式2: @SeesionAttribute
@RequestMapping("/getsess2")
public String getSeesion2(@SessionAttribute(value = "userInfo", required = false)String userinfo){
return "会话: " + userinfo;
}
结果
3.返回数据
①返回静态页面
@RequestMapping("/sayhi6")
public String syahi(){
return "hello.html";
}
结果
反回一个非静态页面的数据
②返回 text/html
html页面
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<form action="http://localhost:8080/calc">
<h1>计算器</h1>
数字1:<input name="num1" type="text"><br>
数字2:<input name="num2" type="text"><br>
<input type="submit" value=" 点击相加 ">
</form>
</body>
</html>
java代码
@RequestMapping("/calc")
public String sum(Integer num1, Integer num2){
return "<h1> 计算结果: "+ (num1 + num2) +"</h1>" + "<a href = 'javascript: history.go(-1);'>返回'</a>";
}