(一)什么是MVC?
Model(模型)是应用程序中用于处理应用程序数据逻辑的部分,通常负责在数据库中存储数据
View(视图)是应用程序中处理数据显示的部分,通常视图是依据模型数据创建的。
Controller(控制器)是应用程序中处理用户交互的部分,通常从视图读取数据,控制用户输 ,并向模型发送数据。
![](https://img-blog.csdnimg.cn/img_convert/9ff5877cbf5441279580518438122c3f.png)
(二)什么是Spring MVC?
1.构建在 Servlet (API) 之上的
2.是一个 Web 框架 (HTTP)
3.来自于 Spring webMVC 模块
MVC 是一种思想, Spring MVC 是对 MVC 思想的具体实现
总结来说,Spring MVC 是一个实现了 MVC 模式,并继承了 Servlet API 的 Web 框架。
(三)什么是SSM/SM框架?
以前:SSM = Spring + Spring MVC + MyBatis
新 SSM = SpringBoot + Spring Web (Spring MVC) + MyBatis = SSM 项目
更新说法: SM 框架 (Spring Boot[Spring Web] + MyBatis)
注解
@RequestMapping
即可修饰类,也可以修饰方法,当修饰类和方法时,访问的地址是类 + 方法。
@RequestMapping("/hi")//简写,value为"/hi",method为GET
@RequestMapping(value = "/hi",method= RequestMethod.GET)//全写 GET
@RequestMapping(value = "/hi",method= RequestMethod.POST)//全写 POST
@GetMapping 和 PostMapping
GET的三种写法:
@RequestMapping("/hi")//简写,value为"/hi",method为GET
@RequestMapping(value = "/hi",method= RequestMethod.GET)//全写 GET
@GetMapping("/hi") // 直接使用GETMapping的方法
POST的两种写法:
@RequestMapping(value = "/hi",method = RequestMethod.POST)
@PostMapping("/index")// 直接使用PostMapping
获取参数
(1)传递单个参数
传递单个单参数可以用方法中的参数来实现传参
@GetMapping("/getName")
public String getName(String name) {
return "Name is " + name;
}
(2)传递对象
SpringMVC中可以自动实现参数赋值,如下Demo
![](https://img-blog.csdnimg.cn/img_convert/5735b0bafe7b4a88ab3b01d33aa445d2.png)
@GetMapping("/getUser")
public String getUser(User user) {
return user.toString();
}
(3)表单参数传递
![](https://img-blog.csdnimg.cn/img_convert/815b41ee0f384e8a903ef85f2b12a4e6.png)
@GetMapping("/getUser")
public String getUser(String name, int age, String gender) {
User user = new User();
user.setName(name);
user.setAge(age);
user.setGender(gender);
return user.toString();
}
(4)后端参数重命名
假如前端代码的命名不好,需要我们后端重新命名,那么我们就可以通过使用 @RequestParam来重命名前后端的参数值。
![](https://img-blog.csdnimg.cn/img_convert/d1d8843e2a304a0f853a06cdec99ba27.png)
@GetMapping("/getName")
public String getName(@RequestParam("n") String name) {
return "Name is " + name;
}
注意:如果一个参数使用@RequestParam,那么默认前端就必须要传入这个参数值,否则网页就会报错。至于为什么,我们可以看一下@RequestParam的源码,如下图:
![](https://img-blog.csdnimg.cn/img_convert/62c1d10283ee47a3a880d35a3695774d.png)
@GetMapping("/getName")
public String getName(@RequestParam(value = "n",required = false) String name) {
return "Name is " + name;
}
(5)接收JSON对象
接收JSON对象使用 @RequestBody.
注意JSON对象和普通对象不一样。接收的时要使用@RequestBody,当项目后端接受不到数据,就可以考虑是不是注解使用错了。
@RequestMapping(value = "/getUserJson",method = RequestMethod.POST)
public String getUser2(@RequestBody User user) {
return user.toString();
}
![](https://img-blog.csdnimg.cn/img_convert/740cad4eef114fc4a42b627b102160f8.png)
(6)获取URL中的参数
@PathVariable
和前面get传参并不一样,而是直接路径URL传参,不再是?后面了,就好比下面的两个链接
www.blog_ system.com/user ?userId=1
www.blog_ system.com/user /userId=1
![](https://img-blog.csdnimg.cn/img_convert/cd8020a0565e4a1daca3fc810d2408f7.png)
@Controller
@ResponseBody
public class PostMappingDemo {
//{}内的 就是在URL里的参数
@PostMapping("/test/{name}/{password}")
public String test(@PathVariable("name") String name,@PathVariable("password") String passWord) {
System.out.println(name);
System.out.println(passWord);
return name+":"+passWord;
}
//中间可以穿插URL路径
@PostMapping("/show/{username}/and/{password}")
public void test2(@PathVariable("password") String passWord,@PathVariable("username")String name){
System.out.println(name);
System.out.println(passWord);
}
}
(7)上传文件
@RequestPart
@ResponseBody
@Controller
public class PartDemo {
@RequestMapping("/part")
//MultipartFile 是表示文件的一个类
public String partTest(@RequestPart("file") MultipartFile file) throws IOException {
//1.确定文件根路径
String path = "D:\\part";
//2.获取唯一的文件名
String fileName = UUID.randomUUID().toString().replace("-","");
//3,获取文件的后缀
String suffix = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."));
//4.最后的文件路径+文件名+文件后缀进行保存
file.transferTo(new File(path+fileName+suffix ));
return path+fileName+suffix+"上传成功";
}
}
![](https://img-blog.csdnimg.cn/img_convert/49fdcdd6ae7d4cea9d4639bc66c60bb1.png)
(8)Cookie/Session/header
Servlet中获取Request 和 Response对象在SpringMVC中也是可以使用的
①获取Cookie的两种方式
//1,Servlet时代 --- 获取Cookie对象
@RequestMapping("/getCookies1")
public void getCookies1(HttpServletRequest request, HttpServletResponse response) {
Cookie[] cookies = request.getCookies();
//获取所有的cookie
for (Cookie cookie:cookies){
System.out.println(cookie.getName()+":"+cookie.getValue());
}
}
//2.MVC时代 --- @Cookie注解
@RequestMapping("/getCookies2")
public void getCookies2(@CookieValue("name") String name) {
System.out.println("name:" + name);
}
②获取Header的两种方式
//1.Servlet时代 --- 获取Headers
@RequestMapping("/getHeader1")
public String getHeader1(HttpServletRequest request) {
String userAgent = request.getHeader("User-Agent");
System.out.println(userAgent);
return userAgent;
}
//2.SpringMVC时代 --- 获取Headers
@RequestMapping("/getHeader2")
public String getHeader2(@RequestHeader("User-Agent") String userAgent) {
System.out.println(userAgent);
return userAgent;
}
③Session的存储和获取
Session的存储和Servlet类似,都是使用HttpServletRequest来获取的
//1.设置Session
@RequestMapping("setSession")
public String setSession(HttpServletRequest request) {
//设置HttpSession对象参数为 true (表示没有Session对象就创建一个session)
HttpSession session = request.getSession(true);
if (session != null) {
session.setAttribute("userName", "GoodMan");
}
return "session存储成功";
}
//2.读取Session
@RequestMapping("getSession")
public String getSession1(HttpServletRequest request) {
//获取的时候要设置参数为 false (表示没有session也不重新创建)
HttpSession session = request.getSession(false);
String ret = "暂无 session 会话";
if (session != null && session.getAttribute("userName") != null) {
ret = "Session userName:" +
q String.valueOf(session.getAttribute("userName"));
}
return ret;
}
//3.使用注解读取Session -- 相比较而言就是简写了
@RequestMapping("getSession2")
public String getSession2
(@SessionAttribute(value = "userName", required = false) String userName) {
return "Session userName:" + userName;
}
返回页面/数据
@ResponseBody
返回前端页面(text/html): return "/index.html" 也就是返回一个 前端的页面文件路径
返回数据:return "hello" 返回的是 数据内容
注意当我们返回的内容是数据的时候,要加@ResponseBody注解
组合注解:@RestController = @Controller+@ResponseBody
请求/转发的实现
return不仅可以返回一个视图,还可以实现跳转。
forward:请求转发
redirect:请求重定向
注意下面代码的格式
//注意请求转发/重定向,是不能加@RequestBody的
@Controller
public class Demo {
//请求转发
public String index1() {
return "redirect:/index.html";
}
//请求重定向
public String index2() {
return "forward:/index.html";
}
}
forward和 redirect的区别:
请求重定向--->请求重新定位到资源
请求转发---> 服务器端转发
请求重定向-->地址发生改变
请求转发地址 -->不发生改变
去请求重定向和访问新地址的效果一样,不存在原来的外部资源不能访问
请求转发服务器端转发可能造成外部资源不能访问