SpringMVC-模型数据

  |   0 评论   |   0 浏览

SpringMVC-模型数据

1.模型数据处理-数据放入request

1.需求分析/图解

● 说明

开发中, 控制器/处理器中获取的数据如何放入 request 域,然后在前端(VUE/JSP/...)取出显示

● 应用实例需求

image-20220605102948400

image-20220605103005842

2.方式1:通过HttpServletRequest放入request域

  1. 创建\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";
}
  1. 创建\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.测试结果

image-20220605111751839

3.方式2:通过请求的方法参数 Map<String,Object>放入request域

  1. 修改 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.测试效果

image-20220605113233799

4.方式3:通过返回ModelAndView对象实现request域数据

  1. 修改 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>
  1. 修改 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.测试结果

image-20220608231532999

4.使用注意事项

  1. 从本质看,请求响应的方法 return "xx", 是返回了一个字符串,其实本质是返回了一个 ModelAndView 对象,只是默认被封装起来的.
  2. ModelAndView 即可以包含 model 数据,也可以包含视图信息
  3. ModelAndView 对象的 addObject 方法可以添加 key-val 数据,默认在 request 域中
  4. ModelAndView 对象 setView 方法可以指定视图名称

2.模型数据处理-数据放入session

1.需求分析/图解

● 说明 开发中, 控制器/处理器中获取的数据如何放入 session 域,然后在前端(VUE/JSP/...)取出显示

● 应用实例需求

image-20220608231902810

image-20220608231918948

2.应用实例

  1. 修改 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>
  1. 修改 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";//请求转发
}
  1. 修改 vote_ok.jsp , 增加代码
<hr>
取出 session域的数据 <br>
address: ${sessionScope.address}<br>
主人名字= ${sessionScope.master.name}
主人信息= ${sessionScope.master}
</body>

3.@ModelAttribute实现prepare方法

1.应用实例

● 基本说明 开发中,有时需要使用某个前置方法(比如 prepareXxx(), 方法名由程序员定)给目标方法准 备一个模型对象

  1. @ModelAttribute 注解可以实现 这样的需求
  2. 在某个方法上,增加了@ModelAttribute 注解后
  3. 那么在调用该 Handler 的任何一个方法时,都会先调用这个方法

● 应用实例

修改 VoteHandler.java, 增加方法 并测试

/**
 * 1. 当Handler的方法被标识 @ModelAttribute,就视为一个前置方法
 * 2. 当调用该Handler的其它的方法时,都会先执行该前置方法
 * 3. 类似我们前面讲解Spring时,AOP的前置通知[底层是AOP机制]
 * 4. prepareModel前置方法,会切入到其它方法前执行..
 */
@ModelAttribute
public void prepareModel(){
    System.out.println("prepareModel()-----完成准备工作-----");
}

image-20220608234052126

2.@ModelAttribute最佳实践

● 修改用户信息(就是经典的使用这种机制的应用),流程如下:

1.在修改前,在前置方法中从数据库查出这个用户

2.在修改方法(目标方法)中,可以使用前置方法从数据库查询的用户

3.如果表单中对用户的某个属性修改了,则以新的数据为准,如果没有修改,则以数据库 的信息为准,比如,用户的某个属性不能修改,就保持原来的值

使用场景

https://zhuanlan.zhihu.com/p/397778934


标题:SpringMVC-模型数据
作者:llp
地址:https://llinp.cn/articles/2022/06/09/1654742752021.html