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";
  }
相关推荐
不是二师兄的八戒20 分钟前
本地 PHP 和 Java 开发环境 Docker 化与配置开机自启
java·docker·php
爱编程的小生32 分钟前
Easyexcel(2-文件读取)
java·excel
带多刺的玫瑰1 小时前
Leecode刷题C语言之统计不是特殊数字的数字数量
java·c语言·算法
计算机毕设指导61 小时前
基于 SpringBoot 的作业管理系统【附源码】
java·vue.js·spring boot·后端·mysql·spring·intellij-idea
Gu Gu Study2 小时前
枚举与lambda表达式,枚举实现单例模式为什么是安全的,lambda表达式与函数式接口的小九九~
java·开发语言
Chris _data2 小时前
二叉树oj题解析
java·数据结构
牙牙7052 小时前
Centos7安装Jenkins脚本一键部署
java·servlet·jenkins
paopaokaka_luck2 小时前
[371]基于springboot的高校实习管理系统
java·spring boot·后端
以后不吃煲仔饭2 小时前
Java基础夯实——2.7 线程上下文切换
java·开发语言
进阶的架构师2 小时前
2024年Java面试题及答案整理(1000+面试题附答案解析)
java·开发语言