Spring Web MVC 是基于 Servlet API 构建的原始 Web 框架,从一开始就包含在 Spring 框架中。它的正式名称“Spring Web MVC”来自其源模块的名称(Spring-webmvc),但它通常被称为“Spring MVC”。
MVC 是 Model View Controller 的缩写,它是软件工程中的一种软件架构模式,它把软件系统分为模 型、视图和控制器三个基本部分。
MVC 是一种思想,而 Spring MVC 是对 MVC 思想的具体实现。 总结来说,Spring MVC 是一个实现了 MVC 模式,并继承了 Servlet API 的 Web 框架。既然是 Web 框
架,那么当用户在浏览器中输入了 url 之后,我们的 Spring MVC 项目就可以感知到用户的请求。
Spring MVC 项目创建和 Spring Boot 创建项目相同(Spring MVC 使用 Spring Boot 的方式创建),在 创建的时候选择 Spring Web 就相当于创建了 Spring MVC 的项目。
Spring MVC 可以基于 Spring Boot 创建,也就是创建一个 Spring Boot 项目,勾选上 Spring Web 模块 即可,如下图所示:
接下来,创建一个 UserController 类,实现用户到 Spring 程序的互联互通,具体实现代码如下:
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller // 让 spring 框架启动时,加载
@ResponseBody // 返回一个 text/html 信息
@RequestMapping("/user") // 路由器规则注册
public class UserController {
// 路由器规则注册
@RequestMapping("/hi")
public String sayHi(){
return "Hi,Spring MVC.
";
}
}
这样实现之后,当访问地址:http://localhost:8080/user/hi 时就能打印“hello,spring mvc”的信息 了。
@RequestMapping 是 Spring Web 应用程序中最常被用到的注解之一,它是用来注册接口的路由映射的。
@RequestMapping 即可修饰类,也可以修饰方法,当同时修饰类和方法时,访问的地址是类 + 方法。
方法地址:http://localhost:8080/hi
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class UserController {
@RequestMapping("/hi")
public String sayHi(){
return "Hi,Spring MVC.
";
}
}
当修饰类的时候,这个类下的所有方法访问地址前都必须加类的地址,当方法也被修饰时,则访问地址就是 类 + 方法
如图方法访问地址为:http://localhost:8080/p/hi
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
@RequestMapping("/p")
public class UserController {
@RequestMapping("/hi")
public String sayHi(){
return "Hi,Spring MVC.
";
}
}
// 写法1
@RequestMapping("/index")
// 写法2
@RequestMapping(value = "/index",method = RequestMethod.GET)
// 写法3
@GetMapping("/index")
// 写法1
@RequestMapping(value = "/index",method = RequestMethod.POST)
// 写法2
@PostMapping("/index")
@RequestMapping(value = "/hello4")
@ResponseBody
public String hello4(@RequestParam(value = "target", defaultValue = "世界") String target) {
return "你好" + target;
}
方法访问地址: http://127.0.0.1:8080/hello4?target=hello
@RequestMapping(value = "/hello5")
@ResponseBody
public String hello5(String a, String b) {
return a + b;
}
方法访问地址: http://127.0.0.1:8080/hello5?a=Hello&b=World
@GetMapping("/method1")
@ResponseBody
public Cat createCat() {
return new Cat("喵喵", 5);
}
// 如果变量比较多,可以直接在对象内完成
// Spring 内部会构造好对象
@GetMapping("/method4")
@ResponseBody
public Cat createCat(Cat cat) {
return cat;
}
方法访问地址: http://127.0.0.1:8080/method2?name=喵喵&age=1
@GetMapping("/method2")
@ResponseBody
public Cat createCa2(String name, String age) {
int ageInt = Integer.parseInt(age);
return new Cat(name, ageInt);
}
方法访问地址: http://127.0.0.1:8080/method2?name=喵喵&age=1
// 让 Spring 内部做数据转换,Spring -> int
@GetMapping("/method3")
@ResponseBody
public Cat createCa3(String name, int age) {
return new Cat(name, age);
}
使用@PathVariable注解修饰参数
@GetMapping("/{username}/article/details/{aid}")
@ResponseBody
public String getMessage(@PathVariable("username") String username, @PathVariable("aid") String aid) {
log.info("得到的 username = {}, aid = {}", username, aid);
return "成功";
}
@RequestMapping("/param9")
public String param9(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 filePath + " 上传成功.";
}
forward 是请求转发;
redirect:请求重定向。
// 请求重定向
@RequestMapping("/index") public String index(){
return "redirect:/index.html";
}
// 请求转发
@RequestMapping("/index2") public String index2(){
return "forward:/index.html";
}
- 请求重定向(redirect)将请求重新定位到资源;请求转发(forward)服务器端转发。
- 请求重定向地址发生变化,请求转发地址不发生变化。
- 请求重定向与直接访问新地址效果一直,不存在原来的外部资源不能访问;请求转发服务器端转发 有可能造成原外部资源不能访问。