SpringMVC模型数据解析

前提是你 提交于 2020-03-01 15:52:13

模型数据解析
我们通过JSP表单在客户端页面提交了一个对象信息,再将该对象信息显示在客户端页面上,这就是模型数据解析。

JSP的四大作用域对应的内置对象
pageContext、request、session、application
模型数据能够绑定到requeat、seesion、application三个对象中,下面代码会一一实现。在绑定模型数据之前,我们先写一个view.jsp,用来提交我们的模型数据。

模型数据的绑定是由ViewResolver来完成的,在实际开发中,我们需要先添加模型数据,再交给ViewResolver来绑定。

SpringMVC提供了以下几种方式添加模型数据

  • Map
  • Model
  • ModelAndView
  • @SessionAttribute
  • @ModelAttribute

(1)将模型数据绑定到request对象
1、Map
业务方法

@RequestMapping("/map")
public String map(Map<String,User> map){
    User user = new User();
    user.setId(1L);
    user.setName("张三");
    map.put("user",user);
    return "view";  //将逻辑视图,通过ModelAndView解析成物理视图
}

JSP

<%--
  Created by IntelliJ IDEA.
  User: ASUS
  Date: 2020/2/29
  Time: 22:54
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!--不要忽略EL表达式,不加这个,可能无法解析$el表达式-->
<%@ page isELIgnored="false" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    ${requestScope.user}
</body>
</html>

2、Model
业务方法

@RequestMapping("/model")
public String model(Model model){
    User user = new User();
    user.setId(1L);
    user.setName("张三");
    model.addAttribute("user",user);
    return "view";
}

3、ModelAndView
业务方法(由于ModelAndView的含参数构造有很多,所以可以写出很多中功能一样的业务方法,他们的本质是一样的)

@RequestMapping("modelAndView")
public ModelAndView modelAndView(){
    User user = new User();
    user.setId(1L);
    user.setName("张三");
    ModelAndView modelAndView = new ModelAndView();
    modelAndView.addObject("user",user);
    modelAndView.setViewName("view");
    return modelAndView;
}

@RequestMapping("modelAndView2")
public ModelAndView modelAndView2(){
    User user = new User();
    user.setId(1L);
    user.setName("张三");
    ModelAndView modelAndView = new ModelAndView();
    modelAndView.addObject("user",user);
    View view = new InternalResourceView("/view.jsp");
    modelAndView.setView(view);
    return modelAndView;
}

@RequestMapping("modelAndView3")
public ModelAndView modelAndView3(){
    User user = new User();
    user.setId(1L);
    user.setName("张三");
    ModelAndView modelAndView = new ModelAndView("view");
    modelAndView.addObject("user",user);
    return modelAndView;
}

@RequestMapping("modelAndView4")
public ModelAndView modelAndView4(){
    User user = new User();
    user.setId(1L);
    user.setName("张三");
    View view =  new InternalResourceView("/view.jsp")
    ModelAndView modelAndView = new ModelAndView(view);
    modelAndView.addObject("user",user);
    return modelAndView;
}

@RequestMapping("modelAndView5")
public ModelAndView modelAndView5(){
    User user = new User();
    user.setId(1L);
    user.setName("张三");
    Map<String,User> map = new HashMap<>();
    map.put("user",user);
    ModelAndView modelAndView = new ModelAndView("view", map);
    return modelAndView;
}

@RequestMapping("modelAndView6")
public ModelAndView modelAndView6(){
    User user = new User();
    user.setId(1L);
    user.setName("张三");
    Map<String,User> map = new HashMap<>();
    map.put("user",user);
    View view = new InternalResourceView("/view.jsp");
    ModelAndView modelAndView = new ModelAndView(view,map);
    return modelAndView;
}

@RequestMapping("modelAndView7")
public ModelAndView modelAndView7(){
    User user = new User();
    user.setId(1L);
    user.setName("张三");
    ModelAndView modelAndView = new ModelAndView("view","user",user);
    return modelAndView;
}

@RequestMapping("modelAndView8")
public ModelAndView modelAndView8(){
    User user = new User();
    user.setId(1L);
    user.setName("张三");
    View view = new InternalResourceView("/view.jsp");
    ModelAndView modelAndView = new ModelAndView(view,"user",user);
    return modelAndView;
}

4、HttpServletRequest
业务方法

@RequestMapping("/request")
public String request(HttpServletRequest request){
    User user = new User();
    user.setId(1L);
    user.setName("张三");
    request.setAttribute("user",user);
    return "view";
}

5、@ModelAttribute
定义一个方法,该方法专门用来返回要填充到模型数据的对象
@ModelAttribute注解的方法总是在业务方法执行之前执行

/**
 * 该方法用来返回模型数据的对象
 * @ModelAttribute 该注解注解的方法总是在返回视图的业务方法之前执行
 */
@ModelAttribute
public User getUser(){
    User user = new User();
    user.setId(1L);
    user.setName("张三");
    return user;
}

@ModelAttribute
public void getUser(Map<String,User> map){
    User user = new User();
    user.setId(1L);
    user.setName("张三");
    map.put("user",user);
}

@ModelAttribute
public void getUser(Model model){
    User user = new User();
    user.setId(1L);
    user.setName("张三");
    model.addAttribute("user",user);
}

业务方法

/**
 * 业务方法无需处理模型数据,只需要返回视图即可
 * @return
 */
@RequestMapping("/modelAttribute")
public String modelAttribute(){
    return "view";
}

(2)将模型数据绑定到session对象
1、直接使用原生的ServletAPI

@RequestMapping("/session")
public String session(HttpServletRequest request){
    HttpSession session = request.getSession();
    User user = new User();
    user.setId(1L);
    user.setName("张三");
    session.setAttribute("user",user);
    return "view";
}

@RequestMapping("/session2")
public String session2(HttpSession session){
    User user = new User();
    user.setId(1L);
    user.setName("张三");
    session.setAttribute("user",user);
    return "view";
}

2、@SessionAttribute
对于ViewHandler中的所有业务方法,只要向request中添加了key=“user”、key="address"的对象时,SpringMVC会自动将该数据添加到session中,保持key不变。

/**
 * 对于 ViewHandler 中的所有业务⽅法,只要向 request 中添加了
 * key = "user"、key = "address" 的对象时,Spring MVC 会⾃动将该数据添加到 session 中,保存 key 不变。
 */
@SessionAttributes(value = {"user","address"})
public class ViewHandler(){
}

对于 ViewHandler 中的所有业务⽅法,只要向 request 中添加了数据类型是 User 、Address 的对象
时,Spring MVC 会⾃动将该数据添加到 session 中,保存 key 不变。

/**
 * 对于 ViewHandler 中的所有业务⽅法,只要向 request 中添加了
 * 数据类型是 User 、Address 的对象时,Spring MVC 会⾃动将该数据添加到 session 中,保存 key 不变。
 */
@SessionAttributes(types = {User.class,Address.class})
public class ViewHandler1 {
}

(3)将模型数据绑定到 application 对象


@RequestMapping("/application")
public String application(HttpServletRequest request){
 ServletContext application = request.getServletContext();
 User user = new User();
 user.setId(1L);
 user.setName("张三");
 application.setAttribute("user",user);
 return "view"; }
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!