Spring MVC前后端数据交互

目录

一、URL地址映射配置

(1)单个URL

(2)多个URL

(3)URL映射的请求方式

(4)参数名称映射URL

二、参数传递(前端到后端)

1.简单类型

[2.JavaBean 类型](#2.JavaBean 类型)

3.List集合

三、JSON数据

@Requestbody

@ResponseBody

四、参数传递(后端到前端)

1.request对象

2.ModelAndView

3.ModelMap

4.Model

5.Map


一、URL地址映射配置

@RequestMapping:通过注解 @RequestMapping 将请求地址与⽅法进⾏绑定,可以在类级别和⽅法级别声明。

类级别的注解负责将⼀个特定的请求路径映射到⼀个控制器上,将 url 和类绑定;⽅法级别的注解可以细化映射,能够将⼀个特定的请求路径映射到某个具体的⽅法上,将 url 和类的⽅法绑定。

(1)单个URL

@RequestMapping("请求路径") 或 @RequestMapping(value="请求路径")

java 复制代码
@Controller
public class HelloController {
@RequestMapping("/hello")
    public ModelAndView hello(){
        //得到模型和视图对象
        ModelAndView modelAndView = new ModelAndView();
        //设置数据模型
        modelAndView.addObject("hello","Hello SpringMVC");
        //设置视图(名称)
        modelAndView.setViewName("hello");
        //返回模型和视图
        return modelAndView;
    }
}

注意:

  • 访问地址:http://ip:port/类路径/hello;
  • 路径开头是否加斜杠"/"均可;
  • @RequestMapping 声明在类上⾯,类中的的⽅法都是以该地址作为⽗路径

hello.jsp视图:

java 复制代码
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<!--获取数据模型-->
    ${hello}
</body>
</html>

(2)多个URL

@RequestMapping({" "," "}) 或 @RequestMapping(value={" "," "})

java 复制代码
@RequestMapping({"/test03_01","/test03_02"})

(3)URL映射的请求方式

默认没有设置请求⽅式,在HTTP 请求中最常⽤的请求⽅法是 GET、POST,还有其他的⼀些⽅法, 如:DELET、PUT、HEAD 等。通过 method 属性设置⽀持的请求⽅式,如method=RequestMethod.POST;如设置多种请求⽅式,以⼤括号包围,逗号隔开即可。

java 复制代码
@RequestMapping(value = "/test05",method = RequestMethod.POST)

(4)参数名称映射URL

java 复制代码
@RequestMapping(params = "test06")

访问地址:

http://ip:port/类路径?test06

二、参数传递(前端到后端)

@RequestParam

在方法入参处使用@RequestParam注解指定其对应的请求参数。

|-----------------|---------------------------------------|
| @RequestParam参数 | 描述 |
| name | 设置参数别名 |
| required | 是否必需;默认true,表示请求中必须包含对应的参数名。若不存在将抛出异常 |
| defaultValue | 默认参数名。不推荐使用 |

1.简单类型

如基本数据类型,包装类以及字符串类:

java 复制代码
@RequestParam(defaultValue = "18", name = "userAge") int age,
@RequestParam(defaultValue = "10.0", name = "userMoney") double money

包装类和字符串类当客户端请求参数名与⽅法形参名要保持⼀致,默认参数值为null

2.JavaBean 类型

创建一个对象,让这些参数都成为这个对象的属性,SpringMVC就会将前端传来的这些参数的名称与我们指定的对象(Java Bean)的属性进行名称的对比,如果一致,那么就进行赋值。

java 复制代码
@Data
public class User{
	private int id;
	private int age;
	private String name;
	private String birthday;
	private String school;
	private String city;
	private String area;
	private double salary
}

Controller层中代码:

java 复制代码
@RequestMapping("/bean")
    public String testBean(User user){
       System.out.println(user);
    }

SpringMVC底层将请求中的参数剥离出来,然后调用指定的这个对象(Java Bean)的setter方法来为同名的属性进行赋值,当我们用的时候,直接使用getter方法来用。

访问地址:

http://ip:port/类路径?id=1&age=18&name=zhangsan

3.List集合

以List集合参数类型接收前端传来的参数,其实就是将前端传来的参数在后端Controller中自动进行类型的转换,转换成Java中的List集合类型来存储前端传来的参数。想要springmvc自动将接收的参数转换成List集合类型,需要将List集合定义在Java Bean中,对于集合的参数绑定,⼀般需要使⽤ JavaBean 对象进⾏包装。Set集合与List集合类似。

User实体类中定义List属性:

java 复制代码
@Data
public class User {
 private int id;
 private String userName;
 private String userPwd;
 private List<Phone> phones = new ArrayList<Phone>();
}

Phone实体:

java 复制代码
public class Phone {
 private String num;
 public String getNum() {
 return num;
 }
 public void setNum(String num) {
 this.num = num;
 }
 @Override
 public String toString() {
 return "Phone [num=" + num + "]";
 } 
}

JSP页面定义:

java 复制代码
<form action="data08" method="post">
 <input name="phones[0].num" value="123456" />
 <input name="phones[1].num" value="4576" />
 <button type="submit"> 提交</button>
</form>

Controller层方法:

java 复制代码
@RequestMapping("/list")
public void data08(User user){
 System.out.println(user);
}

三、JSON数据

@Requestbody

该注解⽤于读取 Request 请求的 body 部分数据,使⽤系统默认配置的 HttpMessageConverter 进⾏解析,然后把相应的数据绑定到要返回的对象上 ,再把 HttpMessageConverter 返回的对象数据绑定到 controller 中⽅法的参数上。@RequestBody接受的是⼀个 json 格式的字符串,⼀定是⼀个字符串。

@ResponseBody

该注解⽤于将 Controller 的⽅法返回的对象,通过适当的 HttpMessageConverter 转换为指定格式后, 写⼊到 Response 对象的 body 数据区。@ResponseBody可以放在方法体上,也可以放在方法返回对象前。

java 复制代码
@ResponseBody
public User getUser(@RequestBody User user){
 System.out.println(user);
 return user;
}

四、参数传递(后端到前端)

进行模型数据的处理,控制层(Controller)是为了生产模型数据(Model),而视图(View)最终也是为了渲染模型数据并进行输出。那么如何将模型数据传递给视图,则是Spring MVC框架的一项重要工作。

输出数据模型方式:

1.request对象

这种方式是最传统的方式,直接向request域中进行参数的传递,通过setAttribute()方法,来指定key和value,即可在前端页面model.jsp中直接获取到request域中的内容。

java 复制代码
 @RequestMapping("model04")
    public String model04(HttpServletRequest request){
        //设置请求域
        request.setAttribute("hello","Hello Request");
        return "model";
    }

model.jsp

java 复制代码
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
    <head>
        <title>Hello</title>
    </head>
    <body>
        <h2>${hello}</h2>
    </body>
</html>

2.ModelAndView

控制器处理方法的返回值若为ModelAndView,则既包含视图 信息,又包含模型数据信息。

Spring MVC独有的ModelAndView对象,通过声明一个ModelAndView类型的对象,就可以使用这个对象来传值或者是指定跳转的页面路径。采用addObject()方法,来规定key和value,即可在前端页面中根据key拿取到对应value的值。通过采用setViewName()方法,来传入一个页面的名称,springmvc底层的视图解析器就会将ModelAndView中的view视图进行前缀和后缀的拼接加工,并给最终的页面跳转路径。当然,这里执行方法的返回类型需要是ModelAndView类型,方法最终需要将modelAndView对象返回 。

java 复制代码
    @RequestMapping("model03")
    public ModelAndView model03(){
        ModelAndView modelAndView = new ModelAndView("model");
        //添加数据模型 
        //第一个参数为key值,第二个参数为key对应的value。key值可以随意指定
        modelAndView.addObject("hello","Hello SpringMVC");
        //设置视图名称
        modelAndView.setViewName("/user/index")
        return modelAndView;
    }

3.ModelMap

ModelMap对象与request对象相似,可以采用addAttribute()方法来传递参数,向ModelMap对象中添加key和value,其实就是在向request域中添加key和value,只不过ModelMap是又将request进行了一层封装,原因是彻底与Servlet的内容分离,仅用SpringMVC的对象,就可以完成对request域的赋值。

java 复制代码
  @RequestMapping("model06")
    public String model06(ModelMap modelMap){
        //设置请求域
        modelMap.addAttribute("hello","Hello ModelMap");
        return "model";
    }

4.Model

Controller处理方法使用Model对象入参,把需要传递的模型数据放入Model中即可,返回字符串类型的逻辑视图名;在页面就可以直接使用EL表达式**${}**,即可获得数值。

Model的addAttribute方法与ModelAndView对象添加模型数据的方法用法都是一样的,即Model对象也是一个Map类型的数据结构,并且对于key值的指定,其实并不是必须的。

java 复制代码
    @RequestMapping("model05")
    public String model05(Model model){
        //Spring MVC会自动实例化一个Model对象用于向视图中传值
        model.addAttribute("hello","Hello Model");
        return "model";
    }

5.Map

声明一个Map集合,并使用put()传递key和value,就可以被springmvc解析成向request域中传递值。底层就是使用request.setAttribute()在赋值。而无需引入request对象,仅仅使用一个简单的map集合,就可以完成对request对象的操作。彻底与Servlet解耦。在jsp页面中可直通过${hello}获得到值Hello Map。

java 复制代码
@RequestMapping("model07")
    public String model07(Map map){
    map.put("hello","Hello Map");
    return "model";
  }
相关推荐
李慕婉学姐6 小时前
【开题答辩过程】以《基于JAVA的校园即时配送系统的设计与实现》为例,不知道这个选题怎么做的,不知道这个选题怎么开题答辩的可以进来看看
java·开发语言·数据库
奋进的芋圆8 小时前
Java 延时任务实现方案详解(适用于 Spring Boot 3)
java·spring boot·redis·rabbitmq
sxlishaobin8 小时前
设计模式之桥接模式
java·设计模式·桥接模式
model20058 小时前
alibaba linux3 系统盘网站迁移数据盘
java·服务器·前端
荒诞硬汉9 小时前
JavaBean相关补充
java·开发语言
提笔忘字的帝国9 小时前
【教程】macOS 如何完全卸载 Java 开发环境
java·开发语言·macos
2501_941882489 小时前
从灰度发布到流量切分的互联网工程语法控制与多语言实现实践思路随笔分享
java·开发语言
華勳全栈9 小时前
两天开发完成智能体平台
java·spring·go
alonewolf_999 小时前
Spring MVC重点功能底层源码深度解析
java·spring·mvc
沛沛老爹10 小时前
Java泛型擦除:原理、实践与应对策略
java·开发语言·人工智能·企业开发·发展趋势·技术原理