• SpringMVC之数据传递二


    上一篇学习了从url或view中传数据到Controller中,今天学习下数据从Controller传到view中,主要有4种。

    一、ModelAndView

    处理方法返回值类型为 ModelAndView时, 方法体即可通过该对象添加模型数据。

        @RequestMapping(value = "/testModelAndView",method = RequestMethod.GET)
        public ModelAndView testModelAndView(HttpServletRequest request, HttpServletResponse response){
            
            String viewName = "Hello";//视图名
            ModelAndView modelAndView = new ModelAndView(viewName);
            User user=new User();
            user.setName("cuiyw");
            user.setPwd("testModelAndView");
            user.setBirthday(new Date());
            modelAndView.addObject("name","cyw");
            modelAndView.addObject("user",user);
            return modelAndView;
        }

    二、Model/Map/ModelMap

    入参为org.springframework.ui.Model、org.springframework.ui.ModelMap 或 Java.uti.Map 时,处理方法返回时,Map中的数据会自动添加到模型中

        @RequestMapping(value = "/testModel.do",method = RequestMethod.GET)
        public String testModel(Model model){
              User user=new User();
              user.setName("cuiyw");
              user.setPwd("testModel");
              user.setBirthday(new Date());
              model.addAttribute("name","cyw");
              model.addAttribute("user",user);
              return "Hello";
        }
    
        @RequestMapping(value = "/testMap.do",method = RequestMethod.GET)
        public String testMap(Map<String,Object> map){
              User user=new User();
              user.setName("cuiyw");
              user.setPwd("testMap");
              user.setBirthday(new Date());
              map.put("name","cyw");
              map.put("user",user);
              return "Hello";
        }

    上面两个我们都可以使用下面的html访问变量。

    <%@ page language="java" contentType="text/html; charset=utf-8"
        pageEncoding="utf-8"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <title>Insert title here</title>
    </head>
    <body>
    姓名:${user.name}<br>
    密码:${user.pwd}<br>
    出生日期:${user.birthday}<br>
    名字:${name}<br>
    名字:${requestScope.name}<br>
    姓名:${requestScope.user.name}<br>
    </body>
    </html>

    三、@SessionAttributes

     将模型中的某个属性暂存到HttpSession 中,以便多个请求之间可以共享这个属性,比如我们登录之后可能会存登录信息,就可以使用它。@SessionAttributes这个注解只能放到类的上面。

    @SessionAttributes({"user"})
    @Controller
    @RequestMapping("/hello")
    public class HelloController {

    这里我们将上面的user存到HttpSession中,我们可以在jsp中验证一下。

    这里我们在html中加入SessionAttributes:${sessionScope.user.name}。

    <%@ page language="java" contentType="text/html; charset=utf-8"
        pageEncoding="utf-8"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <title>Insert title here</title>
    </head>
    <body>
    姓名:${user.name}<br>
    密码:${user.pwd}<br>
    出生日期:${user.birthday}<br>
    名字:${name}<br>
    名字:${requestScope.name}<br>
    姓名:${requestScope.user.name}<br>
    SessionAttributes:${sessionScope.user.name}
    </body>
    </html>
    View Code

    当我们访问http://localhost:8080/WebMVC/hello/testModelAndView时,jsp输出结果如下.

    下面定义了一个testSessionAttributes,它里面什么都没有,只有返回Hello。当我们再访问它时http://localhost:8080/WebMVC/hello/testSessionAttributes.do,会有下图的结果。可以看到jsp中名字部分是没有值得,因为@SessionAttributes({"user"}),这只设置了user,对name没设置。

        @RequestMapping(value = "/testSessionAttributes.do",method = RequestMethod.GET)
        public String testSessionAttributes(HttpServletRequest request, HttpServletResponse response){
              return "Hello";
        }

     四、@ModelAttribute

    SpringMVC在每次调用请求处理方法时,都会创建Model类型的一个实例。如果准备使用此实例,则可以在方法中添加一个Model类型的参数,在上面的testModel方法就是这样使用的。它可以用@ModelAttribute来注释方法参数:带有@ModelAttribute注解的方法会将其输入或创建的参数对象添加到Model对象中(若方法中没有显式添加)。也可以用@ModelAttribute标注一个非请求的处理方法(有返回值,无返回值):被@ModelAttribute注释的方法会在此controller每个方法执行前被执行。

    1.@ModelAttribute注释方法参数

        @RequestMapping(value = "/testModelAttribute.do",method = RequestMethod.GET)
        public String testModelAttribute(HttpServletRequest request, HttpServletResponse response,@ModelAttribute("user")User user,@ModelAttribute("name")String name,Model model){
              user.setName("cuiyw");
              user.setPwd("testModelAttribute");
              user.setBirthday(new Date());
              name="testModelAttribute";
              model.addAttribute("name", name);
              return "Hello";
        }

    这里有个奇怪的地方,假如不传name的话,model也可以不用写在参数中,在函数中设置user的值在页面就能获取到,但是如果传入String类型的参数,那它就需要加入model这个参数,并要显示的设置才能在jsp中获取,这个暂时还不知道为什么。

    2.@ModelAttribute标注一个非请求的处理方法

    由于被@ModelAttribute注释的方法会在此controller每个方法执行前被执行。我们可以做个测试。

    1)、有返回值

    这里定义了一个map方法,并被标注为 @ModelAttribute(value = "mymap"),返回值是Map<String,Object>,在函数里面我们设置了user和name.

        @RequestMapping(value = "/testSessionAttributes.do",method = RequestMethod.GET)
        public String testSessionAttributes(HttpServletRequest request, HttpServletResponse response){
              return "Hello";
        }
        
        @ModelAttribute(value = "mymap")
        public Map<String,Object> map() {
          User user=new User();
          user.setName("cuiyw");
          user.setPwd("ModelAttribute");
          user.setBirthday(new Date());
          HashMap<String, Object> map=new HashMap<String, Object>();
          map.put("name","cyw");
          map.put("user",user);
          return map;
        }
        
        
        @RequestMapping(value = "/testMethodModelAttribute.do",method = RequestMethod.GET)
        public String testModelAttribute(HttpServletRequest request, HttpServletResponse response){
              return "Hello";
        }

    我们在页面获取值,这里要注意,其实在 map()方法中是省略了一句,model.addAttribute("mymap", map);它对应的是mymap,所以在jsp中不能直接访问user和name。需要通过mymap来访问,我们之前设置的@SessionAttributes({"user"})这里也就不会有值了。

    <%@ page language="java" contentType="text/html; charset=utf-8"
        pageEncoding="utf-8"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <title>Insert title here</title>
    </head>
    <body>
    姓名:${mymap.user.name}<br>
    密码:${mymap.user.pwd}<br>
    出生日期:${mymap.user.birthday}<br>
    名字:${mymap.name}<br>
    名字:${requestScope.mymap.name}<br>
    姓名:${requestScope.mymap.user.name}<br>
    SessionAttributes:${sessionScope.user.name}
    </body>
    </html>

    如果我们想将里面的user设置为sessionAttribute,我们可以@SessionAttributes({"user","mymap"}),SessionAttributes:${sessionScope.mymap.user.name}来获取。

    2)、无返回值

     若方法返回一个void类型,则还必须自行将实例添加到Model中。

        @ModelAttribute
        public void voidmap(Model model) {
          User user=new User();
          user.setName("cuiyw3");
          user.setPwd("ModelAttribute3");
          user.setBirthday(new Date());
          HashMap<String, Object> map=new HashMap<String, Object>();
          map.put("name","cyw3");
          map.put("user",user);
          model.addAttribute("mymap",map);
        }

  • 相关阅读:
    docker映射端口无法访问
    Tomcat日志分析
    linux服务器性能测试
    mysql库表结构对比工具
    网络基础知识,不懂看这里
    Python之redis、mysql进程守护
    linux文件查找工具
    nginx解决跨域问题
    redis插入单个较大的键值
    linux系统安全巡检脚本
  • 原文地址:https://www.cnblogs.com/5ishare/p/8849429.html
Copyright © 2020-2023  润新知