springMVC-4-处理模型数据

返回模型数据(Model)

index.jsp中

<h1>获取模型数据</h1>
<a href="/model/test1">ModelAndViews</a>
</html>

control中

  • springMVC会把ModelAndView的model数据放入到requestScope(请求域)
@Controller
@RequestMapping("model")
public class Model {
    @RequestMapping(value = "test1")
    public ModelAndView test1(){
        //创建模型
        String viewName = new String("ModelAndViews");
        ModelAndView modelAndView = new ModelAndView(viewName);
        //给模型添加数据
        modelAndView.addObject("message","wangwang");
        //把模型返回
        return modelAndView;
    }
}

ModelAndViews.jsp

<body>
模型数据:${message}
</body>

//因为:会封装成一个map,所以还可以改成
<body>
模型数据:${requestScope.message}
</body>

返回模型数据(Map)

control

@RequestMapping(value = "test2")
public String test2(Map<String, Object> map){
    map.put("username","wangwang");
    return "ModelAndViews";
}

modelAndViews.jsp

<h1>返回map数据</h1>
map数据:${requestScope.username}

@SessionAttributes把数据放置到session域对象中

@SessionAttributes 除了可以通过属性名指定需要放到会 话中的属性外,还可以通过模型属性的对象类型指定哪些 模型属性需要放到会话中

比如:@SessionAttributes(value = {"user"},types = {String.class})表示键为user的数据会被放到session中去,String类型的数据也会被放到session中获取

  • value属性:表名那个值会被放到session域对象中
  • type属性:表明哪种类型的值会被放到session域对象中

这个注解只能放到类的上面

control

@RequestMapping(value = "test3")
public String test3(Map<String, Object> map){
    User user = new User("wang","12344","qq.com");
    map.put("user",user);
    map.put("school","jainxi");
    return "ModelAndViews";
}

modelAndViews.jsp

<h1>返回session域对象</h1>

request域对象:${requestScope.user}<br>
String类型request数据类型:${sessionScope.school}<br>
session域对象:${sessionScope.user}<br>
String类型session数据类型:${sessionScope.school}

@ModelAttribute填充更新数据

先拦截请求,然后通过请求id从数据库中填充User对象,然后再执行更新(覆盖请求)

index.jsp

<%--模拟修改操作,
  1、原始数据:1,tom,123456,tom@qq.com,20
  2、密码不能被修改
  3、表单回显,模拟操作直接在表单填写对应的属性值--%>
<form action="/model/test4" method="post">
  <input type="hidden" name="id" value="1">
  username:<input type="text" name="username" value="Tom"><br>
  email:<input type="text" name="email" value="tom@qq.com"><br>
  <input type="submit" value="提交">
</form>

control

@RequestMapping(value = "test4")
public String test4(User user){
    System.out.println(user);
    return "ModelAndViews";
}
//比requestMapping先一步获取到请求(拦截器)
//1、获取到传入的id,并通过id在数据库中获取到User对象
//2、然后把这个User对象放到map中
//3、然后再转到RequestMapping中去,用后来得到的数据覆盖原有对象
@ModelAttribute(value = "test4")
public void getUser(@RequestParam(value="id",required = false) Integer id,Map<String, Object> map){
    User tom = new User(1, "Tom", "123456", "tom@qq.com");
    map.put("user",tom);
}
  • 该注解可以修饰目标方法POJO类型的入参,其value属性值作用:
    • springmvc会使用value属性值再implicitModel中查找对应的对象,若存在则会直接传入到目标的入参中
    • springmvc会将value为key,POJO类型的对象为value,存入到request

@ModelAttribute修饰入参

@RequestMapping(value = "test4")
public String test4(User user){
    System.out.println(user);
    return "ModelAndViews";
}

这段程序的作用是

1、创建一个新的POJO

2、把这个POJO装到request域中(且键key会自动变成类名的开头小写,即user)

@ModelAttribute就是用来自定以这个键名字的

我们先用modelAttribute在request域中放置一个键为tom,值为user对象的键值对

@ModelAttribute
public void getUser(@RequestParam(value="id",required = false) Integer id,Map<String, Object> map){
    User tom = new User(1, "Tom", "123456", "tom@qq.com");
    map.put("tom",tom);
}

我们在RequestMapping中也传入一个POJO

  • 使用了注解为这个POJO有一个键名,叫tom
  • springmvc会先从request域中去找tom为键的键值对
  • springmvc就会去sessionAttribute中tom为键的键值对(当找不到就会报错)
    • 如果找到了就会进行覆盖操作
    • 如果没有找到,会再创建一个新的
@RequestMapping(value = "test4")
public String test4(@ModelAttribute("tom") User user){
    System.out.println(user);
    return "ModelAndViews";
}

@SessionAttribute注解报错

了解@ModelAttribute修饰入参内部会做什么

  • 使用了注解为这个POJO有一个键名,叫tom
  • springmvc会先从request域中去找tom为键的键值对
  • springmvc就会去sessionAttribute中tom为键的键值对(当发现sessionAttribute中有这个键值,但是这个键值其实还没有存放东西就会报错)
    • 如果找到了就会进行覆盖操作
    • 如果没有找到,会再创建一个新的

解决方法:

1、我们让@ModelAttribute修饰的那个POJO名字不要和@SessionAttribute中存的键名不要一致即可

2、用@ModelAttribute修饰的方法在request域中就放一个tom对象

@ModelAttribute
public void getUser(@RequestParam(value="id",required = false) Integer id,Map<String, Object> map){
    User tom = new User(1, "Tom", "123456", "tom@qq.com");
    map.put("tom",tom);
}
posted @ 2021-06-07 16:12  Coder-Wang  阅读(62)  评论(0编辑  收藏  举报