MVC 是Model View Controller 的缩写,它是软件工程中的一种软件架构模式,它把软件系统分为模型、试图和控制器三个基本部分。
? Model(模型):是应用程序中处理应用程序数据逻辑的部分。通常模型对象负责在数据库存取数据。
? View(视图):是应用程序中处理数据显示的部分。通常视图是依据数据创建的。
? Controller(控制器):是应用程序中处理用户交互的部分。通常控制器负责从视图读取数据,控制用户输入,并向模型发送数据。
MVC 执行流程:
1. 用户的请求首先先到 Controller
2. Controller 将请求转发给Model
3. Model 处理业务并将数据结果给 Controller
4. Controller 会将数据给 View 引擎
5. View 转换数据生成最终的页面返回给用户
MVC和Spring MVC 的关系
MVC 是一种思想,而Spring MVC是对思想的具体实现
总的来说,Spring MVC是一个实现了 MVC 模式,并继承了 Servlet API 的 Web 框架。既然是 web 框架,那么当用户在浏览器中输入了 url 后,我们的Spring MVC 项目就可以感知到用户的请求。
创建spring boot 项目时,勾选上 Spring Web 模块即可
接下来实现用户到Spring 程序的互联互通:
//让 spring 框架启动时,加载
@Controller
//返回非页面数据
@ResponseBody
//路由规则注册
@RequestMapping("/test")
public class TestController {
@RequestMapping("/hello")
public String sayHello(){
return "hello world";
}
}
这样实现之后,本地访问?localhost:8080/test/hello??时就能打印“hello world"的信息
@RequestMapping 是 Spring Web 应用程序中最常被用到的注解之一,它是用来注册接口的路由映射的。?
路由映射:所谓的路由映射指的是,当用户访问一个url 时,将用户的请求对应到程序中某个类的某个方法的过程就叫做路由映射。
get 请求的 3 种写法:
//写法一
@RequestMapping("/getMethod")
//写法二
@RequestMapping(value = "/getMethod",method = RequestMethod.GET)
//写法三
@GetMapping("/getMehod")
post 请求的 2 中写法
//写法一
@RequestMapping(value = "/postMethod",method = RequestMethod.POST)
//写法二
@PostMapping("/postMethod")
@RequestMapping("/getname1")
public String getName(HttpServletRequest request){
return "Name: "+request.getParameter("name");
}
@RequestMapping("getname")
//此处的参数名需和请求中的参数名相同,多个参数也一样
public String getName(String name){
return "Name: "+name;
}
@RequestMapping("/getparas")
public String getParas(String name,Integer age){
return "Name: "+name+" Age: "+age;
}
//创建一个User类
@Data
public class User {
private String name;
private int age;
private String password;
}
@RequestMapping("user")
public User getUserInfo(User user){
return user;
}
@RequestMapping("/getjson")
//@RequestBody只能修饰参数
public User user(@RequestBody User user){
return user;
}
@RequestMapping("getname")
//value对应的是请求中的参数名
//required=false 参数设置为非必须的(如果不设置,请求中若没有该参数名,则返回400)
public String getName(@RequestParam(value = "n",required = false) String name, @RequestParam(value = "p",required = false) String password){
return "Name: "+name+" Password: "+password;
}
@RequestMapping("/url/{name}/{password}")
public String getinfo(@PathVariable(value = "name") String n,@PathVariable(value = "password") String p){
return n+": "+p;
}
@RequestMapping("file")
public String saveFile(@RequestPart("myfile")MultipartFile file) throws IOException {
//打印myfile
System.out.println(file.getName());
//打印秋招.png
System.out.println(file.getOriginalFilename());
//生成唯一ID | UUID=全球唯一ID -> MAC + 随机种子 + 加密算法
String name=UUID.randomUUID().toString().replace("-","");
name+=file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."));
String path="E:\\image\\"+name;
file.transferTo(new File(path));
return path;
}
@RequestMapping("/cookie")
public String getCookie(@CookieValue(value = "mycookie" ,required = false)String value){
return "Cookie:"+value;
}
@RequestMapping("/set_session")
public String setSession(HttpServletRequest request){
HttpSession session=request.getSession(true);
if(session!=null){
session.setAttribute("name","张三");
return "session set true";
}else {
return "session set false";
}
}
@RequestMapping("/get_session")
public String getSessionValue(@SessionAttribute(value ="name" ,required = false) String value){
return "name: "+value;
}
@RequestMapping("/getheader")
public String getHeader(@RequestHeader(value = "User-Agent",required = false)String user){
return "User-Agent: "+user;
}
forward VS redirect
? forward 是请求转发
? redirect 是请求重定向
使用对比:
@Controller
public class Redirect {
@RequestMapping("/index")
public String index(){
return "redirect:/index.html";
}
@RequestMapping("index2")
public String index2(){
return "forward:/index.html";
}
}
举例说明:
例如你(浏览器)告诉你妈妈(服务器),你想吃牛肉,如果你妈妈,说好,我帮你去买(服务器帮你做),这就是 forward 请求转发;如果你妈妈让你自己去买,那么就是请求重定向.
forward 和 redirect 区别:
? 请求重定向将请求重新定位到资源,请求转发服务器转发
? 请求重定向地址发生变化,请求转发地址不发生变化
? 请求重定向与直接访问新地址效果一致,不存在原来的外部资源不能访问;请求转发服务器端转发有可能造成原外部资源不能访问