Spring MVC(下)

简介: Spring MVC(下)

🧊3.2.5 重命名后端参数


当前端传递过来的时候名字和后端程序员想起的名字不一样,这个时候可以采用重命名的方式,使用注解@RequestParam

e615962f8a33498abc067c30c357fbe6.png


这里意味着前端传递过来的参数是n,后端不想用n,起名用了name,但是在浏览器的URL上必须用n,不然会报错

有一个问题,为什么其他的不传参数时不会报错,这里就会报错?

是因为这个@RequestParam的源码

a7b313b7088c4af78f505b0efd677490.png


required这里,默认必须有参数,我们改一下

当不传参数的时候,不会报错


🧊3.2.6@RequestBody接收JSON对象


对于前端来说,对象和json对象是两个不同的概念,对象对于前端来说就是一些属性 ,最后后端返回给前端的时候就是json,当前端传递的是json时,返回的时候拿不到结果了,我们拿postman验证一下

0dce506dfb1f4730910556bfe6bc5d8c.png


点击发送根本拿不到了,打开fiddler抓包工具看看

那么后端要咋样获取前端的json对象呢?


   @RequestMapping("/transjson")
    public User transjson(@RequestBody User user){
        return user;
    }
}

采用@RequestBody 这个注解

拿到了

再抓包看看


5bc4a45fa2a64de882c94b71f0969329.png


没有问题,我们也可以发现前端传递json对象时返回的格式也是json对象


🧊3.2.7获取URL参数


不采用querystring的方法获取属性,而是跟在路由之后,/后跟,采用@PathVariable注解,来举个例子


 /**
     * 以获取文章id为例
     */
    @RequestMapping("/article/{id}")
    public Integer article(@PathVariable("id") Integer aid){
        return aid;
    }

4ab0322af4b044e5b644133aa9da4d5d.png

ec721b7b4f8e46eca426596cf45b95f0.png


但是注意,当自定义的名字和注解或者和路由注解的名字一样的时候,就可以省略@PathVariable后面的括号


@RequestMapping("/article/{aid}")
    public Integer article2(@PathVariable Integer aid){
        return aid;
    }

d9aaabaa879745aa8735d066c03e86c9.png

340ea0e4965847b2af9cae0e67a30769.png

看到返回的依然还是json对象

当要获取URL的多个参数时,这样写


    @RequestMapping("/article/{aid}/{name}")
    public String  article2(@PathVariable Integer aid,@PathVariable String name){
        return "id"+aid+"name"+name;
    }


2b05ae0434624045a0767f7104d3dff8.png

🧊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;
    }


ad25566a5e5a4308bb0ea9b873816e47.png

1767cf4f84e64b3390c598e263ba7e62.png

每一次地址都不一样,图片命名也不一样,不会被覆盖

UUID是全球唯一id,等于MAC地址+随机种子+加密算法,是一个十六进制三十二位的数


🧊3.2.9获取Cookie


使用注解@CookieValue


 @RequestMapping("/getcookie")
    public String getcookie(@CookieValue("java") String cookie){
                return cookie;
    }

7217fb9d27eb4cabb7c10f2a690abb85.png


什么都没有获取到就会报错,

因为它的源码也是默认有参数,我们设定一下,就不会报错了

a4141a49ce114f26ae7a336b8564e9b8.png


现在来设定一下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;
    }

3bb68edf3bf141ec921b0a40bab9211f.png


🍬3.3返回数据


🧊3.1返回静态页面


当默认情况下只加@Controller注解的时候,返回的是一个静态页面

@Controller
public class TestController {
    @RequestMapping("/hi")
    public String hi(){
        return "hello";
    }
}

a29ced22cbc443d8ada16fd2e628a51e.png


8bce203e519648429acebec47f9ae924.png


这个代码默认情况下返回的是hello.html页面,在resources下没有找到这个页面,所以报错

在static下创建一个hello.html


@Controller
public class TestController {
    @RequestMapping("/hi")
    public String hi(){
        return "hello.html";
    }
}

229eb2b39bfc478e8a418f007465b538.png

返回的是静态页面的结果,如果想要打印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;
    }

85dc6f966d654cf1846ef593a6338585.png

🧊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发送一个新的请求。因此,如果需要传递大量的数据,使用重定向不是一个好的选择。

在请求转发过程中,数据可以在服务器之间共享,因为请求仍然是相同的请求,并且在服务器之间传递。因此,如果需要传递大量的数据,使用请求转发可能更加有效。


今天的讲解就到这里.下期见,拜拜~

相关文章
|
19天前
|
缓存 前端开发 Java
【Java面试题汇总】Spring,SpringBoot,SpringMVC,Mybatis,JavaWeb篇(2023版)
Soring Boot的起步依赖、启动流程、自动装配、常用的注解、Spring MVC的执行流程、对MVC的理解、RestFull风格、为什么service层要写接口、MyBatis的缓存机制、$和#有什么区别、resultType和resultMap区别、cookie和session的区别是什么?session的工作原理
【Java面试题汇总】Spring,SpringBoot,SpringMVC,Mybatis,JavaWeb篇(2023版)
|
6天前
|
XML 缓存 前端开发
springMVC02,restful风格,请求转发和重定向
文章介绍了RESTful风格的基本概念和特点,并展示了如何使用SpringMVC实现RESTful风格的请求处理。同时,文章还讨论了SpringMVC中的请求转发和重定向的实现方式,并通过具体代码示例进行了说明。
springMVC02,restful风格,请求转发和重定向
|
2月前
|
Java 数据库连接 Spring
后端框架入门超详细 三部曲 Spring 、SpringMVC、Mybatis、SSM框架整合案例 【爆肝整理五万字】
文章是关于Spring、SpringMVC、Mybatis三个后端框架的超详细入门教程,包括基础知识讲解、代码案例及SSM框架整合的实战应用,旨在帮助读者全面理解并掌握这些框架的使用。
后端框架入门超详细 三部曲 Spring 、SpringMVC、Mybatis、SSM框架整合案例 【爆肝整理五万字】
|
2月前
|
XML JSON 数据库
SpringMVC入门到实战------七、RESTful的详细介绍和使用 具体代码案例分析(一)
这篇文章详细介绍了RESTful的概念、实现方式,以及如何在SpringMVC中使用HiddenHttpMethodFilter来处理PUT和DELETE请求,并通过具体代码案例分析了RESTful的使用。
SpringMVC入门到实战------七、RESTful的详细介绍和使用 具体代码案例分析(一)
|
2月前
|
前端开发 应用服务中间件 数据库
SpringMVC入门到实战------八、RESTful案例。SpringMVC+thymeleaf+BootStrap+RestFul实现员工信息的增删改查
这篇文章通过一个具体的项目案例,详细讲解了如何使用SpringMVC、Thymeleaf、Bootstrap以及RESTful风格接口来实现员工信息的增删改查功能。文章提供了项目结构、配置文件、控制器、数据访问对象、实体类和前端页面的完整源码,并展示了实现效果的截图。项目的目的是锻炼使用RESTful风格的接口开发,虽然数据是假数据并未连接数据库,但提供了一个很好的实践机会。文章最后强调了这一章节主要是为了练习RESTful,其他方面暂不考虑。
SpringMVC入门到实战------八、RESTful案例。SpringMVC+thymeleaf+BootStrap+RestFul实现员工信息的增删改查
|
2月前
|
JSON 前端开发 Java
Spring MVC返回JSON数据
综上所述,Spring MVC提供了灵活、强大的方式来支持返回JSON数据,从直接使用 `@ResponseBody`及 `@RestController`注解,到通过配置消息转换器和异常处理器,开发人员可以根据具体需求选择合适的实现方式。
94 4
|
2月前
|
XML 前端开发 Java
Spring MVC接收param参数(直接接收、注解接收、集合接收、实体接收)
Spring MVC提供了灵活多样的参数接收方式,可以满足各种不同场景下的需求。了解并熟练运用这些基本的参数接收技巧,可以使得Web应用的开发更加方便、高效。同时,也是提高代码的可读性和维护性的关键所在。在实际开发过程中,根据具体需求选择最合适的参数接收方式,能够有效提升开发效率和应用性能。
88 3
|
2月前
|
XML 前端开发 Java
Spring MVC接收param参数(直接接收、注解接收、集合接收、实体接收)
Spring MVC提供了灵活多样的参数接收方式,可以满足各种不同场景下的需求。了解并熟练运用这些基本的参数接收技巧,可以使得Web应用的开发更加方便、高效。同时,也是提高代码的可读性和维护性的关键所在。在实际开发过程中,根据具体需求选择最合适的参数接收方式,能够有效提升开发效率和应用性能。
89 2
|
3月前
|
前端开发 Java 应用服务中间件
我以为我对Spring MVC很了解,直到我遇到了...
所有人都知道Spring MVC是是开发的,却鲜有人知道Spring MVC的理论基础来自于1978 年提出MVC模式的一个老头子,他就是Trygve Mikkjel Heyerdahl Reenskaug,挪威计算机科学家,名誉教授。Trygve Reenskaug的MVC架构思想早期用于图形用户界面(GUI) 的软件设计,他对MVC是这样解释的。MVC 被认为是解决用户控制大型复杂数据集问题的通用解决方案。最困难的部分是为不同的架构组件想出好的名字。模型-视图-编辑器是第一个。
115 1
我以为我对Spring MVC很了解,直到我遇到了...
|
3月前
|
前端开发 Java API
Spring Boot 中的 MVC 支持
### Spring Boot 注解摘要 - **@RestController** - **@RequestMapping** - **@PathVariable** - **@RequestParam** - **@RequestBody**
28 2
下一篇
无影云桌面