Spring Web MVC入门

目录

[一、建立连接(@ResquestMapping- 实现URL路由映射)](#一、建立连接(@ResquestMapping- 实现URL路由映射))

二、发送请求

1、传递单个参数

2、传递多个参数

3、传递对象

4、后端参数重命名(后端参数映射)(@RequestParam)

[5、非必传参数的设置(required = false)](#5、非必传参数的设置(required = false))

5、传递数组

6、传递集合

7、传递JSON数据

JSON是什么

语法:

两种结构

JSON字符串和Java对象互转

JSON优点

[后端实现(@RequestBody )](#后端实现(@RequestBody ))

8、获取URL中参数(@PathVariable)

9、上传文件(@RequestPart)

10、获取Cookie/Session

获取Cookie

获取Session

11、获取Header

三、响应

1、返回静态页面

2、返回数据

3、返回HTML片段

4、返回JSON

​编辑

5、设置状态码

6、设置Content-Type

7、设置Header


SpringWeb MVC是基于Servlet API构建的原始Web框架

Servlet是一种实现动态页面的技术,准确来讲Servlet是一套Java Web开发的规范,或者说是一套Java Web开发的技术标准

MVC,即Model View Controller,它是软件工程中的一种软件架构模式,他把软件系统分为模型、视图和控制器三个部分

Spring MVC框架:

一、建立连接(@ResquestMapping- 实现URL路由映射)

java 复制代码
@RestController
public class HelloController {
    @RequestMapping("/hello")
    public String hello(){
        return "hello,SpringBoot";
    }
}

在Spring MVC中使用 @ResquestMapping 来实现URL路由映射,也就是浏览器连接程序的作用

@ResquestMapping既可以修饰类,也可以修饰方法

  • 标识一个类:设置映射请求路径的初始信息
  • 标识一个方法:设置映射请求的请求路径的具体信息
  • 修饰类和方法:访问的地址是类路径+方法路径

@ResquestMapping 的URL路径最前面加不加 / 都可以,Spring程序启动时,会进行判断,如果前面没有加 / ,Spring会拼接上一个 / 。通常情况下,我们加上 /;

@ResquestMapping的URL路径也可以是多层路径,最终访问时,依然是类路径+方法路径;

@ResquestMapping既支持GET请求,又支持POST请求,同理也支持其他请求方式;

浏览器发送的请求类型默认为GET

路由映射:当用户访问一个URL时,将用户的请求对应到程序中的某个类的某个方法的过程

  • 可以显式指定@ResquestMapping来指定GET/POST方法类型
java 复制代码
@RestController
public class UserController {
 @RequestMapping(value = "/getRequest",method= RequestMethod.POST)
 public String sayHi(){
 return "get request...";
 }
}

二、发送请求

URL格式如下:

1、传递单个参数

java 复制代码
 @RequestMapping("/r1")
    public String r1(String name){
        return "接收到参数 name:"+name;
    }

如果参数传递与后端不一致是获取不到参数的

关于参数传递错误的状态码情况

  • 使用基本类型来接收参数时,参数必须传(除boolean类型外),否则会报500错误;
  • 类型不匹配时会报400错误;
  • 在企业开发中对于参数可能会空的数据,建议使用包装类型

2、传递多个参数

当有多个参数时,前后端进行参数匹配时,是以参数的名称进行匹配的

java 复制代码
@RequestMapping("/r2")
    public String r1(String name,int age){
        return "姓名:"+name+"年龄:"+age;
    }

3、传递对象

如果参数比较多时,方法声明就需要有很多形参,并且后续每次新增一个参数,也需要修改方法声明。不妨把这些参数封装为一个对象

Spring MVC可以自动实现参数的赋值,比如下面的Person对象:

java 复制代码
public class User {
    private String name;
    private int age;
    private String sex;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", sex='" + sex + '\'' +
                '}';
    }
}
java 复制代码
  @RequestMapping("/r3")
    public String r1(User user){
        return user.toString();
    }

4、后端参数重命名(后端参数映射)(@RequestParam)

Spring会根据参数名称自动绑定到对象的各个属性上,如果某个属性未传递,则赋值为null(基本类型赋值为初始值)

java 复制代码
 @RequestMapping("/r4")
    public String r4(@RequestParam("name") String username){
        return "接收到的参数 username:"+username;
    }

5、非必传参数的设置(required = false)

在4中使用@RequestParam进行参数重命名后,此时的参数就为必传参数,若此时发送请求时再不进行传递则状态码会为400

可以设置required = false设置为非必传参数

java 复制代码
 @RequestMapping("/r5")
    public String r5(@RequestParam(value = "name",required = false) String username){
        return "接收到的参数 username:"+username;
    }

5、传递数组

一般URL格式:

  • 127.0.0.1:8080/r6?arr=1,2,3
  • 127.0.0.1:8080/r6?arr=1&arr=2&arr=3
  • 127.0.0.1:8080/r6?arr=1%2c2%2c3
java 复制代码
 @RequestMapping("/r6")
    public String r6(String[] arr){
        return Arrays.toString(arr);
    }

6、传递集合

集合参数和数组类似,同一个请求参数名有多个,且需要使用@RequestParam绑定参数关系

默认情况下,请求中参数名相同的多个值是封装到数组;如果要再封装到集合,则要使用@RequestParam来绑定参数关系

同样的使用@RequestParam进行参数重命名后,此时的参数就为必传参数;并且如果不传参还会导致空指针异常

java 复制代码
 @RequestMapping("/r7")
    public String r7(@RequestParam(value = "list",required = false) List<String> list){
        if (list==null){//若未传递参数list,还会报空指针异常
            return "list为空";
        }
        return list.toString()+"size:"+list.size();
    }

7、传递JSON数据

JSON是什么

JSON,JavaScript Object Notation(JavaScript对象表示法),但二者没有关系

JSON采用一种轻量级的数据交互格式,基于ECMAScript的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据

简单来说,JSON就是一种数据格式,有自己的格式和语法,使用文本表示一个对象或数组的信息,因此JSON本质是一个字符串,主要负责在不同语言中数据传递和交换

JSON在线解析及格式化验证

语法:
  • 数据在键值对(Key/Value)中
  • 数据由逗号分隔
  • 对象由 { } 表示;数组由 [ ] 表示
  • 值可以为对象,也可以为数组,数组中可以包含多个对象
两种结构
  • 对象:大括号 { } 保存的对象是一个无序的键值对集合
  • 数组:中括号 [ ] 保存的数组是值的有序集合
JSON字符串和Java对象互转

JSON本质上是一个字符串,通过文本来存储和描述数据

Spring MVC框架也集成了JSON的转换工具,我们可以直接使用来完成JSON字符串和Java对象的互转

使用ObjectMapper对象提供的两个方法,可以完成对象和JSON字符串的互转

  • writeValueAsString:把对象转为JSON字符串
  • readValue:把字符串转为对象
java 复制代码
 public static void main(String[] args) throws JsonProcessingException {
        ObjectMapper objectMapper=new ObjectMapper();
        User user=new User();
        user.setName("张三");
        user.setAge(18);
        user.setSex("男");

        //对象转JSON
        String s=objectMapper.writeValueAsString(user);
        System.out.println(s);//{"name":"张三","age":18,"sex":"男"}

        //JSON字符串转Java对象
        User user1=objectMapper.readValue(s,User.class);
        System.out.println(user1);//User{name='张三', age=18, sex='男'}
    }
JSON优点
  • 简单易用:语法简单,易于理解和编写,可以快速进行数据交换
  • 跨平台支持:JSON可以被多种编程语言解析和生成,可以在不同的平台和语言之间进行数据交换和传输
  • 轻量级:相较于XML格式,JSON数据格式更加轻量级,传输数据时占用宽带较小,可以提高传输速度
  • 易于扩展:JSON的数据结构 灵活,支持嵌套对象和数组等复杂的数据结构,便于扩展和使用
  • 安全性:JSON数据格式是一种纯文本格式,不包含可执行代码,不会执行恶意代码,因此具有较高的安全性

基于以上特点,JSON在Web应用程序中被广泛使用,如前后端数据交互、API接口数据传输等

接收JSON对象,需要使用 @RequestBody 注解

后端实现(@RequestBody )
java 复制代码
 @RequestMapping("/r8")
    public String r8(@RequestBody User user){
      return user.toString();
    }

为了确保JSON对象能够正确反序列化为Java对象,提供一个无参构造方法是非常重要的。

若你已提供了一个有参的构造方法,记得再加上无参构造方法(有了有参后就不会再默认调用无参)

8、获取URL中参数(@PathVariable)

path variable 即路径变量,这个注解主要作用在请求URL路径上的数据绑定

  • 如果方法参数名称和需要绑定的URL中的变量名称不一致则需要@PathVariable的属性value赋值(重命名)
  • 利用@PathVariable传参是必传参数

参数对应关系如下:

9、上传文件(@RequestPart)

java 复制代码
@RequestMapping("/r11")
    public String r11(@RequestPart("file")MultipartFile file) throws IOException {
        //获取文件名称
        String fileName= file.getOriginalFilename();
        //文件上传到指定路径
        file.transferTo(new File("E:/temp1/"+fileName));
        return "接收到的文件名称为:"+fileName;
    }

10、获取Cookie/Session

Session默认是保存在内存中的,如果重启服务器则Session数据就会丢失

Cookie和Session的区别:

  • Cookie是客户端保存用户信息的一种机制,Session是服务器保存用户信息的一种机制
  • Cookie和Session之间主要是通过SessionId关联起来的,Session是Cookie和Session之间的桥梁
  • Cookie和Session经常会在一起配合使用,但是不是必须配合。完全可以用Cookie来保存一些数据在客户端,这些数据在客户端,这些数据不一定是用户身份信息,也不一定是SessionId;Session中的sessionId也不需要非得通过Cookie/Set-Cookie传递,比如通过URL传递
获取Cookie
java 复制代码
//获取所有Cookie 
    @RequestMapping("/getCookie")
    public String getCookie(HttpServletRequest request){
        //获取所有Cookie信息
        Cookie[] cookies=request.getCookies();
        //打印所有Cookie信息
        if (cookies!=null){
            Arrays.stream(cookies).forEach(x-> System.out.println(x.getName()+":"+x.getValue()));
            return "获取Cookie成功";
        }

        /*for (Cookie c:cookies) {
            System.out.println(c.getName()+":"+c.getValue());
        }*/
        return "Cookie为空";
    }

//获取指定名称的Cookie
    @RequestMapping("/getCookie2")
    public String getCookie2(@CookieValue("bite") String bite){
        return "bite:"+bite;
    }
获取Session
java 复制代码
 @RequestMapping("/setSession")
    public String SetSession(HttpServletRequest request){
        HttpSession session=request.getSession();
        session.setAttribute("username","颤三");
        return "设置Session成功";
    }

    @RequestMapping("/getSession")
    public String GetSession(HttpServletRequest request){
        HttpSession session=request.getSession();
        String username=(String)session.getAttribute("username");
        return "用户名字:"+username;
    }
    @RequestMapping("/getSession1")
    public String GetSession1(HttpSession session){
        String username=(String)session.getAttribute("username");
        return "用户名字:"+username;
    }
    @RequestMapping("/getSession2")
    public String GetSession2(@SessionAttribute(value = "username",required = false) String username){
        return "用户名字:"+username;
    }

11、获取Header

java 复制代码
 @RequestMapping("/getHeader")
    public String GetHeader(HttpServletRequest request){
        String userAgent=request.getHeader("User-Agent");
        return  "userAgent"+userAgent;
    }

    @RequestMapping("/getHeade2")
    public String GetHeader2(@RequestHeader("User-Agent") String userAgent){
        return  "userAgent"+userAgent;
    }

三、响应

1、返回静态页面

java 复制代码
@RequestMapping("/return")
@Controller
public class ReturnController {
    @RequestMapping("r1")
    public String r1(){
        return "/index.html";
    }
}

2、返回数据

java 复制代码
@RequestMapping("/return")
@Controller
public class ReturnController {
        @ResponseBody //返回数据 @RestController=@Controller+@ResponseBody
        @RequestMapping("r2")
        public String r2(){
            return "hello,spring";
        }
}

3、返回HTML片段

java 复制代码
@RequestMapping("/return")
@Controller
public class ReturnController {
    @ResponseBody
    @RequestMapping("r3")
    public String r3(){
        return "<h1>hello,spring</h1>";
    }
}

4、返回JSON

java 复制代码
@RequestMapping("/return")
@Controller
public class ReturnController {
    @ResponseBody
    @RequestMapping("r4")
    public User r4(){
        User user=new User();
        user.setName("张三");
        user.setAge(17);
        user.setSex("女");
        return user;
    }
}
java 复制代码
@RequestMapping("/return")
@Controller
public class ReturnController {
    @ResponseBody
    @RequestMapping("/r5")
    public Map<String,String> r5(){
        HashMap map=new HashMap();
        map.put("k1","v1");
        map.put("k2","v2");
        return map;
    }
}
java 复制代码
@RequestMapping("/return")
@Controller
public class ReturnController {
    @RequestMapping("/r6")
    public String r6(){
        return "/a.css";
    }
}
java 复制代码
@RequestMapping("/return")
@Controller
public class ReturnController {
    @RequestMapping("/r7")
    public String r7(){
        return "/b.js";
    }
}

可以看出Spring会根据我们返回的结果,动态设置response的Content-Type

5、设置状态码

状态码的设置不影响页面显示,所以即便状态码设置失败也不会影响页面

java 复制代码
@RequestMapping("/return")
@Controller
public class ReturnController {
     @ResponseBody
    @RequestMapping("/r8")
    public String r8(HttpServletResponse response){
        response.setStatus(401);
        return "设置状态吗成功";
    }
}

6、设置Content-Type

java 复制代码
@RequestMapping("/return")
@Controller
public class ReturnController {
    @ResponseBody
    @RequestMapping("/r9",produces = "application/json")
// @RequestMapping("/r9",produces = "application/json;charset=utf8") 也可以同步设置编码
    public String r9(){
        return "OK:1";
    }
}

7、设置Header

java 复制代码
@RequestMapping("/return")
@Controller
public class ReturnController {
     @ResponseBody
    @RequestMapping("/r10")
    public String r10(HttpServletResponse response){
        response.setHeader("myHeader","myHeaderValue");
        return "设置Header成功";
    }
}
相关推荐
求知若饥7 分钟前
NestJS 项目实战-权限管理系统开发(六)
后端·node.js·nestjs
禁默36 分钟前
深入浅出:AWT的基本组件及其应用
java·开发语言·界面编程
Cachel wood43 分钟前
python round四舍五入和decimal库精确四舍五入
java·linux·前端·数据库·vue.js·python·前端框架
Code哈哈笑1 小时前
【Java 学习】深度剖析Java多态:从向上转型到向下转型,解锁动态绑定的奥秘,让代码更优雅灵活
java·开发语言·学习
gb42152871 小时前
springboot中Jackson库和jsonpath库的区别和联系。
java·spring boot·后端
程序猿进阶1 小时前
深入解析 Spring WebFlux:原理与应用
java·开发语言·后端·spring·面试·架构·springboot
zfoo-framework1 小时前
【jenkins插件】
java
风_流沙1 小时前
java 对ElasticSearch数据库操作封装工具类(对你是否适用嘞)
java·数据库·elasticsearch
颜淡慕潇1 小时前
【K8S问题系列 |19 】如何解决 Pod 无法挂载 PVC问题
后端·云原生·容器·kubernetes