环境搭建
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 可以在储存数据的同时,可以进行设置返回的逻辑视图,进行控制展示层的跳转
当然更多的以后开发考虑的更多的是性能和优化,就不能单单仅限于此的了解。