目录
1.什么是Spring MVC
1.1什么是mvc
1.2MVC与Spring MVC 之间的关系
2.spring mvc的重要性
3.Spring mvc项目创建
4.实现spring mvc web开发——用户端返回的请求
4.1@RequestMapping注解
4.2@ResponseBody
4.3@RequestMapping 是 post 还是 get 请求?
4.4显示的标明所使用的方法
4.4.1get请求的三种写法
4.4.2post请求的两种写法
4.5.转发和重定向
4.5.1转发
4.5.2重定向
4.6.自定义返回内容
5.实现spring mvc web开发——服务器接收客户端的请求
5.1.获取参数
5.1.1获取单个参数
5.1.2传递对象
5.1.3表单参数传递/传递多个参数(非对象)
5.1.4后端参数重命名
5.1.5设置参数必传@RequestParam
5.1.6@PathVariable注解获取URL中参数
5.2获取请求头 ——Cookie/Session/header
5.2.1获取header
5.2.2获取Cookie
5.2.3session的存储和获取
1.什么是Spring MVC
根据官方文档中得到:Spring web mvc ,通常称为Spring mvc,是基于servlet构件的原始web框架,从一开始就包含在spring框架中。
因此我们可以得到的信息为:
- spring mvc是web框架
- spring mvc 是基于servlet api 实现的
然而要理解spring mvc 我们首先要了解mvc是什么
1.1什么是mvc
mvc是Model View Controller的缩写,他是软件工程中一种软件架构模式,他把软件分为模型,视图,控制器三个部分。
- Model:是应用程序中用于处理应用程序数据逻辑部分,通常模型对象负载在数据库中存取数据
- View:是应用程序中处理数据显示部分,通常视图是依据数据模型创建的
- Controller:是应用程序中处理用户交互部分,通常控制器负责从视图读取数据,控制用户输入,并向模型发送数据
1.2MVC与Spring MVC 之间的关系
mvc是一种思想,而Spring mvc是对mvc这个思想的实现.总的来说,spring mvc实现了mvc模式,并继承了servlet api的框架。
2.spring mvc的重要性
现在绝大多数的Java项目都是基于spring(或者spring boot)来实现的,而spring 的核心就是spring mvc。也就是说spring mvc是spring框架的核心模块,而spring boot是spring的脚手架,因此我们可以直到市面上绝大多数项目约等于spring mvc项目。这就是我们要学spring mvc 的原因。
我们学习spring mvc掌握三个功能即可:
- 连接功能:将用户和Java程序连接起来,也就是说用户访问一个url,可以联系到我们的程序
- 获取参数的功能:用户访问的时候通常会获取参数,在程序中要想办法获取参数
- 输出数据的功能:执行业务逻辑之后,要把执行结果返回给用户
3.Spring mvc项目创建
配置我们的服务端口,端口号默认8080,可以显示标明,也可以配置别的端口号。
对于spring mvc的学习实现,我们使用ajax前后端分离的技术,遵循以下几点:
- 约定好前后端的接口
- 所有的接口都遵循http/https的应用层协议
- 但对于一个接口的时候,通常基于http,并且请求响应的数据格式也要约定
- 要明白前端的代码是运行在客户端浏览器中,后端的代码时运行在服务器上
4.实现spring mvc web开发——用户端返回的请求
4.1@RequestMapping注解
RequestMapping注解是spring web框架中最常用的注解之一,主要用来注册接口的路由映射的
路由映射:所谓的路由映射指的是,当用户访问一个 url 时,将用户的请求对应到程序中某个类的某个方法的过程就叫路由映射。
通俗的来讲,就是@RequestMapping修饰类或者方法,定义请求的路径。完整的访问路径为:类路径 + 方法路径(类路径可以不用指定)
同时我们添加@Controller注解,表示该类是一个Bean,并且执行web请求和响应处理
4.2@ResponseBody
@ResponseBody注解的作用是将controller的方法返回的对象 通过适当的转换器 转换为指定的格式之后,写入到response对象的body区(响应体中),默认返回是JSON.如果该注解修饰类,表示类中所有的返回值格式都为JSON,修饰方法时,表示该方法返回JSON.
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.HashMap;
import java.util.Map;
@ResponseBody
@Controller
public class ArticleController {
@RequestMapping("/u1")
public Object u1(){
Map<String,Object> map = new HashMap<>();
map.put("a",123);
map.put("b",true);
map.put("c","abc");
return map;
}
}
这就是一个简单的 spring mvc 代码,我们就可以通过url获取到具体的内容
通常我们会使用@Controller 和@ResponseBody两个注解来使用,表示返回的为JSON格式并且这个类为执行web的请求和处理,因此,我们有@RestController将这两者的功能结合起来 :@RestController = @Controller + @ResponseBody
4.3@RequestMapping 是 post 还是 get 请求?
我们http协议中最常用的两个方法就是post/get方法,这两个可以涵盖大多数请求应答等的需求,那么我们@RequestMapping 是get还是post方法呢,我们可以使用postMan来测试。
@RequestMapping默认是get方法,不支持post方法
那么我们如何才能接收post请求
4.4显示的标明所使用的方法
4.4.1get请求的三种写法
// 写法1
@RequestMapping("/index")
// 写法2
@RequestMapping(value = "/index",method = RequestMethod.GET)
// 写法3
@GetMapping("/index")
4.4.2post请求的两种写法
// 写法1
@RequestMapping(value = "/index",method = RequestMethod.POST)
// 写法2
@PostMapping("/index")
4.5.转发和重定向
4.5.1转发
我们通常所返回的结果是一个JSON格式,但是其实我们还可以实现其他的非JSON的形式,包括转发和重定向。
package com.example.springmvc_study.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller//要返回重定向,不能设置响应格式
public class RedirectController {
//返回值不作为响应体的时候,就只能返回String,表示我们重定向资源路径
//这是转发的代码
@RequestMapping("/f")
public String f(){
//这是转发
return "/index.html";
// return "forword:/index.html";两种写法
}
}
此时没有重定向,是直接返回页面,这个属于转发,我们可以使用fiddler抓包响应观察:
4.5.2重定向
package com.example.springmvc_study.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller//要返回重定向,不能设置响应格式
public class RedirectController {
//返回值不作为响应体的时候,就只能返回String,表示我们重定向资源路径
//重定向
@RequestMapping("/r")
public String r(){
return "redirect:/index.html";
}
}
此时页面发生了两次跳转:
此时执行路径为 :http://localhost:8080/r
第二次跳转页面为:http://localhost:8080/index.html
此时就完成了重定向。
4.6.自定义返回内容
我们在某些时候返回的不单单是上面的几种类型,需要返回特定的格式,此时我们就可以自定义。spring mvc提供了灵活处理响应的类ResponseEntity,可以手动设置响应状态码,响应格式,响应正文。
package com.example.springmvc_study.controller;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
@RestController
public class RespAnyController {
@RequestMapping("/any")
public ResponseEntity any() throws IOException {
Path path = new File("C:\\Users\\15047\\Pictures\\Camera Roll\\4.jpg").toPath();
byte[] bytes = Files.readAllBytes(path);
return ResponseEntity.ok().header("content-type","application/x-jpg").body(bytes);
}
}
他的执行结果可以直接保存在本地
5.实现spring mvc web开发——服务器接收客户端的请求
5.1.获取参数
5.1.1获取单个参数
在spring mvc 中,可以直接使用方法中的参数来实现传参:
@RequestMapping("/m1")
public Object method_1(String name){
System.out.println("参数 name:"+name);
return "/index.html";
}
5.1.2传递对象
package com.example.springmvc_study.model;
import lombok.Data;
@Data
public class User {
private Integer id;
private String username;
private Integer age;
private Integer weight;
}
@RequestMapping("/complex")
public Object complex(User user){
user.setUsername("张三");
user.setId(1);
user.setAge(18);
user.setWeight(80);
return user;
}
5.1.3表单参数传递/传递多个参数(非对象)
@RequestMapping("/log")
public Object log(String username, Integer age, int weight){
Map<String,Object> map = new HashMap<>();
map.put("user",username);
map.put("age",age);
map.put("weight",weight);
return map;
}
5.1.4后端参数重命名
在特殊情况下,前端所传参数和后端服务器接收可以不一致,比如前端传入time,后端是由createtime来接收,此时参数不一致,那么就不能接收到参数。出现这种问题我们可以使用@RequestParam 来重命名前后端的参数值。
@RequestMapping("/m4")
public Object method_4(@RequestParam("time") String createtime) {
System.out.println("时间:" + createtime);
return "/index.html";
}
5.1.5设置参数必传@RequestParam
同样使用@RequestParam注解来设置,在方法体写参数时使用@RequestParam 注解修饰,即可完成设置必传参数,如果前端不传入相应的参数或者传入参数不够,那么就会报错。
@RequestMapping("/rp")
public Object rp(@RequestParam String username, @RequestParam String email ,@RequestParam Integer age){
Map<String,Object> map = new HashMap<>();
map.put("username",username);
map.put("email",email);
map.put("age",age);
return map;
}
其他情况:
5.1.6@PathVariable注解获取URL中参数
@RequestMapping("/queryStudent/{name}")
public Object queryStudent(@PathVariable String name){
Map<String,Object> map = new HashMap<>();
map.put("name",name);
return map;
}
5.2获取请求头 ——Cookie/Session/header
5.2.1获取header
作用:使用@RequestHeader注解通过绑定请求头中的字段名,获取请求头的字段信息
这里我们获取请求头中的UA(标识浏览器的版本型号等)。
@RequestMapping("/header")
public Object header(@RequestHeader("User-Agent") String userAgent){
Map<String,Object> map = new HashMap<>();
map.put("User-Agent",userAgent);
return map;
}
5.2.2获取Cookie
作用:使用@CookieValue注解通过绑定cookie中的键名,获取cookie中的信息
@RequestMapping("/cookie")
public Object cookie(@CookieValue("My-Cookie") String cookie){
Map<String,Object> map = new HashMap<>();
map.put("My-Cookie",cookie);
return map;
}
5.2.3session的存储和获取
session是工作在服务器中,例如一个用户登录之后,就会将他的信息等保存下来,然后我们就可以使用@SessionAttribute注解绑定设置session时的键来获取
@RequestMapping("/login")
public Object login(HttpServletRequest req){
HttpSession session = req.getSession();
session.setAttribute("user","123456");
Map<String,Object> map = new HashMap<>();
map.put("user","123456");
return map;
}
@RequestMapping("/getSession")
public Object getSession(@SessionAttribute("user") String user){
Map<String,Object> map = new HashMap<>();
map.put("session中User",user);
return map;
}