[SpringMVC]请求响应参数传递

controller前置url解决业务重名

在项目中,常常会碰到不同的业务之间的某个方法同名的情况。例如在一个文档管理系统(有着文档和发布者两个实体)中,两个实体都有着 "add" 业务。如果两个实体相关的业务url都用 "/add" ,会导致服务器无法确认是哪一个导致报错。

解决的方法就是在两个业务的控制器类前加一个前置url:

java 复制代码
package controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

@Controller
@RequestMapping("/text")//前置url
public class Text {
    @RequestMapping("/add")
    public String test1(@RequestParam("username") String username, @RequestParam("password") String password) {
        if(username.equals("liu") && password.equals("123")) {
            System.out.println("添加成功");
            return "success";
        }
        return "failure";
    }
}

请求体数据

这些controller类就类似javaweb中的Servlet类。控制器类会自动将请求体中的有关数据处理后作为方法的参数(可以理解为servlet类中使用session获取请求参数),而return的数据则作为返回数据。

响应的数据

controller类中的方法返回的数据,如果仅仅使用了@Controller注解,会默认你返回的是一个视图,也就是.jsp、.html等网页源代码文件,比如返回一个字符串 "login",tomcat服务器从后端拿到数据后会返回给客户端/login.jsp。

如果你想将return的数据转化为响应体中的数据来进行返回,那么需要在方法前面额外添加@ResponseBody注解

java 复制代码
@RequestMapping("/test2")
    @ResponseBody
    public String test2(@RequestParam("name") String string,int age, User user) {
        System.out.println(string);
        System.out.println(age);
        System.out.println(user.getName());
        System.out.println(user.getAge());
        return "failure";
    }

当作为响应体数据时,mvc默认会自动将各种数据(包括实体类)转换为json格式。

传参

常见的字符串和数值类型

请求体中的参数名与方法列表中一致时,SpringMVC会自动识别,不需要额外操作。

当请求体方法中的参数名与方法参数列表不一致时, 需要额外使用**@RequestParam**注解指明绑定请求体中的参数。该注解用来指定将 哪一个传递过来的参数 赋值给 使用了该注解的业务参数。

实体类参数

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

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

如果业务方法里需要的参数是个实体类,MVC会自动将传递过来的参数创建一个实体类对象,但是前提是请求体中传递来的参数要和实体类中的属性同名,且该实体类的属性有访问途径。

如果实体类参数中还有实体类参数,那么请求体中的参数应为 父类中实体类属性名.子属性实体类的属性名:

实体类:

java 复制代码
public class Student {
    private String name;
    private User user;

    public String getName() {
        return name;
    }

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

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }
}

接收集合类型数据

对于集合类型数据,我们要使用@RequestParam注解告诉MVC,把该对象作为集合来处理,而不是一个普通的实体类对象。

json格式数据

如果要接收json数据,我们需要引入解析json的相关包:

XML 复制代码
	<dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version></version>
    </dependency>

然后我们需要在springMVC配置类中使用注解@EnableWebMvc开启相关功能。

同时因为json的数据在body中,我们需要在业务方法的参数列表中使用@RequestBody注解:

日期类型参数

当日期类型的格式是年/月/日这种时,只需要用Date类对象接收即可。

但是当格式是年-月-日这种时,就需要用注解@DateTimeFormat(pattern = "指定格式")来进行处理才不会报错:

相关推荐
Danny_FD10 分钟前
Vue + Element UI 实现模糊搜索自动补全
前端·javascript
空影学Java15 分钟前
Day44 Java数组08 冒泡排序
java
gnip15 分钟前
闭包实现一个简单Vue3的状态管理
前端·javascript
斐济岛上有一只斐济21 分钟前
后端程序员的CSS复习
前端
Enddme24 分钟前
《面试必问!JavaScript 中this 全方位避坑指南 (含高频题解析)》
前端·javascript·面试
有梦想的程序员25 分钟前
微信小程序使用 Tailwind CSS version 3
前端
程序员编程指南41 分钟前
Qt 与 WebService 交互开发
c语言·开发语言·c++·qt·交互
追风少年浪子彦44 分钟前
mybatis-plus实体类主键生成策略
java·数据库·spring·mybatis·mybatis-plus
赵英英俊1 小时前
Python day26
开发语言·python
你怎么知道我是队长1 小时前
python---eval函数
开发语言·javascript·python