🧊3.2.5 重命名后端参数
当前端传递过来的时候名字和后端程序员想起的名字不一样,这个时候可以采用重命名的方式,使用注解@RequestParam
这里意味着前端传递过来的参数是n,后端不想用n,起名用了name,但是在浏览器的URL上必须用n,不然会报错
有一个问题,为什么其他的不传参数时不会报错,这里就会报错?
是因为这个@RequestParam的源码
required这里,默认必须有参数,我们改一下
当不传参数的时候,不会报错
🧊3.2.6@RequestBody接收JSON对象
对于前端来说,对象和json对象是两个不同的概念,对象对于前端来说就是一些属性 ,最后后端返回给前端的时候就是json,当前端传递的是json时,返回的时候拿不到结果了,我们拿postman验证一下
点击发送根本拿不到了,打开fiddler抓包工具看看
那么后端要咋样获取前端的json对象呢?
@RequestMapping("/transjson") public User transjson(@RequestBody User user){ return user; } }
采用@RequestBody 这个注解
拿到了
再抓包看看
没有问题,我们也可以发现前端传递json对象时返回的格式也是json对象
🧊3.2.7获取URL参数
不采用querystring的方法获取属性,而是跟在路由之后,/后跟,采用@PathVariable注解,来举个例子
/** * 以获取文章id为例 */ @RequestMapping("/article/{id}") public Integer article(@PathVariable("id") Integer aid){ return aid; }
但是注意,当自定义的名字和注解或者和路由注解的名字一样的时候,就可以省略@PathVariable后面的括号
@RequestMapping("/article/{aid}") public Integer article2(@PathVariable Integer aid){ return aid; }
看到返回的依然还是json对象
当要获取URL的多个参数时,这样写
@RequestMapping("/article/{aid}/{name}") public String article2(@PathVariable Integer aid,@PathVariable String name){ return "id"+aid+"name"+name; }
🧊3.2.8上传文件
采用@RequestPart注解,Multipartfile接收
采用transferto方法保存到路径
package com.example.demo.controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestPart; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; import java.io.File; import java.io.IOException; /** * Created with IntelliJ IDEA. * Description: * User: WHY * Date: 2023-08-05 * Time: 8:43 */ @RestController @RequestMapping("/hhh") public class UserController { @RequestMapping("/upfile") public String upload(@RequestPart("myfile")MultipartFile file) throws IOException { String path="D:\\image\\img.png"; //保存文件 file.transferTo(new File(path)); return path; } }
上传文件的时候只能用post请求,因为get请求的文件流比较小,post支持的文件流比较大,上传文件的时候文件流是很大的
文件上传成功
但是我们保存的图片名字被限制了.根据上述代码假如有100个人上传图片,因为 名字一样,前99个被覆盖,还有可能用户上传的是一个视屏,后来存入格式命名为.png,这也是不对的,所以需要源文件的后缀名
public String upload(@RequestPart("myfile")MultipartFile file) throws IOException { //生成唯一id,采用UUID 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; }
每一次地址都不一样,图片命名也不一样,不会被覆盖
UUID是全球唯一id,等于MAC地址+随机种子+加密算法,是一个十六进制三十二位的数
🧊3.2.9获取Cookie
使用注解@CookieValue
@RequestMapping("/getcookie") public String getcookie(@CookieValue("java") String cookie){ return cookie; }
什么都没有获取到就会报错,
因为它的源码也是默认有参数,我们设定一下,就不会报错了
现在来设定一下cookie
🧊3.2.10获取Session
session来自于服务器,我们要先存session,才能取seesion
//存session public static String Sessionkey="session"; @RequestMapping("/setsession") public String setsession(HttpServletRequest request){ HttpSession session=request.getSession(); if(session!=null){ session.setAttribute("Sessionkey","王麻子"); return "success"; }else{ return "fail"; } }
获取session,采用注解@SessionAttribute
@RequestMapping("/getsession") public String getSessionkey(@SessionAttribute(value="Sessionkey",required = false)String session){ return session; }
结果
3.2.11 获取Header
采用@RequestHeader注解
@RequestMapping("/header") public String getheader(@RequestHeader("User-Agent") String userAgent){ return "userAgent"+userAgent; }
🍬3.3返回数据
🧊3.1返回静态页面
当默认情况下只加@Controller注解的时候,返回的是一个静态页面
@Controller public class TestController { @RequestMapping("/hi") public String hi(){ return "hello"; } }
这个代码默认情况下返回的是hello.html页面,在resources下没有找到这个页面,所以报错
在static下创建一个hello.html
@Controller public class TestController { @RequestMapping("/hi") public String hi(){ return "hello.html"; } }
返回的是静态页面的结果,如果想要打印hello.html这个语句,加注解@ResponseBody
🧊3.2返回json对象
@RequestMapping("/json") @ResponseBody public HashMap<String, String> method() { HashMap<String, String> map = new HashMap<>(); map.put("Java", "Java Value"); map.put("Oracle", "MySQL Value"); map.put("Spring", "Spring Value"); return map; }
🧊3.3请求转发VS请求重定向
举个例子:李华想吃辣条,告诉爸爸想吃辣条.爸爸有两种做法,第一种:可以选择帮李华去买
第二种;可以选择把钱给李华,让李华自己去买
第一种就叫做请求转发,也就是服务器帮着干
第二种就是请求重定向,也就是客户端自己跳转到另一个网址自己干
1.请求重定向(redirect):将请求重新定位到资源;
2.请求转发(forward)服务器端转发
3.请求重定向地址发⽣变化,请求转发地址不发⽣变化
4.请求重定向与直接访问新地址效果一样,不存在原来的外部资源不能访问;请求转发服务器端转发有可能造成原外部资源不能访问(对应上述的例子,李华自己买辣条知道自己口味,他爹买可能买不到李华喜欢的)
区别:
🐷处理方式不同:
重定向是通过将请求发送到另一个URL来完成的,客户端将收到一个新的响应,浏览器将向新的URL发出请求并在地址栏中显示新的URL。重定向是一种客户端行为,它是通过HTTP响应码实现的,例如302、307或303。
请求转发是在服务器上进行的,当服务器接收到请求并处理它时,它直接将请求发送到另一个资源(Servlet或JSP),该资源将处理并发送响应。请求转发对客户端是透明的,客户端只知道最初请求的URL,不知道服务器之间的转发操作。
🐷对浏览器地址栏的影响不同:
在重定向过程中,浏览器将会看到URL的变化,因为浏览器地址栏中将显示一个新的URL。这意味着即使用户保存旧URL,也不能保证它们仍然有效,因为它们将被重定向到新的URL。
在请求转发过程中,浏览器地址栏中显示的URL不会发生变化,因为客户端不知道服务器之间的转发操作。
🐷对数据传递的影响不同:
在重定向过程中,数据必须通过URL传递,因为浏览器会向新的URL发送一个新的请求。因此,如果需要传递大量的数据,使用重定向不是一个好的选择。
在请求转发过程中,数据可以在服务器之间共享,因为请求仍然是相同的请求,并且在服务器之间传递。因此,如果需要传递大量的数据,使用请求转发可能更加有效。
今天的讲解就到这里.下期见,拜拜~