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";
  }
相关推荐
xlsw_3 分钟前
java全栈day20--Web后端实战(Mybatis基础2)
java·开发语言·mybatis
神仙别闹1 小时前
基于java的改良版超级玛丽小游戏
java
黄油饼卷咖喱鸡就味增汤拌孜然羊肉炒饭1 小时前
SpringBoot如何实现缓存预热?
java·spring boot·spring·缓存·程序员
暮湫2 小时前
泛型(2)
java
超爱吃士力架2 小时前
邀请逻辑
java·linux·后端
南宫生2 小时前
力扣-图论-17【算法学习day.67】
java·学习·算法·leetcode·图论
转码的小石2 小时前
12/21java基础
java
李小白662 小时前
Spring MVC(上)
java·spring·mvc
GoodStudyAndDayDayUp2 小时前
IDEA能够从mapper跳转到xml的插件
xml·java·intellij-idea
装不满的克莱因瓶3 小时前
【Redis经典面试题六】Redis的持久化机制是怎样的?
java·数据库·redis·持久化·aof·rdb