springMVC里前端与Controller之间数据交互的处理(接收数据、响应数据给客户端)

本文详细介绍了SpringMVC中处理用户提交数据的三种方式,包括参数名一致、不一致的情况及对象提交,并展示了如何在前端显示这些数据。通过ModelAndView、ModelMap和Model来传递数据到视图,并比较了它们的区别和使用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

环境搭建

在这里插入图片描述
pom.xml、springmvc-servlet.xml、web.xml的配置看https://blog.csdn.net/qq_45554909/article/details/110499687
index.jsp:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>$Title$</title>
  </head>
  <body>

  <form action="/06_DataDeal/dealData" method="get">
    <input type="text" name="name" id="name"><br/>
    <input type="submit" value="提交">
  </form>

  </body>
</html>

deal.jsp:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>

${msg}
</body>
</html>

1、处理提交数据

1、提交的域名称和处理方法的参数名一致

提交数据 : http://localhost:8080/dealData?name=Tom
处理方法 :

@Controller
public class DealDataController {


    //请求参数名和处理参数名一样的情况下,我们直接接收到前端传递的数据;
    //Model主要作用:为了给前端传递我们封装好的参数;
    @RequestMapping("/dealData")
    public String dealData(String name, Model model){

        model.addAttribute("msg",name);

        System.out.println(name);
        return "deal";
    }
}

结果:
在这里插入图片描述

2、提交的域名称和处理方法的参数名不一致

提交数据 : http://localhost:8080/dealData1?name=Tom
处理方法 :

//请求参数名和处理参数名不一样的情况下
    //状况:用户传递的参数名和我们要处理的参数名不一致,需要使用一个注解@RequestParam("name")来进行匹配
    @RequestMapping("/dealData1")
    public String dealData1(@RequestParam("name") String userName, Model model){

        model.addAttribute("msg",userName);

        System.out.println(userName);
        return "deal";
    }

3、提交的是一个对象

要求提交的表单域和对象的属性名一致 , 参数使用对象即可
1. 实体类

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
    
    private String name;
    private Integer age;
}
<form action="/06_DataDeal/dealData2" method="get">
    <input type="text" name="name" id="name"><br/>
    <input type="text" name="age" id="age"><br/>
    <input type="submit" value="提交">
  </form>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
${user.name}
${user.age}
</body>
</html>

2. 提交数据 : http://localhost:8080/06_DataDeal/dealData2?name=Tom&age=12
3. 处理方法 :

//如何传递一个对象
    //要求:提交表单的数据和对象的属性名一致;参数直接使用对象即可;否则按照上面方式处理
    //原理:接收到前端请求参数名,匹配你传递的对象的属性;如果属性OK,使用set方法赋值,否则使用默认值;
    @RequestMapping("/dealData2")
    public String dealData2(User user,Model model){

        model.addAttribute("msg",user);

        System.out.println(user);
        return "deal";
    }

说明:如果使用对象的话,前端传递的参数名和对象名必须一致,否则就是null

2、数据显示到前端

在了解这三者之前,需要知道一点:SpringMVC在调用方法前会创建一个隐含的数据模型,作为模型数据的存储容器, 成为”隐含模型”。
也就是说在每一次的前后台请求的时候会随带这一个背包,不管你用没有,这个背包确实是存在的,用来盛放我们请求交互传递的值

第一种 : 通过ModelAndView

ModelAndView其实就是两个作用,

  • 一个是指定返回页面,
  • 另一个是在返回页面的同时添加属性
  • Model只是用来传输数据的,并不会进行业务的寻址。ModelAndView 却是可以进行业务寻址的
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
        //ModelAndView 模型和视图        
        ModelAndView mv = new ModelAndView();
        //封装对象,放在ModelAndView中。Model        
        mv.addObject("msg","HelloSpringMVC!");
        //封装要跳转的视图,放在ModelAndView中        
        mv.setViewName("hello");
        //: /WEB-INF/jsp/hello.jsp        
        return mv;
    }

在前端向后台请求时,spring会自动创建Model与ModelMap实例,我们只需拿来使用即可;
在这里插入图片描述
无论是Mode还是ModelMap底层都是使用BindingAwareModelMap,所以两者基本没什么区别;
我们可以简单看一下两者区别:
①Model
Model是一个接口,它的实现类为ExtendedModelMap,继承ModelMap类

public class ExtendedModelMap extends ModelMap implements Model

②ModelMap
ModelMap继承LinkedHashMap,spring框架自动创建实例并作为controller的入参,用户无需自己创建

public class ModelMap extends LinkedHashMap

两者实际没有什么区别,当Model添加一个list就等同于ModelMap

第二种 : 通过ModelMap

ModelMap

    @RequestMapping("hello")
    public String hello(@RequestParam("username") String name, ModelMap modelMap){

        //封装要显示到视图中的数据    
        // 相当于req.setAttribute("name",name);
        modelMap.addAttribute("msg",name);
        System.out.println(name);
        return "deal";
    }
}

第三种 : 通过Model

Model

  @RequestMapping("hello1")
    public String hello1(@RequestParam("username") String name, Model model){

        //封装要显示到视图中的数据    
        // 相当于req.setAttribute("name",name);
        model.addAttribute("msg",name);
        System.out.println(name);
        return "deal";
    }

第四种,直接通过Map

    @RequestMapping(value = "/test3")
    public String test3(Map<String,Object> map){

//        存入数据
        map.put("msg","Hello");

        return "test1";
    }
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<div th:text="${msg}"/>

</body>
</html>

在这里插入图片描述

对比

就对于新手而言简单来说使用区别就是:

Model 只有寥寥几个方法只适合用于储存数据,简化了新手对于Model对象的操作和理解;

ModelMap 继承了 LinkedMap ,除了实现了自身的一些方法,同样的继承 LinkedMap 的方法和特 性;

ModelAndView 可以在储存数据的同时,可以进行设置返回的逻辑视图,进行控制展示层的跳转

当然更多的以后开发考虑的更多的是性能和优化,就不能单单仅限于此的了解。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值