Spring Web MVC入门(2)(请求1)

目录

请求

1.传递单个参数

2.传递多个参数

3.传递对象

4.后端参数重命名(后端参数映射)

非必传参数设置

5.传递数组


请求

访问不同的路径就是发送不同的请求.在发送请求时,可能会带一些参数,所以学习Spring的请求,主要是学习如何传递参数到后端及后端如何接收.

1.传递单个参数

接收单个参数,在Spring MVC中直接用方法中的参数就可以,比如:

java 复制代码
@RequestMapping("/User")
@RestController
public class UserController {
    @RequestMapping("/m1")
    public String method1(String name) {
        return "接收到参数name: " + name;
    }
}

使用浏览器发送请求并传参: http://127.0.0.1:8080/User/m1?name=helloSpring

可以看到后端程序正确拿到了name参数的值

如果参数不一致,是获取不到参数的.

**注意事项:**使用基本类型来接收参数时,参数必须传(除boolean类型外),否则会报500错误.

类型不匹配时,会报400错误.

2.传递多个参数

和接收多个参数一样,直接使用方法的参数接收即可.使用多个形参.

java 复制代码
@RequestMapping("/User")
@RestController
public class UserController {
    @RequestMapping("/m2")
    public String method1(String name,String password) {
        return "接收到参数name: " + name + "password: " + password; 
    }
}

使用浏览器发送请求并传参: http://127.0.0.1:8080/User/m2?name=helloSpring&password=1234

当有多个参数时,前后端进行参数匹配时,是以参数的名称进行匹配的,因此参数的位置是不影响后端获取参数的结果.

3.传递对象

如果参数比较多是,方法声明就需要有很多形参,并且后续每次新增一个参数,也需要修改方法声明.

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

java 复制代码
public class Person {
    private int id;
    private String name;
    private String password;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

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

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    @Override
    public String toString() {
        return "Person{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", password='" + password + '\'' +
                '}';
    }
}

传递对象代码实现:

java 复制代码
@RequestMapping("/User")
@RestController
public class UserController {
    public Object method3(Person p) {
        return p.toString();
    }
}

使用浏览器发送请求并传参:

http://127.0.0.1:8080/User/m3?id=1&name=lisi&pssword=1234

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

4.后端参数重命名(后端参数映射)

某些特殊情况下,前端传递的参数key和我们后端接收的key可以不一致,比如前端传递了一个time给后端,而后端是使用createtime字段来接受的,这样就会出现参数接收不到的情况,如果出现这种情况,我们就可以使用@RequestParam来重命名前后端的参数值

后端代码实现:

java 复制代码
@RequestMapping("/demo")
@RestController
public class demo1 {
    @RequestMapping("/m1")
    public Object method1(@RequestParam("time") String createtime) {
        return "接受到参数createtime: " + createtime;
    }
}

使用浏览器发送请求: http://127.0.0.1:8080/demo/m1?time=zhangsan

如果使用createtime进行参数传递呢?

访问: http://127.0.0.1:8080/demo/m1?createtime=zhangsan

可以得知:

1.使用@RequestParam进行参数传递时,请求参数只能和@RequestParam声明的名称一致,才能进行参数绑定和赋值.

2.使用@RequestParam进行参数重命名时,参数就变成了必传参数.

非必传参数设置

如果我们的实际业务前端的参数是一个非必传的参数,针对上述问题,如何解决呢?

先来了解下参数必传的原因,我们查看@RequestParam 注解的实现细节就可以发现端倪,注解实现如下:

java 复制代码
@Target({ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface RequestParam {
    @AliasFor("name")
    String value() default "";

    @AliasFor("value")
    String name() default "";

    boolean required() default true;

    String defaultValue() default "\n\t\t\n\t\t\n\ue000\ue001\ue002\n\t\t\t\t\n";
}

可以看到required的默认值为true,表示含义就是:该注解修饰的参数默认为必传

既然如此,我们可以通过设置@RequestParam中的required=false来避免不传递时报错,具体实现如下:

java 复制代码
@RequestMapping("/m1")
public class Demo2 {
    public Object method1(@RequestParam(value = "time",required = false) String createtime) {
        return "接收到参数: " + createtime;
    }
}

可以看到,添加required=false之后,time前面也加了key,变成了value="time"

注解属性赋值时,没有指明key的话,默认为value属性.

如果需要有多个属性进行赋值时,需要写上key

5.传递数组

Spring MVC可以自动绑定数组参数的赋值

后端实现代码:

java 复制代码
@RequestMapping("/test1")
public class test {
    @RequestMapping("/m1")
    public String method1(String[] arrayParam) {
        return Arrays.toString(arrayParam);
    }

使用浏览器发送请求:

http://127.0.0.1:8080/test1/m1?arrayParam=zhangsan&arrayParam=lisi

可以看到后端对数组参数进行了正确的接收和响应

相关推荐
java水泥工17 分钟前
基于Echarts+HTML5可视化数据大屏展示-图书馆大屏看板
前端·echarts·html5
半夏陌离21 分钟前
SQL 实战指南:电商订单数据分析(订单 / 用户 / 商品表关联 + 统计需求)
java·大数据·前端
子兮曰23 分钟前
🚀Vue3异步组件:90%开发者不知道的性能陷阱与2025最佳实践
前端·vue.js·vite
牛十二33 分钟前
mac-intel操作系统go-stock项目(股票分析工具)安装与配置指南
开发语言·前端·javascript
whysqwhw40 分钟前
Kuikly 扩展原生 API 的完整流程
前端
whysqwhw42 分钟前
Hippy 跨平台框架扩展原生自定义组件
前端
zzywxc78742 分钟前
AI在金融、医疗、教育、制造业等领域的落地案例(含代码、流程图、Prompt示例与图表)
人工智能·spring·机器学习·金融·数据挖掘·prompt·流程图
OEC小胖胖1 小时前
页面间的导航:`<Link>` 组件和 `useRouter`
前端·前端框架·web·next.js
faimi1 小时前
🚀程序员必收藏!最全Git命令手册:解决90%团队协作难题
前端·gitlab
coooliang2 小时前
【鸿蒙 NEXT】V1迁移V2状态管理
java·前端·harmonyos