SpringMVC 程序开发
SpringMVC 程序开发
文章目录
- SpringMVC 程序开发
- 什么是SpringMVC?
- MVC定义
- MVC和Spring MVC的关系
- 为什么要学Spring MVC?
- 怎么学习Spring MVC
- Spring MVC创建和连接
- @RequestMapping注解
- @RequestMapping是post还是get请求
- 获取参数
- 返回数据
- @ResponseBody 说明
- 组合注解:@RestController
什么是SpringMVC?
- Spring MVC 是一个 Web 框架。
- Spring MVC 是基于 Servlet API 构建的。
然而要真正的理解什么是 Spring MVC? 我们首先要搞清楚什么是 MVC?
MVC定义
- 它是一种软件工程架构模式,它把系统分为模型,视图和控制器三个基本部分
- Model(模型)是应用程序中用于处理应用程序数据逻辑的部分。通常模型对象负责在数据库中存取数据
- View(视图)是应用程序中处理数据显示的部分。通常视图是依据模型数据创建的
- Controller(控制器)是应用程序中处理用户交互的部分。通常控制器负责从视图读取数据,控制用户输入,并向模型发送数据
MVC和Spring MVC的关系
- MVC是一种思想,而Spring MVC是对MVC思想的具体体现
- Spring MVC是一个实现MVC模式,并继承了Servlet API的Web框架。既然是Web框架,那么当用户在浏览器中输入url之后,我们的Spring MVC项目就可以感知到用户的请求
为什么要学Spring MVC?
大部分 Java 项目基于 Spring(或 Spring Boot),而 Spring 的核心是 Spring MVC,Spring Boot 是 Spring 的脚手架,所以市面上绝大部分 Java 项目相当于 Spring MVC 项目,这是学习 Spring MVC 的原因。创建 Spring Boot 项目时勾选的 Spring Web 框架就是 Spring MVC 框架,简言之,学习 Spring MVC 是因为它是 Spring、Spring Boot 项目的基础
- 简单的来说,我们之所以要学Spring MVC 是因为它是一切项目的基础,我们以后要创建的所有Spring 和 Spring Boot 项目,基本上都是基于Spring MVC的
怎么学习Spring MVC
学习 Spring MVC 我们只需要掌握以下 3 个功能:
- 连接的功能:将用户(浏览器)和 Java 程序连接起来,也就是访问一个地址能够调用到我们的 Spring 程序
- 获取参数的功能:用户访问的时候会带一些参数,在程序中要想办法获取到参数
- 输出数据的功能:执行了业务逻辑之后,要把程序执行的结果返回给用户
对于 Spring MVC 来说,掌握了以上 3 个功能就相当于掌握了 Spring MVC
Spring MVC创建和连接
- Spring MVC 项目创建和 Spring Boot 创建项目相同(Spring MVC 使用 Spring Boot 的方式创建),在创建的时候选择 Spring Web 就相当于创建了 Spring MVC 的项目
- 在 Spring MVC 中使用 @RequestMapping 来实现 URL 路由映射,也就是浏览器连接程序的作用
- 接下来要实现的功能是访问地址:http://localhost:8080/hello/Spring,能打印“Hello,Spring”信息
-
创建项目
-
代码
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("/hello")
public class Hello {@RequestMapping("/Spring")public String sayHello() {System.out.println("Hello, Spring!");return "Hello, Spring!";}
}
- 这样实现之后,当访问地址http://localhost:8080/hello/Spring之后,就能打印“Hello,Spring!”的信息
@RequestMapping注解
-
@RequestMapping 是 Spring MVC 中最核心、最基础的一个注解,它用于将 Web 请求(如 HTTP 请求)映射到特定的处理类(Controller)或处理方法上。简单来说,它告诉 Spring,当用户访问一个特定的 URL 时,应该由哪个类或哪个方法来处理这个请求
-
可使用在类上和方法上,假如修饰的是类的话,访问地址是类➕方法。假如修饰的是方法的话,访问地址就是方法
- 类:
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("/hello")
public class Hello {@RequestMapping("/Spring")public String sayHello() {System.out.println("Hello, Spring!");return "Hello, Spring!";}
}
地址:http://localhost:8080/hello/Spring
- 方法:
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class Hello {@RequestMapping("/Spring")public String sayHello() {System.out.println("Hello, Spring!");return "Hello, Spring!";}
}
地址:http://localhost:8080/Spring
@RequestMapping是post还是get请求
- @RequestMapping默认是get请求,可以使用Postman进行测试
- 如何接收post请求?
@RequestMapping(value = "/message", method = RequestMethod.POST)public String message(String name, int age) {return "Hello " + name + " " + age;}
- @GetMapping和@PostMapping
- get
// 写法1
@RequestMapping("/index")// 写法2
@RequestMapping(value = "/index",method = RequestMethod.GET)// 写法3
@GetMapping("/index")
- post
// 写法1
@RequestMapping(value = "/index",method = RequestMethod.POST)// 写法2
@PostMapping("/index")
获取参数
- 传递单个参数
@RequestMapping("/m1")
public Object method_1(String name){System.out.println("参数 name: "+name);return "/index.html";
}
- 传递对象
@Data
public class Person { private int id; private String name; private String password;
}@RequestMapping("/m2")
public Object method_2(Person p){System.out.println("对象中的 name: "+p.getName());System.out.println("对象中的 password: "+p.getPassword());return "/index.html";
}
- 表单参数传递/传递多个对象
@RequestMapping("/m3")
public Object method_3(String name, String pwd) {System.out.println("name 参数: " + name);System.out.println("pwd 参数: " + pwd);return "/index.html";
}
- 后端参数重命名(后端参数映射)
- 某些特殊的情况下,前端传递的参数 key 和我们后端接收的 key 可以不一致,比如前端传递了一个 time 给后端,而后端又是有 createtime 字段来接收的,这样就会出现参数接收不到的情况,如果出现这种情况,我们就可以使用 @RequestParam 来重命名前后端的参数值
@RequestMapping(value = "/password", method = RequestMethod.POST)public String password(@RequestParam("word") String password) {return "password " + password;}
- 参数是否必传
使用required为true/false,决定是否可传
@RequestMapping(value = "/user", method = RequestMethod.GET)public String user(@RequestParam(name = "name", required = true) String name, int age,String password) {return "user " + name + " " + age + " " + password;}
- @RequestBody接收JSON对象
@RequestMapping(value = "/transfer", method = RequestMethod.POST)public String transfer(@RequestBody Person person) {return "transfer " + person.getName() + " " + person.getAge() + " " + person.getPassword();}
- 获取URL中的参数@PathVariable
@RequestMapping("/HHHH/{name}/{age}")public String HHHH(@PathVariable("name") String name, @PathVariable("age") int age) {return "HHHH " + name + " " + age;}
- 上传文件@RequestPart
@RequestMapping("/OOOO")public String OOOO(String name,@RequestPart("myfile") MultipartFile file) throws IOException {String fileName = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."));String filePath = ClassUtils.getDefaultClassLoader().getResource("static").getPath() + UUID.randomUUID() + fileName;file.transferTo(new File(filePath));return "OOOO " + fileName;}
- 获取Cookie/Session/header
@RequestMapping("/cookie")public String cookie(@CookieValue("bite") String bite) {return "bite " + bite;}@RequestMapping("/header")public String header(@RequestHeader("bite") String bite) {return "bite " + bite;}@RequestMapping("/seesion")public String seesion(@SessionAttribute String bite) {return "bite " + bite;}
返回数据
- 返回静态页面
@Controller
@RequestMapping("/p")
public class PersonController {@RequestMapping("/index")public Object index(){// 执行业务...// 返回view -> index.htmlreturn "/index.html";}
}
- 返回text/html
@RequestMapping("/m7")
@ResponseBody
public String method_7() {return "<h1>Hello,HTML</h1>";
}
- 返回JSON对象
@RequestMapping("/m8")
@ResponseBody
public HashMap<String, String> method_8() {HashMap<String, String> map = new HashMap<>();map.put("Java", "Java Value");map.put("MySQL", "MySQL Value");map.put("Redis", "Redis Value");return map;
}
- 请求转发或请求重定向
forward vs redirect
- return可以返回一个视图,还可以实现跳转,跳转方式有两种:
- forward:请求转发
- redirect:请求重定向
// 请求重定向
@RequestMapping("/index")
public String index(){return "redirect:/index.html";
}// 请求转发
@RequestMapping("/index2")
public String index2(){return "forward:/index.html";
}
二者具体区别:
-
请求重定向 (redirect) 将请求重新定位到资源,请求转发 (forward) 服务器端转发
-
请求重定向地址发生变化,请求转发地址不发生变化。
-
请求重定向与直接访问新地址效果一致,不存在原来的外部资源不能访问;请求转发服务器端转发有可能造成原外部资源不能访问
注意⚠️:
- 请求转发资源必须在同一目录下,否则可能无法访问
- 但是假如使用重定向则可以访问
@ResponseBody 说明
@ResponseBody 返回的值如果是字符会转换成 text/html,如果返回的是对象会转换成 application/json 返回给前端。
@ResponseBody 可以用来修饰方法或者是修饰类,修饰类表示类中的所有方法都会返回 html 或者 json,而不是视图。
组合注解:@RestController
@RestController = @Controller + @ResponseBody