SpringMVC-模型数据
SpringMVC-模型数据
1.模型数据处理-数据放入request
1.需求分析/图解
● 说明
开发中, 控制器/处理器中获取的数据如何放入 request 域,然后在前端(VUE/JSP/...)取出显示
● 应用实例需求
2.方式1:通过HttpServletRequest放入request域
- 创建\web\model_data.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>测试 模型数据</title>
</head>
<body>
<h1>添加主人信息</h1>
<form action="vote/vote05" method="post">
主人号:<input type="text" name="id"><br>
主人名:<input type="text" name="name"><br>
宠物号:<input type="text" name="pet.id"><br>
宠物名:<input type="text" name="pet.name"><br>
电话:<input type="text" name="phone"><br>
<input type="submit" value="添加主人和宠物">
</form>
</body>
</html>
2.修改 VoteHandler.java, 增加方法
/**
* 将提交的数据封装到一个对象中
* springmvc会自动的将其放入到request域
* @return
*/
@RequestMapping(value = "/vote05")
public String test05(Master master,HttpServletRequest request,String phone){
//1. springmvc会自动把获取的model模型,放入到request域中,名字就是master
System.out.println(master);
//2.springmvc默认存放对象到request域中,属性名是
//request域 ("master", master) 属性名是类名/类型名 首字母小写
//3.如果我们希望修改master的属性值
master.setName("llp");
//4.phone不是model模型所有不会被默认的存入到request域中
System.out.println(phone);
request.setAttribute("address","CH");
request.setAttribute("phone",phone);
return "vote_ok";
}
- 创建\web\WEB-INF\pages\vote_ok.jsp, 显示数据
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>vote_ok </title>
</head>
<body>
<h1>获取的的数据显示页面</h1>
<hr>
取出 request域的数据-通过前面讲解的el表达式来获取即可
<br>
address: ${requestScope.address}<br>
主人名字= ${requestScope.master.name}
主人id= ${requestScope.master.id}
宠物名字= ${requestScope.master.pet.name} ${master.pet.id}
电话=${requestScope.String} - ${requestScope.string} - ${requestScope.phone}
</body>
</html>
4.测试结果
3.方式2:通过请求的方法参数 Map<String,Object>放入request域
- 修改 model_data.jsp, 增加代码
<br/><hr/>
<h1>添加主人信息[测试 Map ]</h1>
<form action="vote/vote06" method="post">
主人号:<input type="text" name="id"><br>
主人名:<input type="text" name="name"><br>
宠物号:<input type="text" name="pet.id"><br>
宠物名:<input type="text" name="pet.name"><br>
<input type="submit" value="添加主人和宠物">
</form>
2.修改 VoteHandler.java, 增加方法
@RequestMapping(value = "/vote06")
public String test06(Master master, Map<String,Object> map){
//1. 需求是通过map对象,添加属性到request中
//2. 原理分析:springmvc会遍历map,然后将map的k-v, 存放到request域
map.put("address", "beijing...");
//3.如果这里map中设置了master的key会对master的值进行覆盖,这里设置为null则前台获取不到master的数据
//map.put("master", null);
//返回到一个结果
return "vote_ok";
}
3.vote_ok.jsp
<h1>获取的的数据显示页面</h1>
<hr>
取出 request域的数据-通过前面讲解的el表达式来获取即可
<br>
address: ${requestScope.address}<br>
主人名字= ${requestScope.master.name}
主人id= ${requestScope.master.id}
宠物名字= ${requestScope.master.pet.name}
4.测试效果
4.方式3:通过返回ModelAndView对象实现request域数据
- 修改 model_data.jsp, 增加代码
<br/><hr/>
<h1>添加主人信息[测试ModelAndView]</h1>
<form action="vote/vote07" method="post">
主人号:<input type="text" name="id"><br>
主人名:<input type="text" name="name"><br>
宠物号:<input type="text" name="pet.id"><br>
宠物名:<input type="text" name="pet.name"><br>
<input type="submit" value="添加主人和宠物">
</form>
- 修改 VoteHandler.java , 增加方法
/**
* 演示通过返回ModelAndView对象,将数据放入到request域
* @return
*/
@RequestMapping(value = "/vote07")
public ModelAndView test07(Master master) {
System.out.println("----test07----");
ModelAndView modelAndView = new ModelAndView();
//放入属性到modelAndView对象
modelAndView.addObject("address", "shanghai");
//modelAndView.addObject("master", null);
//可以把从数据库得到的数据->对象-》放入modelAndView[Service-dao-db]
//这里指定跳转的视图名称
modelAndView.setViewName("vote_ok");
//返回结果
return modelAndView;
}
3.测试结果
4.使用注意事项
- 从本质看,请求响应的方法 return "xx", 是返回了一个字符串,其实本质是返回了一个 ModelAndView 对象,只是默认被封装起来的.
- ModelAndView 即可以包含 model 数据,也可以包含视图信息
- ModelAndView 对象的 addObject 方法可以添加 key-val 数据,默认在 request 域中
- ModelAndView 对象 setView 方法可以指定视图名称
2.模型数据处理-数据放入session
1.需求分析/图解
● 说明 开发中, 控制器/处理器中获取的数据如何放入 session 域,然后在前端(VUE/JSP/...)取出显示
● 应用实例需求
2.应用实例
- 修改 model_data.jsp, 增加代码
<br/><hr/>
<h1>添加主人信息[测试session]</h1>
<form action="vote/vote08" method="post">
主人号:<input type="text" name="id"><br>
主人名:<input type="text" name="name"><br>
宠物号:<input type="text" name="pet.id"><br>
宠物名:<input type="text" name="pet.name"><br>
<input type="submit" value="添加主人和宠物">
</form>
- 修改 VoteHandler.java, 增加方法
/**
* 演示如何将数据设置到session域中
* @return
*/
@RequestMapping(value = "/vote08")
public String test08(Master master, HttpSession httpSession) {
System.out.println("----test08----");
//master对象是默认放在request域
//我们将master对象放入到session域
httpSession.setAttribute("master", master);
httpSession.setAttribute("address", "guangzhou");
return "vote_ok";//请求转发
}
- 修改 vote_ok.jsp , 增加代码
<hr>
取出 session域的数据 <br>
address: ${sessionScope.address}<br>
主人名字= ${sessionScope.master.name}
主人信息= ${sessionScope.master}
</body>
3.@ModelAttribute实现prepare方法
1.应用实例
● 基本说明 开发中,有时需要使用某个前置方法(比如 prepareXxx(), 方法名由程序员定)给目标方法准 备一个模型对象
- @ModelAttribute 注解可以实现 这样的需求
- 在某个方法上,增加了@ModelAttribute 注解后
- 那么在调用该 Handler 的任何一个方法时,都会先调用这个方法
● 应用实例
修改 VoteHandler.java, 增加方法 并测试
/**
* 1. 当Handler的方法被标识 @ModelAttribute,就视为一个前置方法
* 2. 当调用该Handler的其它的方法时,都会先执行该前置方法
* 3. 类似我们前面讲解Spring时,AOP的前置通知[底层是AOP机制]
* 4. prepareModel前置方法,会切入到其它方法前执行..
*/
@ModelAttribute
public void prepareModel(){
System.out.println("prepareModel()-----完成准备工作-----");
}
2.@ModelAttribute最佳实践
● 修改用户信息(就是经典的使用这种机制的应用),流程如下:
1.在修改前,在前置方法中从数据库查出这个用户
2.在修改方法(目标方法)中,可以使用前置方法从数据库查询的用户
3.如果表单中对用户的某个属性修改了,则以新的数据为准,如果没有修改,则以数据库 的信息为准,比如,用户的某个属性不能修改,就保持原来的值
使用场景