前言
Spring-MVC是什么?看看官方的解释:
从上面的官方解释来看,我们可以提取到俩个重要的知识点:
1.Spring MVC是一个Web框架
2.Spring MVC是基于Servlet API框架建立起来的。
想要进一步的理解Spring MVC的话,就要先明确啥是MVC,
MVC 是 Model View Controller 的缩写,它是软件⼯程中的⼀种软件架构模式,它把软件系统分
为模型、视图和控制器三个基本部分
MVC 是⼀种思想,⽽ Spring MVC 是对 MVC 思想的具体实现。
总结来说,Spring MVC 是⼀个实现了 MVC 模式,并继承了 Servlet API 的 Web 框架。既然是 Web框架,那么当⽤户在浏览器中输⼊了 url 之后,我们的 Spring MVC 项⽬就可以感知到⽤户的请求
如何学SpringMVC呢?从三个方面入手:1.实现连接 2.获取参数 3.返回数据。
1.建立连接
我们知道SpringMVC其实就是Spring框架,在建立Spring项目的时候,再用简单好用的SpringBoot建立就ok啦,只不过在依赖注入的时候,选上SpringWeb。
既然是在SpringBoot中,那么建立连接等各个操作 都是由注解来实现的,现在演示一下建立连接的注解:@RequestMapping
要注意的是,这个注解也可以在类上面使用,也可以在方法上使用~~
@RequestMapping 是 Spring Web 应⽤程序中最常被⽤到的注解之⼀,它是⽤来注册接⼝的路由映射的。
路由映射:所谓的路由映射指的是,当⽤户访问⼀个 url 时,将⽤户的请求对应到程序中某个类的某个⽅法的过程就叫路由映射
如上图在网页上输入网址的方式是使用了get方法,那这个 @RequestMapping注解只支持get方法吗?我们用postman检验一下,
总结一下并且扩展一下:
1. @RequestMapping 支持post请求,也支持get请求
2.@GetMapping 和 @PostMapping分别只支持get请求和post请求~~
3.get请求的写法:
// 写法1 @RequestMapping("/index") // 写法2 @RequestMapping(value = "/index",method = RequestMethod.GET) // 写法3 @GetMapping("/index")
4.post请求的写法:
// 写法1 @RequestMapping(value = "/index",method = RequestMethod.POST) // 写法2 @PostMapping("/index")
2.获取参数
2.1获取单个参数
获取单个参数就比较简单了,就是利用方法传递的形参来实现~~
@RestController
public class TestController {
@RequestMapping("/hi")
public String sayhi(String name){
return "say hi" + name;
}
}
要注意的是,网站输入的query string部分和代码里的形参名称是一样的~~
当然了,多个参数也可以这样的方式来实现。
重命名 -> @RequestParam
@RequestMapping("/hi")
public String sayhi(@RequestParam("name") String username){
return "say hi" + username;
}
2.2 获取对象
@RequestMapping("/reg")
public Object reg(UserInfo userInfo){
return userInfo;
}
这就证明框架会实现自动的参数映射;
2.3 获取json对象
@RequestMapping("/reg2")
public Object reg2(@RequestBody UserInfo userInfo){
return userInfo;
}
2.4 获取URL中参数
获取URL中的路径就要用到 @PathVariable
@RequestMapping("/reg3/{name}/{pwd}")
public Object reg3(@PathVariable String name,@PathVariable(required = false,name = "pwd") String password){
return name + password;
}
2.5 获取上传文件
依旧是用到@RequestPart注解:
@RequestMapping("myupload")
public Object upload(@RequestPart("myimg") MultipartFile file){
File saveFile = new File("D:\\myimg.png");
try{
file.transferTo(saveFile);
return true;
} catch (IOException e) {
e.printStackTrace();
}
return false;
}
但是上面的写法是有很大问题的,比如说重复send的话,原本发送到D盘的myimg文件会覆盖,这个原因就是因为名字它是重复的。因此如果我们想让发送后的文件名字不同就要认识到另一个知识点了 : 用到UUID.randomUUID()方法
@RequestMapping("myupload")
public Object upload(@RequestPart("myimg") MultipartFile file){
String filename = UUID.randomUUID() + file.getOriginalFilename().substring(file.getOriginalFilename().indexOf("."));
File saveFile = new File("D:\\"+filename);
try{
file.transferTo(saveFile);
return true;
} catch (IOException e) {
e.printStackTrace();
}
return false;
}
2.6 获取Cookie值
@RequestMapping("/getck")
public Object getCookie(@CookieValue(value = "java" , required = false) String java){
return "cookie : " + java;
}
这里虚拟了一个名为java的cookie值。
2.7 获取 Header值
@RequestMapping("/gethd")
public Object getHeader(@RequestHeader("Host") String ht){
return ht;
}
2.8 获取Session值
@SessionAttribute注解实现获取session值
要想获取Session值就需要先设置一个Session值,
@RequestMapping("/setsess")
public void setSession(HttpServletRequest request){
HttpSession session = request.getSession();
session.setAttribute(SESSION_KEY,"zhangsan");
}
在网页上输入这个地址,浏览器就存了session值了,再往下就要取session值了。
@RequestMapping("/getsess")
public Object getSession(@SessionAttribute(SESSION_KEY) String name){
return "session : " + name;
}
结果如下:
3.返回数据
3.1 返回静态页面
@Controller
@RequestMapping("/demo")
public class DemoController {
@RequestMapping("/index")
public Object index(){
return "/index.html";
}
}
这里的 / 代表在main目录下找到这个静态页面再返回。
3.2 请求转发 VS 重定向
forward是请求转发,redirect是重定向,俩者的区别是啥呢?从以下几个点来分析:
1.定义不同
请求转发是发生在服务器内部的,当客服端发送请求之后,服务器会先向目标地址发送请求之后,再将结果返回给客户端的,也就是说,转发的过程是服务器代替实现的;重定向是发生在客户端层面的,会将临时响应头返回给客户端,客户端需要再次发送请求(重定向)的 URL 地址,客户端再收到了地址之后,会将请求发送到新的地址上,这就是请求重定向。
2.请求方不同
请求转发的向目标地址的请求发是服务器,而重定向的向目标地址的请求发是客户端,
3.数据共享不同
请求转发因为是由服务器端进行操作的,因此客户端只需要发送一次请求,只有一个request对象和一个response对象,因此返回、请求的数据是一样的。而请求重定向客户端发送两次完全不同的请求,所以两次请求中的数据是不同的。
4.最终的url不同
请求转发的url地址还是原来的地址,操作是在服务器端上的,客户端感知不到,因此请求转发url不会改变,而重定向会将地址改成目的地址。
5.实现的代码不同
@RequestMapping("/fw")
public Object forward(){
return "forward:/index.html";
}
这个是请求转发的写法
@RequestMapping("re")
public Object redirect(){
return "redirect:/index.html";
}
这个是重定向的写法
@RequestMapping("/re2")
public void redirect2(HttpServletResponse response) throws IOException {
response.sendRedirect("https://www.baidu.com");
}