目录
2.2 设置SpringBoot热部署(使用IDEA自动部署最新的代码)
2.2.4 使用debug来启动项目,而不是run (划重点)
2.3 创建一个UserController类,实现用户和Spring程序之间的连接
2.4.1 RequestMapping 既可以修饰类,也可以修饰方法
2.4.2 RequestMapping默认情况下既支持GET请求,也支持POST请求
2.4.3 显示指定RequestMapping支持的请求(method="")
2.5 GET请求和POST请求的其他写法(@GetMapping 和 PostMapping)
3.5 设置参数必传和非必传(@RequestParam的required属性)
4.2 返回text/html(@ResponseBody)
一、SpringMVC定义
1.1 MVC定义
MVC 是 Model View Controller 的缩写,它是软件⼯程中的⼀种软件架构模式,它把软件系统分为模型、视图和控制器三个基本部分。
Model (模型):是应用程序中用于处理应用程序数据逻辑的部分。通常模型对象负责在数据库中存取数据。
View (视图):是应用程序中处理数据显示的部分。通常视图是依据模型数据创建的。
Controller (控制器):是应用程序中处理用户交互的部分。通常控制器负责从视图读取数据,控制用户输入,并向模型发送数据。
1.2 SpringMVC定义
Spring Web MVC 是基于 Servlet API 构建的原始 Web 框架,从⼀开始就包含在 Spring 框架中。它 的正式名称“Spring Web MVC”来⾃其源模块的名称(Spring-webmvc),但它通常被称为“Spring MVC” 。
1.3 MVC和SpringMVC的关系
MVC 是⼀种思想,而Spring MVC 是对 MVC 思想的具体实现。 总结来说,Spring MVC 是⼀个实现了 MVC 模式,并继承了 Servlet API 的 Web 框架。既然是 Web 框架,那么当⽤户在浏览器中输⼊了 url 之后,Spring MVC 项⽬就可以感知到⽤户的请求。
1.4 学习目标
绝⼤部分的 Java 项⽬都是基于 Spring(或 Spring Boot)的,而 Spring 的核⼼就是 Spring MVC。因此,我们需要掌握SpringMVC的基础使用,主要包含三个方面:
连接:将用户(浏览器)和Java程序连接起来。是指通过一个url地址能够调用Spring程序。
从请求中获取参数:用户访问时会带一些参数,在处理请求时需要获取这些参数。
返回响应:执行了业务逻辑后,要把程序的执行结果返回给用户。
二、SpringMVC创建和连接
2.1 创建SpringMVC项目
SpringMVC可以基于SpringBoot创建。在创建SpringMVC时,勾选上SpringBoot模块即可。
2.2 设置SpringBoot热部署(使用IDEA自动部署最新的代码)
2.2.1 添加dev-tool框架支持
2.2.2 开启IDEA中当前项目的自动编译
2.2.3 开启运行时的热部署
2.2.4 使用debug来启动项目,而不是run (划重点)
修改代码后,等个3s左右,程序就会自动运行。
2.3 创建一个UserController类,实现用户和Spring程序之间的连接
package com.example.demo.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller // 将UserController类加载到Spring容器中
@ResponseBody // 让返回的响应是text/html,如果不加这个注解,默认返回的是一个网页的地址
@RequestMapping("/user")
public class UserController {
@RequestMapping("/hello")
public String sayHello(){
return "<h1>hello springmvc</h1>";
}
}
2.4 RequestMapping注解
从上面写的UserController类中可以看到,RequestMapping是用来配置路由的。
2.4.1 RequestMapping 既可以修饰类,也可以修饰方法
package com.example.demo.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller // 将UserController类加载到Spring容器中
@ResponseBody // 让返回的响应是text/html,如果不加这个注解,默认返回的是一个网页的地址
public class UserController {
@RequestMapping("/hello")
public String sayHello(){
return "<h1>hello springmvc</h1>";
}
}
2.4.2 RequestMapping默认情况下既支持GET请求,也支持POST请求
2.3.1中举得例子就是发送的是get请求,接下来,使用PostMan发送一个post请求。观察RequestMapping是否支持。
因此可以得到结论,RequestMapping默认情况下既支持GET请求,也支持POST请求。
2.4.3 显示指定RequestMapping支持的请求(method="")
举个例子:显示指定RequestMapping只支持GET请求。
package com.example.demo.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller // 将UserController类加载到Spring容器中
@ResponseBody // 让返回的响应是text/html,如果不加这个注解,默认返回的是一个网页的地址
public class UserController {
@RequestMapping(value = "/user",method = RequestMethod.GET)
public String sayHello(){
return "<h1>hello springmvc</h1>";
}
}
当使用PostMan发送一个POST请求,会出现404.证明此时只能接收到get请求。
2.5 GET请求和POST请求的其他写法(@GetMapping 和 PostMapping)
2.5.1 GET请求的三种写法
// 写法1
@RequestMapping(value = "/user",method = RequestMethod.GET)
public String sayHello1(){
return "<h1>hello springmvc</h1>";
}
// 写法2
@RequestMapping("/user2")
public String sayHello2(){
return "<h1>hello springmvc2</h1>";
}
// 写法3
@GetMapping("/user3")
public String sayHello3(){
return "<h1>hello springmvc3</h1>";
}
2.5.2 POST请求的三种写法
// 写法1
@RequestMapping(value = "/user",method = RequestMethod.POST)
public String sayHello1(){
return "<h1>hello springmvc</h1>";
}
// 写法2
@RequestMapping("/user2")
public String sayHello2(){
return "<h1>hello springmvc2</h1>";
}
// 写法3
@PostMapping("/user3")
public String sayHello3(){
return "<h1>hello springmvc3</h1>";
}
三、获取参数
3.1 传递单个参数(直接使用方法里的参数实现传参)
@RequestMapping("/getUsername")
public String getUsername(String username){
return "请求中的username = " + username;
}
注意:
3.2 传递对象
step1:先创建一个User类
package com.example.demo.controller;
import lombok.Data;
@Data
public class User {
private String userName;
private String password;
private int age;
}
step2:传递对象代码
@RequestMapping("/getUserInfo")
public String getUserInfo(User user){
return user.toString();
}
step3:前端访问结果
3.3 表单参数传递
@RequestMapping("/login1")
@ResponseBody
public String login(String username,String password){
return "username="+username + " password=" + password;
}
3.4 后端参数重命名(@RequestParam)
在某些特殊的情况下,前端传递的参数和后端接收的参数可以不一样。如果不做任何操作,就会导致参数接收不到。我们需要使用@RequestParam来重命名前后端的参数值。
@RequestMapping("/getUsername3")
public String getUsername3(@RequestParam("username") String name){
return "请求中的username = " + name;
}
3.5 设置参数必传和非必传(@RequestParam的required属性)
// 参数非必传
@RequestMapping("/getUsername3")
public String getUsername3(@RequestParam(value = "username",required = false) String name){
return "请求中的username = " + name;
}
// 参数必传
@RequestMapping("/getUsername4")
public String getUsername4(@RequestParam(value = "username",required = true) String name){
return "请求中的username = " + name;
}
3.6 接收JSON对象(@RequestBody)
@RequestMapping("/getJson")
public String getJson(@RequestBody User user){
return user.toString();
}
注意:必须使用一个对象来接收json请求。
3.8 获取URL中的参数(@PathVariable)
@PostMapping("getpara/{name}/{password}")
public String getParaURL(@PathVariable String name,
@PathVariable String password){
return name+password;
}
3.9 上传文件(@RequestPart)
@RequestMapping("/upfile")
public String upfile(Integer id , @RequestPart("photo") MultipartFile file) throws IOException {
// 生成一个唯一的UUID
String fileName = UUID.randomUUID().toString();
// 得到文件的后缀名
String fileType = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."));
fileName += fileType;
file.transferTo(new File("D:\\"+fileName));
return id+"上传成功";
}
3.10 获取Cookie、Session和header
传统的获取Cookie、Session和header的方法和servlet提供的方法一致,是指从req中获取对应的参数,这种方法比较复杂。利用注解可以更简单的获取这三个参数。
// 获取Cookie
@RequestMapping("/getCookie")
public String getCookie(@CookieValue String name){
return name;
}
// 获取Header
@RequestMapping("/getHeader")
public String getHeader(@RequestHeader String header){
return header;
}
// 获取Session
@RequestMapping("/getSession")
public String getSession(@SessionAttribute(value = "username",required = false) String username){
return username;
}
四、返回数据
4.1 返回静态页面
以前前后端不分离,默认请求下Spring MVC和Spring Boot返回的都是页面。现在前后端已经分离了,因此,后端只需要返回给前端数据即可。此时需要用到@ResponseBody注解。
不加@ResponseBody,返回的就是静态页面。
@RequestMapping("/staticPage")
public String returnStatic(){
return "/login.html";
}
4.2 返回text/html(@ResponseBody)
@RequestMapping("/htmlPage")
@ResponseBody
public String returnHtml(){
return "<h1>六一快乐</h1>";
}
4.3 返回JSON对象
@RequestMapping("/htmlJson")
@ResponseBody
public HashMap<String,String> returnJson(){
HashMap<String,String> hashMap = new HashMap<>();
hashMap.put("a","apple");
hashMap.put("b","boy");
return hashMap;
}
4.4 请求转发或请求重定向
return不仅可以返回一个视图,还可以实现页面跳转。跳转的方式有两种:forward(请求转发)、redirect(请求重定向)
@RequestMapping("/forwardTry")
public String forwardTry(){
return "forward:/login.html";
}
@RequestMapping("/redirectTry")
public String redirectTry(){
return "redirect:/login.html";
}
对比:
①请求重定向(redirect)将请求重新定位到资源;请求转发(forward)服务器端转发。
②请求重定向地址发⽣变化,请求转发地址不发⽣变化。
③请求重定向与直接访问新地址效果一样,不存在原来的外部资源不能访问;请求转发服务器端转发有可能造成原外部资源不能访问。
4.5 @ResponseBody说明
@ResponseBody 返回的值如果是字符会转换成 text/html,如果返回的是对象会转换成
application/json 返回给前端。
@ResponseBody 可以⽤来修饰⽅法或者是修饰类,修饰类表示类中的所有⽅法都会返回 html 或者 json,⽽不是视图。
4.6 组合注解@RestController
@RestController = @Controller + @ResponseBody
五、总结
介绍了SpringMVC的概念,即SpringMVC是基于Servlet的原始框架。
介绍了SpringMVC项目的构建和连接,介绍了如何设置SpringBoot热部署,即使用IDEA自动部署最新的代码。
介绍了使用@RequestMapping、@GetMapping、@PostMapping三种注解处理get和post请求。
介绍了传递单个参数、传递对象、传递表单参数、传递Json对象、传递文件、URL、Cookie、Session、header这些参数的获取方法。
介绍了如何返回静态页面、text/html、JSON对象以及重定向和转发。