一. SpringMVC 定义
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 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"的信息
2.1 @RequestMapping 注解介绍
@RequestMapping 是 Spring Web 应用程序中最常被用到的注解之一,它是用来注册接口的路由映射的。
get 请求的 3 种写法:
//写法一 @RequestMapping("/getMethod") //写法二 @RequestMapping(value = "/getMethod",method = RequestMethod.GET) //写法三 @GetMapping("/getMehod")
post 请求的 2 中写法
//写法一 @RequestMapping(value = "/postMethod",method = RequestMethod.POST) //写法二 @PostMapping("/postMethod")
三. 参数的获取
3.1 传递单个/多个参数
@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; }
3.2 传递一个对象
//创建一个User类 @Data public class User { private String name; private int age; private String password; } @RequestMapping("user") public User getUserInfo(User user){ return user; }
3.3 @RequestBody 接收JSON对象
@RequestMapping("/getjson") //@RequestBody只能修饰参数 public User user(@RequestBody User user){ return user; }
3.4 参数重命名
@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; }
3.5 从URL中获取参数-@PathVariable
@RequestMapping("/url/{name}/{password}") public String getinfo(@PathVariable(value = "name") String n,@PathVariable(value = "password") String p){ return n+": "+p; }
3.6 上传文件-@RequestPart
@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; }
3.7 获取cookie - @CookieValue
@RequestMapping("/cookie") public String getCookie(@CookieValue(value = "mycookie" ,required = false)String value){ return "Cookie:"+value; }
3.8 session 的获取与存储-@SessionAtribute
@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; }
3.9 获取header-@RequestHeader
@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 区别:
• 请求重定向将请求重新定位到资源,请求转发服务器转发
• 请求重定向地址发生变化,请求转发地址不发生变化
• 请求重定向与直接访问新地址效果一致,不存在原来的外部资源不能访问;请求转发服务器端转发有可能造成原外部资源不能访问