Spring MVC
- Spring mvc概论
- 使用Spring MVC
- 一、实现客户端和程序之间的“链接”
- 1.1@RequestMapping
- 1.2@GetMapping
- 1.3@PostMapping
- 二、获取参数
- 2.1用Servlet的方法
- 可以直接传入值
- 传入一个对象
- 后端参数重命名
- 使用 @RequestBody接收JSON对象
- 获取URL中参数@PathVariable
- 上传文件@RequestPart
- 获取Cookie/Session/header
- 返回数据
- 请求转发或请求重定向
Spring mvc概论
Spring Web MVC 是基于 Servlet API 构建的原始 Web 框架,从⼀开始就包含在 Spring 框架中.
- Spring MVC 是⼀个 Web 框架。
- Spring MVC 是基于 Servlet API 构建的
MVC 是 Model View Controller 的缩写,它是软件⼯程中的⼀种软件架构模式,它把软件系统分为模型、视图和控制器三个基本部分。
- Model(模型)是应⽤程序中⽤于处理应⽤程序数据逻辑的部分。通常模型对象负责在数据库中存取数据。
- View(视图)是应⽤程序中处理数据显示的部分。通常视图是依据模型数据创建的。
- Controller(控制器)是应⽤程序中处理⽤户交互的部分。通常控制器负责从视图读取数据,控制⽤户输⼊,并向模型发送数据。
1.用户的请求首先点到Controller
2.Controller将请求转发给Model
3.Model 处理业务并将数据结果给Controller
4.Controller会将数据给View引擎
5.View 转换数据生成最终的页面给用户
MVC 是⼀种思想,⽽ Spring MVC 是对 MVC 思想的具体实现
使用Spring MVC
Spring MVC 可以基于 Spring Boot 创建,也就是创建⼀个 Spring Boot 项⽬,勾选上 Spring Web模块即可。
Spring MVC·的创建和链接。
Spring MVC 中使⽤ @RequestMapping 来实现 URL 路由映射。
@RequestMapping 是 Spring Web 应⽤程序中最常被⽤到的注解之⼀,它是⽤来注册接⼝的路由映射的。
一、实现客户端和程序之间的“链接”
1.1@RequestMapping
@RestController
@RequestMapping("/test")
public class TestController {
@RequestMapping("/sayHi")
public String sayHi(){
return "你好,reader";
}
}
既可以修饰类,又可以修饰方法。修饰类就就是一级目录,方法是二级目录。
1.2@GetMapping
实现HTTP链接,但是只支持Gett请求
@GetMapping("/sayHi")
public String sayHi(){
return "你好,reader";
}
1.3@PostMapping
实现HTTP链接,但是只支持Post请求
@PostMapping("/sayHi")
public String sayHi(){
return "你好,reader";
}
二、获取参数
2.1用Servlet的方法
@RestController
@RequestMapping("/test2")
public class TestController2 {
@RequestMapping("/getName")
public String getName(HttpServletRequest request){
return "Name:" +request.getParameter("name");
}
}
可以直接传入值
@RequestMapping("/getName2")
public String getName2(String name){
return "Name:" +name;
}
诺是可以用一个对象将值进行包裹传入。
@RequestMapping("/getName3")
public String getName3(String name,Integer age){
return "Name:" +name+";Age:"+age;
}
传入一个对象
@RestController
@RequestMapping("/user")
public class UserController {
@RequestMapping("/add")
public User add(User user){
return user;
}
}
@Data
public class User {
private int id;
private String name;
}
传入一个对象,在网页响应,转换整json
后端参数重命名
某些特殊的情况下,前端传递的参数 key 和我们后端接收的 key 可以不⼀致,⽐如前端传递了⼀个time 给后端,⽽后端⼜是有 createtime 字段来接收的,这样就会出现参数接收不到的情况,我们就可以使⽤ @RequestParam 来重命名前后端的参数值。
@RequestMapping("/name")
public String add2(@RequestParam(value = "n",required = false)String name){
return name;
}
required 是否必须必须传入。@RequestParam前端传入的是n,后端是name,通过这个注解可以便可以重命名返回。如果我们的实际业务前端的参数是⼀个⾮必传的参数,我们可以通过设置 @RequestParam 中的required=false 来避免不传递时报错
使用 @RequestBody接收JSON对象
@RequestBody用来修饰参数。
@RequestMapping("add_json")
public User addSon(@RequestBody User user){
return user;
}
获取URL中参数@PathVariable
@RequestMapping("/detail/{aid}/{name}")
public String datail(@PathVariable("aid")Integer aid,@PathVariable String name){
return aid+""+name;
}
通过这个方式可以实现获取url中的变量。并不是字段,与上面是有区别的。
上传文件@RequestPart
客户端上传文件给服务器,必须是POST
@RequestMapping("/upload")
public String uoload(@RequestPart("myfile")MultipartFile file) throws IOException {
String path="D:\\image\\img.png";
//保存文件
file.transferTo(new File(path));
return path;
}
@RequestMapping("/upload")
public String uoload(@RequestPart("myfile")MultipartFile file) throws IOException {
//生成一个唯一的id及uuid=全球唯一ID->MAc+随及种子+加密算法
String name= UUID.randomUUID().toString().replace("-","");
//得到源文件的后缀名
name+=(file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf(".")));
String path="D:\\image\\"+name;
//保存文件
file.transferTo(new File(path));
return path;
}
获取Cookie/Session/header
1.获取 Request 和 Response 对象
获取Cookie
@RequestMapping("/getcookie")
public String getCookie(@CookieValue(value = "cookie",required = false)String cookie){
return cookie;
}
获取Session
private static String _SESSION_KEY="SESSION_KEY";
@RequestMapping("/set_id")
public String setId(HttpServletRequest request){
HttpSession session=request.getSession();
if (session!=null){
session.setAttribute(_SESSION_KEY,"张三");
return "session set success";
}else {
return "session set fail";
}
}
@RequestMapping("/get_sess")
public String getSess(@SessionAttribute(required = false,value = "SESSION_KEY")String name){
return name;
}
获取header
@RequestMapping("/header")
public String header(@RequestHeader("User-Agent") String userAgent) {
return "userAgent:"+userAgent;
}
获取的单数类型小结:
1.单个参数
2.获取多个参数
3.获取一个普通对象
4.获取一个json对象
5.从URL PATH(非参数部分)获取参数
6.获取文件
7.获取Cookie/Session/header
返回数据
默认请求下⽆论是 Spring MVC 或者是 Spring Boot 返回的是视图(xxx.html),后端只需要返给给前端数据即可,这个时候我们就需要使用@ResponseBody 注解了。
@Controller
@ResponseBody//不加这个返回默认.html类型
public class TestController3 {
@RequestMapping("/index")
public String index(){
return "hell.html";
}
}
- @ResponseBody 返回的值如果是字符会转换成 text/html,如果返回的是对象会转换成application/json
返回给前端。 - @ResponseBody 可以⽤来修饰⽅法或者是修饰类,修饰类表示类中的所有⽅法都会返回 html 或者json,⽽不是视图。
请求转发或请求重定向
return 不但可以返回⼀个视图,还可以实现跳转,跳转的⽅式有两种:
- forward 是请求转发;
- redirect:请求重定向
// 请求重定向
@RequestMapping("/index")
public String index(){
return "redirect:/index.html";
}
// 请求转发
@RequestMapping("/index2")
public String index2(){
return "forward:/index.html";
}
forward 和 redirect 具体区别如下:
- 请求重定向(redirect)将请求重新定位到资源(URL发生了改变);请求转发(forward)服务器端转发。(URL不发生改变)
- 请求重定向地址发⽣变化,请求转发地址不发⽣变化。
- 请求重定向与直接访问新地址效果⼀直,不存在原来的外部资源不能访问;请求转发服务器端转发有可能造成原外部资源不能访问。