(一)什么是MVC?
Model(模型)是应用程序中用于处理应用程序数据逻辑的部分,通常负责在数据库中存储数据
View(视图)是应用程序中处理数据显示的部分,通常视图是依据模型数据创建的。
Controller(控制器)是应用程序中处理用户交互的部分,通常从视图读取数据,控制用户输 ,并向模型发送数据。
(二)什么是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
@GetMapping("/getUser")
public String getUser(User user) {
return user.toString();
}
(3)表单参数传递
@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来重命名前后端的参数值。
@GetMapping("/getName")
public String getName(@RequestParam("n") String name) {
return "Name is " + name;
}
注意:如果一个参数使用@RequestParam,那么默认前端就必须要传入这个参数值,否则网页就会报错。至于为什么,我们可以看一下@RequestParam的源码,如下图:
@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();
}
(6)获取URL中的参数
@PathVariable
和前面get传参并不一样,而是直接路径URL传参,不再是?后面了,就好比下面的两个链接
www.blog_ system.com/user ?userId=1
www.blog_ system.com/user /userId=1
@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+"上传成功";
}
}
(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的区别:
请求重定向--->请求重新定位到资源
请求转发---> 服务器端转发
请求重定向-->地址发生改变
请求转发地址 -->不发生改变
去请求重定向和访问新地址的效果一样,不存在原来的外部资源不能访问
请求转发服务器端转发可能造成外部资源不能访问