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成功";
    }
}
相关推荐
一只叫煤球的猫1 小时前
写代码很6,面试秒变菜鸟?不卖课,面试官视角走心探讨
前端·后端·面试
bobz9652 小时前
tcp/ip 中的多路复用
后端
bobz9652 小时前
tls ingress 简单记录
后端
皮皮林5513 小时前
IDEA 源码阅读利器,你居然还不会?
java·intellij idea
你的人类朋友3 小时前
什么是OpenSSL
后端·安全·程序员
bobz9653 小时前
mcp 直接操作浏览器
后端
前端小张同学6 小时前
服务器部署 gitlab 占用空间太大怎么办,优化思路。
后端
databook6 小时前
Manim实现闪光轨迹特效
后端·python·动效
武子康7 小时前
大数据-98 Spark 从 DStream 到 Structured Streaming:Spark 实时计算的演进
大数据·后端·spark
该用户已不存在7 小时前
6个值得收藏的.NET ORM 框架
前端·后端·.net